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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

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 }
View Code

 

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 }
View Code

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+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

[Codeforces394B]Very Beautiful Number(逆推)