| 题目 | 难度 | 知识点 |
|---|---|---|
| A 鲲 | ★ | 签到 |
| B 鹏 | ★ | 签到 |
| C 桃花 | ★ | 树的直径 |
| D 字符串丝带 | ★ | 模拟 |
| E 对弈 | ★ | 模拟 |
| F 发电 | ★★ | 树状数组 |
| G 指纹锁 | ★★ | 重载set |
| H 挖沟 | ★ | 最小生成树 |
| I 公交线路 | ★ | spfa |
| J 洋灰三角 | ★★ | 数学,推式子 |
鲲
只有一个可以作弊,且这是一个环,故返回的时候他们之间的距离还是要大于等于k
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
double l,k,a,b; cin>>l>>k>>a>>b;
double t1=l/a;
double t2=l/b;
if(a>b)//可以作弊
{
double t=k/(a-b);
if(l-t*2*a>=k) t2=min(t2,t*2);//且返回的时候距离仍大于k
}
printf("%.2lf",t2-t1);
}
鹏
将平缓的剔除掉,只留一个就很好判断了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int>ve;
int a[N],n,ans;
int main(void)
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
ve.push_back(a[0]);
for(int i=1;i<n;i++)
if(a[i]!=a[i-1]) ve.push_back(a[i]);
for(int i=1;i<ve.size()-1;i++)
{
if(ve[i]>ve[i-1]&&ve[i]>ve[i+1]) ans++;
}
cout<<ans;
return 0;
}
桃花
#include<bits/stdc++.h>
using namespace std;
const int N=1e6*2+10;
int h[N],e[N],ne[N],idx,d[N];
int n,m;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u,int fa,int w)
{
d[u]=w;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==fa) continue;
dfs(j,u,w+1);
}
}
int main(void)
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=n-1;i++)
{
int a,b; cin>>a>>b;
add(a,b),add(b,a);
}
dfs(1,-1,0);
int r=1;
for(int i=1;i<=n;i++) if(d[r]<d[i]) r=i;
memset(d,0,sizeof d);
dfs(r,-1,0);
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,d[i]);
cout<<ans+1;
return 0;
}
字符串丝带
#include<bits/stdc++.h>
using namespace std;
const int N=1e6*2+10;
int st[30],n,m,ans[N];
string s;
int main(void)
{
cin>>n>>m>>s;
s="0"+s;
for(int i=1;i<=n;i++)
{
st[s[i]-'a']++;
ans[s[i]-'a']=st[s[i]-'a'];
}
while(m--)
{
int op; cin>>op;
cout<<ans[op]<<'\n';
}
return 0;
}
对弈
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int st[N][N],n,m,x,y,o;
int f(int x,int y,int o)
{
st[x][y]=o;
int stx=x,edx=x;
while(st[stx-1][y]==o) stx--;
while(st[edx+1][y]==0) edx++;
if((edx-stx+1)>=5) return 1;
int sty=y,edy=y;
while(st[x][sty-1]==o) sty--;
while(st[x][edy+1]==o) edy++;
if((edy-sty+1)>=5) return true;
stx=x,sty=y,edx=x,edy=y;
while(st[stx-1][sty-1]==o) stx--,edy--;
while(st[edx+1][edy+1]==o) edx++,edy++;
if((edx-stx+1)>=5) return true;
stx=x,sty=y,edx=x,edy=y;
while(st[stx+1][sty-1]==o) stx++,edy--;
while(st[edx-1][edy+1]==o) edx--,edy++;
if((edx-stx+1)>=5) return true;
return false;
};
int mani(void)
{
cin>>n>>m;
memset(st,-1,sizeof st);
for(int i=1;i<=m;i++)
{
cin>>x>>y;
if(f(x,y,o))
{
if(i&1)
{
puts("HtBest");
printf("%d",i);
}else{
puts("WHZ");
printf("%d",i);
}
}else o^=1;
}
cout<<"UNK"<<'\n'<<m;
return 0;
}
发电
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
typedef long long int LL;
LL tr[N],x,n,m;
LL lowbit(int x)
{
return x&(-x);
}
LL qsm(LL a,LL b,LL p)
{
LL sum=1;
while(b)
{
if(b&1)sum=sum*a%p;
b>>=1;
a=a*a%p;
}
return sum%p;
}
void add(LL x,LL v)
{
for(int i=x;i<=n;i+=lowbit(i))
tr[i]=tr[i]*v%mod;
}
void add1(LL x,LL v)
{
for(int i=x;i<=n;i+=lowbit(i))
tr[i]=tr[i]*qsm(v,mod-2,mod)%mod;
}
LL query(LL x)
{
LL res=1;
for(int i=x;i;i-=lowbit(i))
res=res*tr[i]%mod;
return res;
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<=n;i++) tr[i]=1;
while(m--)
{
int op; scanf("%d",&op);
if(op==1)
{
int y,z;
scanf("%d%d",&y,&z);
add(y,z);
}else if(op==2)
{
int y,z; scanf("%d%d",&y,&z);
add1(y,z);
}else if(op==3)
{
int l,r; scanf("%d%d",&l,&r);
printf("%lld\n",query(r)*qsm(query(l-1),mod-2,mod)%mod);
}
}
return 0;
}
指纹锁
#include<bits/stdc++.h>
using namespace std;
int m,k;
struct cmp{
bool operator()(const int& a,const int& b)const{
if(abs(a-b)<=k) return false;
return a<b;
}
};
set<int,cmp>st;
int main(void)
{
cin>>m>>k;
while(m--)
{
string op; cin>>op;
if(op=="add")
{
int x; scanf("%d",&x);
st.insert(x);
}else if(op=="del")
{
int x; scanf("%d",&x);
st.erase(x);
}else{
int x; scanf("%d",&x);
if(st.find(x)!=st.end()) puts("Yes");
else puts("No");
}
}
return 0;
}
挖沟
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int p[N],n,m;
struct node
{int a,b,c;}Node[N];
bool cmp(node a,node b)
{
return a.c<b.c;
}
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
void solve()
{
int sum=0;
for(int i=1;i<=n;i++) p[i]=i;
for(int i=0;i<m;i++)
{
int a=Node[i].a,b=Node[i].b,c=Node[i].c;
if(find(a)==find(b)) continue;
p[find(a)]=find(b);
sum+=c;
}
cout<<sum;
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<m;i++) cin>>Node[i].a>>Node[i].b>>Node[i].c;
sort(Node,Node+m,cmp);
solve();
return 0;
}
公交线路
#include<bits/stdc++.h>
using namespace std;
const int N=1e4*2+10;
int h[N],e[N],w[N],ne[N],idx;
int n,m,s,t,st[N],d[N];
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa()
{
memset(d,0x3f,sizeof d);
d[s]=0,st[s]=1;
queue<int>q; q.push(s);
while(q.size())
{
int u=q.front(); q.pop();
st[u]=0;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(d[j]>d[u]+w[i])
{
d[j]=d[u]+w[i];
if(!st[j]) q.push(j),st[j]=1;
}
}
}
if(d[t]>0x3f3f3f3f/2) cout<<-1;
else cout<<d[t];
}
int main(void)
{
cin>>n>>m>>s>>t;
memset(h,-1,sizeof h);
while(m--)
{
int a,b,c; cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
spfa();
return 0;
}
洋灰三角
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long int LL;
LL qsm(LL a,LL b,LL p)
{
LL sum=1;
while(b)
{
if(b&1) sum=sum*a%p;
a=a*a%p;
b>>=1;
}
return sum%p;
}
int main(void)
{
LL n,k,p; cin>>n>>k>>p;
if(k==1)
{
LL sum1=(p%mod*n%mod)*(n-1+mod)%mod;
sum1=sum1*qsm(2,mod-2,mod)%mod;
cout<<sum1+n;
}else{
LL temp1=(qsm(k,n,mod)-1+mod)%mod;
LL temp2=(1+p*qsm(k-1,mod-2,mod))%mod;
temp1=temp1*temp2%mod;
temp1=(temp1-p*n%mod+mod)%mod;
cout<<temp1*qsm(k-1,mod-2,mod)%mod;
}
}