Codeforces Round #394 (Div. 2)
Posted AntiLeaf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #394 (Div. 2)相关的知识,希望对你有一定的参考价值。
前一半是刚刚打完比赛的时候写的……不知为啥手腕有点僵,估计是前一个小时用力过度了吧= =
前四题看着还好,后两题就有点懵逼了……现在还不知道E题的题意到底是啥……
不管了……还没找着官方题解,贴一下自己的做法算了……
A显然是傻逼题啊……没注意到a,b都是0的情况,被hack了一次……
1 #include<cstdio> 2 using namespace std; 3 int main(){ 4 int a,b; 5 scanf("%d%d",&a,&b); 6 if(a==0&&b==0)printf("NO"); 7 else{ 8 if(a>b){ 9 int t=a; 10 a=b; 11 b=t; 12 } 13 printf(b-a<=1?"YES":"NO"); 14 } 15 return 0; 16 }
B也是傻逼题,暴力判断就行……
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 bool judge(); 6 int n,m,a[100010],b[100010]; 7 int main(){ 8 bool ok=false; 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 11 for(int i=1;i<=n;i++)scanf("%d",&b[i]); 12 for(int i=0;i<n;i++){ 13 if(judge()){ 14 ok=true; 15 break; 16 } 17 rotate(a+1,a+2,a+n+1); 18 } 19 printf(ok?"YES":"NO"); 20 return 0; 21 } 22 bool judge(){ 23 int tmp=(a[1]-b[1]+m)%m; 24 for(int i=2;i<=n;i++)if((a[i]-b[i]+m)%m!=tmp)return false; 25 return true; 26 }
C也是傻逼题,枚举三种符号出现在哪三行,其余的行就不用动了。
为了防止花式TLE我写了预处理代价……
1 #include<cstdio> 2 #include<cstring> 3 #include<cctype> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=110; 7 char s[maxn]; 8 int n,m,f[maxn][3],ans=0x3f3f3f3f; 9 int main(){ 10 scanf("%d%d",&n,&m); 11 memset(f,42,sizeof(f)); 12 for(int i=0;i<n;i++){ 13 scanf("%s",s); 14 for(int j=0;j<m;j++){ 15 if(isdigit(s[j]))f[i][0]=min(f[i][0],min(j,m-j)); 16 else if(islower(s[j]))f[i][1]=min(f[i][1],min(j,m-j)); 17 else if(s[j]==\'#\'||s[j]==\'*\'||s[j]==\'&\')f[i][2]=min(f[i][2],min(j,m-j)); 18 } 19 } 20 for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i!=j)for(int k=0;k<n;k++)if(i!=k&&j!=k)ans=min(ans,f[i][0]+f[j][1]+f[k][2]); 21 printf("%d",ans); 22 return 0; 23 }
D也不难吧……看了看觉得就是按排名贪心,sort一下就好了……
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=100010; 6 struct A{ 7 int x,pos; 8 bool operator<(const A &a)const{return x<a.x;} 9 }c[maxn]; 10 int n,a[maxn],b[maxn],l,r,last=-1e9+1; 11 int main(){ 12 scanf("%d%d%d",&n,&l,&r); 13 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 14 for(int i=1;i<=n;i++){ 15 scanf("%d",&c[i].x); 16 c[i].pos=i; 17 } 18 sort(c+1,c+n+1); 19 bool ok=true; 20 for(int i=1;i<=n;i++){ 21 b[c[i].pos]=max(l,last+a[c[i].pos]+1); 22 last=b[c[i].pos]-a[c[i].pos]; 23 if(b[c[i].pos]>r){ 24 ok=false; 25 break; 26 } 27 } 28 if(ok)for(int i=1;i<=n;i++){ 29 if(i>1)printf(" "); 30 printf("%d",b[i]); 31 } 32 else printf("-1"); 33 return 0; 34 }
E听说主要考读题……药丸啊药丸
我理解的题意是说所有边长度为1,边之间只能成直角或平角,问树是否可以画在平面上……
反正n的范围这么小,找个重心之后求个bfs序,按bfs序暴搜……反正我过了Pretest,跑的还挺快……
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<queue> 6 using namespace std; 7 const int maxn=110,dx[]={0,0,-1,1},dy[]={-1,1,0,0}; 8 void getcenter(int); 9 void dfs(int); 10 vector<int>G[maxn]; 11 bool vis[maxn][maxn]={false}; 12 int size[maxn]={0},son[maxn]={0},id[maxn],tim=0; 13 int n,center=0,x,y,du[maxn]={0},a[maxn],b[maxn],p[maxn]; 14 bool ok=false; 15 int main(){ 16 scanf("%d",&n); 17 for(int i=1;i<n;i++){ 18 scanf("%d%d",&x,&y); 19 G[x].push_back(y); 20 G[y].push_back(x); 21 du[x]++; 22 du[y]++; 23 } 24 bool bad=false; 25 for(int i=1;i<=n;i++)if(du[i]>4){ 26 bad=true; 27 break; 28 } 29 if(bad){ 30 printf("NO"); 31 return 0; 32 } 33 getcenter(1); 34 x=center; 35 getcenter(center); 36 a[x]=b[x]=0; 37 vis[50][50]=true; 38 dfs(2); 39 if(ok){ 40 printf("YES\\n"); 41 for(int i=1;i<=n;i++)printf("%d %d\\n",a[i],b[i]); 42 } 43 else printf("NO"); 44 return 0; 45 } 46 void getcenter(int x){ 47 queue<int>q; 48 int tim=0; 49 fill(p,p+n+1,0); 50 q.push(x); 51 while(!q.empty()){ 52 x=q.front(); 53 q.pop(); 54 id[++tim]=x; 55 size[x]=1; 56 for(int i=0;i<(int)G[x].size();i++)if(G[x][i]!=p[x]){ 57 p[G[x][i]]=x; 58 q.push(G[x][i]); 59 } 60 } 61 for(int i=n;i;i--){ 62 x=id[i]; 63 size[p[x]]+=size[x]; 64 if(size[x]>size[son[p[x]]])son[p[x]]=x; 65 } 66 for(int i=1;i<=n;i++){ 67 x=id[i]; 68 if(!center||max(n-size[x],size[son[x]])<max(n-size[center],size[son[center]]))center=x; 69 } 70 } 71 void dfs(int k){ 72 if(k==n+1){ 73 ok=true; 74 return; 75 } 76 register int x=id[k]; 77 for(int i=0;i<4;i++)if(!vis[a[p[x]]+dx[i]+50][b[p[x]]+dy[i]+50]){ 78 a[x]=a[p[x]]+dx[i]; 79 b[x]=b[p[x]]+dy[i]; 80 vis[a[x]+50][b[x]+50]=true; 81 dfs(k+1); 82 if(ok)return; 83 vis[a[x]+50][b[x]+50]=false; 84 } 85 }
UPD:理解错了题意了…… 然后就WA了,英死早……
话说这次的比赛不太资瓷啊……room老是炸,中间好不容易能看了,lock了C之后看别人的代码,看着看着突然发现有个傻小伙把m-j写成了n-j+1,火速造了个小数据,交上去之后也不知到底hack上了没有……
本来做出来了四道水题,然后因为CF的系统不太资瓷结果unrated了……不好玩……
以上是关于Codeforces Round #394 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #394 (Div. 2)
Codeforces Round #394 (Div. 2)
Codeforces Round #394 (Div. 2) 解题报告
Codeforces Round #436 E. Fire(背包dp+输出路径)