codeforces contest 733
2016-11-05 20:27
274 查看
http://codeforces.com/contest/733
AB水题就不说了
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C 733C Epidemic
in Monstropolis
题意:给出两个数组,求使第一个数组变成第二个数组的操作。操作定义:如果一个数是大于它旁边的数的,那么它可以吃掉它旁边的数。
题解:首先对a数组进行分割,如果不能分割成b数组,那么肯定是no。对于每一块,找最大值a[i],并且a[i]能吃旁边的数。判断它能先吃左边还是右边,然后模拟一下就好了。
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
D 733D Kostya
the Sculptor
题意:有n块长方体,可以选择一块或者把两块有连接起来(能连接起来的,连接面必须一模一样)。求能做成最大的内切球的长方体编号。
题解:把长方体的两条边压成pair丢进map。
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E 733E Sleep
in Class
题意:有一个由'U'和'D'组成的字符串,从U出发是向上,从'D'出发是向下。经过一个字符,它的状态会改变。求从i出发,经过几个字符才能跳出这个字符。
题解:
AB水题就不说了
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C 733C Epidemic
in Monstropolis
题意:给出两个数组,求使第一个数组变成第二个数组的操作。操作定义:如果一个数是大于它旁边的数的,那么它可以吃掉它旁边的数。
题解:首先对a数组进行分割,如果不能分割成b数组,那么肯定是no。对于每一块,找最大值a[i],并且a[i]能吃旁边的数。判断它能先吃左边还是右边,然后模拟一下就好了。
#include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <string> #include <cmath> #include <queue> #include <set> #include <map> using namespace std; typedef long long ll; #define de(x) cout << #x << "=" << x << endl const int N=505; int a ,b ,c ; int main() { int n,m; while(~scanf("%d",&n)) { for(int i=1;i<=n;++i) scanf("%d",&a[i]); scanf("%d",&m); for(int i=1;i<=m;++i) scanf("%d",&b[i]); memset(c,0,sizeof(c)); //分割 int ans=1,sum=0,i,j; for(i=1,j=1;i<=n&&j<=m;++i) { sum+=a[i]; if(sum==b[j]) { c[j]=i; sum=0; ++j; } if(sum>b[j]) { ans=0; break; } } //不能完美的分割 if(i!=n+1) ans=0; if(j!=m+1) ans=0; if(!ans) { puts("NO"); continue; } //找每一个有没有符合条件的 for(int i=1;i<=m&&ans;++i) { if(c[i]-c[i-1]==1) continue; int maxn=0; for(int j=c[i-1]+1;j<=c[i];++j) maxn=max(maxn,a[j]); int ok=0; for(int j=c[i-1]+1;j<=c[i];++j) { if(a[j]==maxn) { if(j>c[i-1]+1&&a[j]>a[j-1]) ok=1; if(j<c[i]&&a[j]>a[j+1]) ok=1; } } if(!ok) ans=0; } if(!ans) { puts("NO"); continue; } printf("YES\n"); for(int i=1;i<=m;++i) { if(c[i]-c[i-1]==1) continue; int maxn=0; for(int j=c[i-1]+1;j<=c[i];++j) maxn=max(maxn,a[j]); for(int j=c[i-1]+1;j<=c[i];++j) { if(a[j]==maxn) { int ok=0; if(j>c[i-1]+1&&a[j]>a[j-1]) ok=1; if(j<c[i]&&a[j]>a[j+1]) ok=1; if(!ok) continue; if(j>c[i-1]+1&&a[j]>a[j-1]) { for(int k=j;k>c[i-1]+1;--k) printf("%d L\n",k-c[i-1]-1+i); for(int k=j;k<c[i];++k) printf("%d R\n",i); } else { for(int k=j;k<c[i];++k) printf("%d R\n",j-c[i-1]-1+i); for(int k=j;k>c[i-1]+1;--k) printf("%d L\n",k-c[i-1]-1+i); } break; } } } } return 0; }
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
D 733D Kostya
the Sculptor
题意:有n块长方体,可以选择一块或者把两块有连接起来(能连接起来的,连接面必须一模一样)。求能做成最大的内切球的长方体编号。
题解:把长方体的两条边压成pair丢进map。
#include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <string> #include <cmath> #include <queue> #include <set> #include <map> using namespace std; typedef long long ll; #define de(x) cout << #x << "=" << x<<" " struct Node { int i,val; }; map<pair<int,int>,Node > mp; int a[5]; int main() { int n; while(~scanf("%d",&n)) { mp.clear(); int ans=0,xx=0,yy=0; for(int i=1;i<=n;++i) { scanf("%d%d%d",&a[0],&a[1],&a[2]); sort(a,a+3); if(a[0]>ans) { ans=a[0]; xx=0;yy=i; } int x=mp[make_pair(a[0],a[1])].val; int y=mp[make_pair(a[0],a[2])].val; int z=mp[make_pair(a[1],a[2])].val; if(x&&min(a[0],x+a[2])>ans) { ans=min(a[0],x+a[2]); xx=mp[make_pair(a[0],a[1])].i; yy=i; } if(y&&min(a[0],y+a[1])>ans) { ans=min(a[0],y+a[1]); xx=mp[make_pair(a[0],a[2])].i; yy=i; } if(z&&min(a[1],z+a[0])>ans) { ans=min(a[1],z+a[0]); xx=mp[make_pair(a[1],a[2])].i; yy=i; } if(a[2]>x) { mp[make_pair(a[0],a[1])].val=a[2]; mp[make_pair(a[0],a[1])].i=i; } if(a[1]>y) { mp[make_pair(a[0],a[2])].val=a[1]; mp[make_pair(a[0],a[2])].i=i; } if(a[0]>z) { mp[make_pair(a[1],a[2])].val=a[0]; mp[make_pair(a[1],a[2])].i=i; } } if(xx==0) { printf("1\n%d\n",yy); } else { printf("2\n%d %d\n",xx,yy); } } return 0; }
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
E 733E Sleep
in Class
题意:有一个由'U'和'D'组成的字符串,从U出发是向上,从'D'出发是向下。经过一个字符,它的状态会改变。求从i出发,经过几个字符才能跳出这个字符。
题解:
#include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <string> #include <cmath> #include <queue> #include <set> #include <map> using namespace std; typedef long long ll; #define de(x) cout << #x << "=" << x << endl const int N=1000005; char s ; ll sumu ,sumd ; int cnt [2]; int main() { int n; while(~scanf("%d%s",&n,s+1)) { int cntu=0,cntd=0; for(int i=1;i<=n;++i) { if(s[i]=='U') { sumu[++cntu]=sumu[cntu-1]+i; } else { sumd[++cntd]=sumd[cntd-1]+i; } cnt[i][0]=cntu; cnt[i][1]=cntd; } for(int i=1;i<=n-cntu;++i) { ll ans=(sumd[cnt[i][1]+cnt[i][0]]-sumd[cnt[i][1]])-(sumu[cnt[i][0]]); ans=ans*2+i; printf("%I64d ",ans); } for(int i=n-cntu+1;i<=n;++i) { ll ans=(sumd[cntd]-sumd[cnt[i-1][1]])-(sumu[cnt[i-1][0]]-sumu[cnt[i-1][0]-(cntd-cnt[i-1][1])]); ans=ans*2+n-i+1; printf("%I64d ",ans); } puts(""); } return 0; }
相关文章推荐
- Codeforces-Round-#357-(Div.-2)-A-Good-Contest
- codeforces contest 479
- codeforces contest 864 problemD
- codeforces contest 358
- codeforces contest 349
- 【Codeforces】2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) E 线段树+离散化
- codeforces contest 779 D题
- Codeforces 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest I题(模拟)
- 【codeforces】2014 Asia Xian Regional Contest G The Problem to Slow Down You 【Palindromic Tree】
- codeforces 733 F. Drivers Dissatisfaction(最小生成树+lca+倍增去环)
- Codeforces 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J题(BFS)
- codeforces 730G Car Repair Shop 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest
- 【74.89%】【codeforces 551A】GukiZ and Contest
- codeforces contest 551 problem E(分块)
- codeforces contest 855 problem B(前缀后缀)
- 【Codeforces】School Regional Team Contest, Saratov, 2011
- Codeforces 730 J. Bottles DP 0-1背包- 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest
- Codeforces 725D[Contest Balloons]【贪心】
- CodeForces 733 E.Sleep in Class(队列)
- 【codeforces 733 C】【模拟】C. Epidemic in Monstropolis【给你n个数,再给你k个数,问你a序列能否通过一定规则合并变成b序列】