Codeforces Round #590 (Div. 3)
A. Equalize Prices Again
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=2e5+5; const long N = 200000; int q; int n; int a[105]; int main(){ scanf("%d",&q); while(q--){ scanf("%d",&n); int sum=0; int ans=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum+=a[i]; } if(sum%n==0) ans=sum/n; else ans=sum/n+1; printf("%d\n",ans); } return 0;
|
B1. Social Network (easy version)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=2e5+5; const long N = 200000;
int n,k; map<int ,int > mp; int ans[MAX_N];
int main(){ scanf("%d%d",&n,&k); int id; int cnt=0; for(int i=1;i<=n;i++){ scanf("%d",&id); if(mp[id]==0){ mp[id]=1; ans[cnt]=id; if(cnt>=k){ mp[ans[cnt-k]]=0; } cnt++; } } if(cnt<=k){ printf("%d\n",cnt); for(int i=cnt-1;i>=0;i--){ printf("%d%c",ans[i],i==0 ? '\n':' '); } } else{ printf("%d\n",k); for(int i=cnt-1;i>=cnt-k;i--){ printf("%d%c",ans[i],i==cnt-k ? '\n':' '); } } return 0; }
|
B2. Social Network (hard version)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=2e5+5; const long N = 200000;
int n,k; map<int ,int > mp; int ans[MAX_N];
int main(){ scanf("%d%d",&n,&k); int id; int cnt=0; for(int i=1;i<=n;i++){ scanf("%d",&id); if(mp[id]==0){ mp[id]=1; ans[cnt]=id; if(cnt>=k){ mp[ans[cnt-k]]=0; } cnt++; } } if(cnt<=k){ printf("%d\n",cnt); for(int i=cnt-1;i>=0;i--){ printf("%d%c",ans[i],i==0 ? '\n':' '); } } else{ printf("%d\n",k); for(int i=cnt-1;i>=cnt-k;i--){ printf("%d%c",ans[i],i==cnt-k ? '\n':' '); } } return 0; }
|
C. Pipes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=2e5+5; const long N = 200000;
int q; int n; int a[2][MAX_N];
int main(){ scanf("%d",&q); while(q--){ bool flag=0; scanf("%d",&n); int temp; for(int i=0;i<2;i++){ for(int j=1;j<=n;j++){ scanf("%1d",&temp); if(temp==1||temp==2) a[i][j]=1; else a[i][j]=3; } } int pos=0; int cnt=0; for(int i=1;i<=n;i++){ if(a[pos][i]==1){ cnt++; } else if(a[pos][i]==3&&a[pos^1][i]==3){ cnt++; pos=pos^1; } } if(cnt==n&&pos==1) flag=1; if(flag) puts("YES"); else puts("NO"); } return 0; }
|
D. Distinct Characters Queries
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=1e5+5; const long N = 200000;
int q; int n; string s; int tree[MAX_N][30];
int lowbit(int x){ return x&(-x); }
void add(int x,int k,int cnt){ while(x<=n){ tree[x][cnt]+=k; x+=lowbit(x); } }
int sum(int x,int cnt){ int res=0; while(x>0){ res+=tree[x][cnt]; x-=lowbit(x); } return res; }
int main(){ string s; cin>>s; n=s.size(); for(int i=0;i<n;i++){ add(i+1,1,s[i]-'a'); }
int q; scanf("%d",&q); while(q--){ int op; scanf("%d",&op); if(op==1){ int pos; char c; scanf("%d",&pos); scanf(" %c",&c); add(pos,-1,s[pos-1]-'a'); s[pos-1]=c; add(pos,1,c-'a'); } else{ int l,r; scanf("%d%d",&l,&r); int ans=0; for(int i=0;i<26;i++){ if((sum(r,i)-sum(l-1,i))>0){ ans++; } } printf("%d\n",ans); } } return 0; }
|
E. Special Permutations
参考:blog
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=2e5+5; const int INF=0x3f3f3f3f; int n,m; ll a[MAX_N]; ll ans[MAX_N];
void up(ll l,ll r,ll v){ ans[l]+=v; ans[r+1]-=v; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%lld",&a[i]); for(int i=1;i<m;i++){ ll l=a[i],r=a[i+1]; if(l>r) swap(l,r); if(l!=r){ up(1,l-1,r-l); up(l,l,r-1); up(l+1,r-1,r-l-1); up(r,r,l); up(r+1,n,r-l); } } for(int i=1;i<=n;i++){ if(i!=n)printf("%lld ",ans[i]+=ans[i-1]); else printf("%lld\n",ans[i]+=ans[i-1]); } return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=2e5+5; const int INF=0x3f3f3f3f; int n,m; int a[MAX_N],p[MAX_N]; ll ans; vector<int> pos[MAX_N]; int main(){
scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) p[i]=i; for(int i=1;i<=m;i++) { scanf("%d",&a[i]); pos[a[i]].push_back(i); } for(int i=1;i<=m-1;i++){ ans+=abs(a[i]-a[i+1]); } printf("%lld ",ans); for(int i=2;i<=n;i++){ for(int j=0;j<pos[i].size();j++){ int k=pos[i][j]; if(k>1) ans-=abs(i-p[a[k-1]]); if(k<m) ans-=abs(i-p[a[k+1]]); } for(int j=0;j<pos[i-1].size();j++){ int k=pos[i-1][j]; if(k>1&&a[k-1]!=i) ans-=abs(1-p[a[k-1]]); if(k<m&&a[k+1]!=i) ans-=abs(1-p[a[k+1]]); } p[i]=1; p[i-1]=i; for(int j=0;j<pos[i].size();j++){ int k=pos[i][j]; if(k>1) ans+=abs(1-p[a[k-1]]); if(k<m) ans+=abs(1-p[a[k+1]]); } for(int j=0;j<pos[i-1].size();j++){ int k=pos[i-1][j]; if(k>1&&a[k-1]!=i) ans+=abs(i-p[a[k-1]]); if(k<m&&a[k+1]!=i) ans+=abs(i-p[a[k+1]]); } if(i==n) printf("%lld",ans); else printf("%lld ",ans); } return 0; }
|
F. Yet Another Substring Reverse
参考:blog
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N=1e6+5; const int INF=0x3f3f3f3f; char s[MAX_N]; int dp[1<<(20)]; bool vis[20]; int main(){ scanf("%s",s); int n=strlen(s); for(int i=0;i<n;i++){ memset(vis,0,sizeof(vis)); int mask=0,cnt=0; for(int j=i;j<n;j++){ int v=s[j]-'a'; if(vis[v]) break; else vis[v]=1; mask |=(1<<v); cnt++; dp[mask]=cnt; } } for(int i=0;i<(1<<20);i++){ for(int j=0;j<20;j++){ if(i&(1<<j)){ dp[i]=max(dp[i],dp[i^(1<<j)]); } } } int ans=0; for(int i=0;i< (1<<20);i++){ ans=max(ans,dp[i]+dp[i^((1<<20)-1)]); } printf("%d\n",ans); return 0; }
|