ec round 91
由于cf前面的题目遗留太多,虽然每一天都在补做一场,但是题解并没有记录。
这场重新开始……
B
其实参透了cf的出数据套路之后,官方数据的解释基本都不是正解……
那么我们考虑每循环一次都要赢很多,我们不就可以判断哪种最多,直接找到克他的全部输出出来就好了?
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 1e6+10; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int t,len,i,sum1,sum2,sum3; char s[maxn]; int main() { t=read(); while (t--) { scanf("%s",s+1); len=strlen(s+1); sum1=sum2=sum3=0; for (i=1;i<=len;i++) { if (s[i]=='R') sum1++; if (s[i]=='S') sum2++; if (s[i]=='P') sum3++; } if (sum1>=sum2 && sum1>=sum3) { for (i=1;i<=len;i++)cout<<"P"; cout<<endl; continue; } if (sum2>=sum1 && sum2>=sum3) { for (i=1;i<=len;i++)cout<<"R"; cout<<endl; continue; } if (sum3>=sum1 && sum3>=sum2) { for (i=1;i<=len;i++)cout<<"S"; cout<<endl; continue; } } return 0; }
C
排个序就行
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 1e6+10; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int t,n,x,i,a[maxn],number,ans; ll sum; int main() { t=read(); while (t--) { n=read(),x=read(); for (i=1;i<=n;i++) a[i]=read(); sort(a+1,a+1+n); reverse(a+1,a+1+n); number=sum=ans=0; for (i=1;i<=n;i++) { number++; if (x<=1ll*number*a[i]) { ans++; number=0; } } cout<<ans<<endl; } return 0; }
E
对于编号相邻的圆盘多个圆盘,在后续移动里面,肯定是一起移的,所以答案和每个塔中“编号相邻的圆盘”的对数有关,模拟几组数据可得,当每一次所有塔中“相邻对”的数量和为x,答案为 n-x+1。
又因为题目的意思,两个塔合并为一个塔之后,这个塔可能是在这两个位置中的其中一个。所以我们运用并查集,把这两个塔的位置建立联系。
但是两个塔合并为一个塔之后,编号相邻的圆盘的对数肯定会有所增加,那么我们就暴力循环其中一个塔里面的所有圆盘,如果这个圆盘与另个塔的某个圆盘是编号相邻,那么对数++,合并完后算出答案。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int #define pb push_back using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 1e6+10; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int fa[maxn],n,m,i,a[maxn],siz[maxn],sum,x,pos[maxn],y; vector<int> G[maxn]; int find(int x) { if (x==fa[x]) return x; return fa[x]=find(fa[x]); } void unite(int x,int y) { int xx=find(x),yy=find(y); if (siz[xx]>siz[yy]) swap(xx,yy); siz[yy]+=siz[xx]; for (ri i=0;i<siz[xx];i++) { if (G[xx][i]>1 &&find(G[xx][i]-1)==yy)sum++; if (G[xx][i]<n &&find(G[xx][i]+1)==yy)sum++; } while (G[xx].size()) G[yy].pb(G[xx].back()),G[xx].pop_back(); fa[xx]=fa[yy]; siz[xx]=0; } int main() { n=read(),m=read(); for (i=1;i<=n;i++) fa[i]=i,G[i].pb(i),siz[i]=1; for (i=1;i<=n;i++) { a[i]=read(); if(pos[a[i]]) unite(pos[a[i]],i); pos[a[i]]=i; } printf("%d\n",n-sum-1); for (i=1;i<m;i++) { x=read();y=read(); unite(pos[x],pos[y]); printf("%d\n",n-sum-1); } return 0; }

浙公网安备 33010602011771号