Codeforces Global Round 4 题解
技不如人,肝敗嚇瘋……
開場差點被 A 題意殺了,幸好仔細再仔細看,終于在第 7 分鐘過掉了。
跟榜。wtf 怎么一群人跳題/倒序開題?
立刻緊張,把 BC 迅速切掉,翻到了 100+。
開 D。感覺有點嚇人……感覺有點可做?
的確挺可做。再切掉 D,但是此時已經到 300+ 了。
沒事,還能翻。
開 E。這……什么玩意?
瞄了一眼 F1,……
盯著這兩題盯到自閉。
最后 rk 1000 左右。我的名字顏色真的是對的嗎……
?
A
看懂題了就是水題。選上所有小于等于第一個黨派一半人數的黨派,如果不行就不行,否則就可以。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=100010; #define MP make_pair #define PB push_back #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define ROF(i,a,b) for(int i=(a);i>=(b);i--) #define MEM(x,v) memset(x,v,sizeof(x)) inline ll read(){char ch=getchar();ll x=0,f=0;while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return f?-x:x; } int n,a[maxn],s,s2,cnt; int main(){n=read();FOR(i,1,n) s+=a[i]=read();s2=a[1];cnt=1;FOR(i,2,n) if(a[1]>=2*a[i]) s2+=a[i],cnt++;if(s2*2<=s) puts("0");else{printf("%d\n",cnt);printf("1 ");FOR(i,2,n) if(a[1]>=2*a[i]) printf("%d ",i);} } View CodeB
枚舉中間的 o,然后看看兩邊能選出多少個 vv,簡單前綴/后綴和解決。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=1000100; #define MP make_pair #define PB push_back #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define ROF(i,a,b) for(int i=(a);i>=(b);i--) #define MEM(x,v) memset(x,v,sizeof(x)) inline ll read(){char ch=getchar();ll x=0,f=0;while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return f?-x:x; } int n,pre[maxn],suf[maxn]; ll ans; char s[maxn]; int main(){scanf("%s",s+1);n=strlen(s+1);FOR(i,2,n){pre[i]=pre[i-1];if(s[i]=='v' && s[i-1]=='v') pre[i]++;} ROF(i,n-1,1){suf[i]=suf[i+1];if(s[i]=='v' && s[i+1]=='v') suf[i]++;}FOR(i,1,n) if(s[i]=='o') ans+=1ll*pre[i-1]*suf[i+1];cout<<ans<<endl; } View CodeC
最左上角的可以隨便選。
第一行的在左邊那個已經確定后,可以發現可以選兩種。
第一列的同理,每個可以選兩種。
不在第一行也不在第一列的,發現只能選固定的一種。
答案就是 $2^{n+m}$。
(為什么一群人盯樣例盯出來了……)
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=1010,mod=998244353; #define MP make_pair #define PB push_back #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define ROF(i,a,b) for(int i=(a);i>=(b);i--) #define MEM(x,v) memset(x,v,sizeof(x)) inline ll read(){char ch=getchar();ll x=0,f=0;while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return f?-x:x; } int n,m; int qpow(int a,int b){int ans=1;for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) ans=1ll*ans*a%mod;return ans; } int main(){n=read();m=read();printf("%d\n",qpow(2,n+m)); } View CodeD
每個點度數不小于 $2$,所以邊數最小為 $n$。
不妨找到第一個大于等于 $n$ 的質數作為邊數。
根據一些%*#(!^定理(猜想?),$n\ge 3$ 時,$[n,\frac{3}{2}n]$ 中至少有一個質數。
可以通過下面這個方法構造出一個有 $2n-m$ 個度數為 $2$ 的點,$m-n$ 個度數為 $3$ 的點的圖。
首先 $i$ 向 $i+1$ 連邊($n$ 向 $1$ 連邊),此時用了 $n$ 條邊,所有點度數為 $2$。
剩下的 $m-n$ 條邊隨便連,只要沒有重邊并且這 $m-n$ 條邊不重復用點就好了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=100010; #define MP make_pair #define PB push_back #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define ROF(i,a,b) for(int i=(a);i>=(b);i--) #define MEM(x,v) memset(x,v,sizeof(x)) inline ll read(){char ch=getchar();ll x=0,f=0;while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return f?-x:x; } int n,m,cnt; bool use[maxn]; bool check(int x){if(x==1) return false;for(int i=2;i*i<=x;i++) if(x%i==0) return false;return true; } int main(){n=m=read();while(!check(m)) m++;cnt=m-n;printf("%d\n",m);FOR(i,1,n){printf("%d %d\n",i,i%n+1);if(cnt && !use[i]){int to=i%n+1;to=to%n+1;while(use[to]) to=to%n+1;use[i]=use[to]=true;printf("%d %d\n",i,to);cnt--;}} } View CodeE
這也太神了吧……
對于長度 $\le 3$ 的字符串,可以任意選其中一個字符。
對于長度 $\ge 4$ 的字符串,取出前兩個字符和后兩個字符,由于相鄰字符不相等,所以一定可以從前兩個中選出一個,后兩個中選出一個,使得它們相等。刪掉這四個字符,然后重復操作。
可以發現這樣求出的一定是回文串而且合法。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; const int maxn=1000100; #define MP make_pair #define PB push_back #define lson o<<1,l,mid #define rson o<<1|1,mid+1,r #define FOR(i,a,b) for(int i=(a);i<=(b);i++) #define ROF(i,a,b) for(int i=(a);i>=(b);i--) #define MEM(x,v) memset(x,v,sizeof(x)) inline ll read(){char ch=getchar();ll x=0,f=0;while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return f?-x:x; } int n,m,l,r; char s[maxn],t[maxn]; int main(){scanf("%s",s+1);n=strlen(s+1);l=1;r=n;while(r-l+1>=4){if(s[l]==s[r] || s[l]==s[r-1]) t[++m]=s[l];else t[++m]=s[l+1];l+=2;r-=2;}FOR(i,1,m) putchar(t[i]);if(l<=r) t[++m]=s[l];ROF(i,m,1) putchar(t[i]); } View Code?
轉載于:https://www.cnblogs.com/1000Suns/p/11220815.html
總結
以上是生活随笔為你收集整理的Codeforces Global Round 4 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭电1005
- 下一篇: Google Map V3--geoco