其他分享
首页 > 其他分享> > Codeforces Round #628 (Div. 2)

Codeforces Round #628 (Div. 2)

作者:互联网

耻辱场,必铭记

A   a,b只要输出1  x-1就是lcm(a,b)+gcd(a,b)=x了

B  记录数组放到set里,答案set.size

C 只要把他的叶子结点连接的那几条线变成最小的距离即可,但有一个特殊样例

2

1 2

0

因为我是用出现次数是1的就是叶子结点,所有我wa在19,赛后冷静下来思考了一波,觉得自己是真的比赛的时候不相信自己

细节也不注意。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define il inline
 6 #define it register int
 7 #define inf 0x3f3f3f3f
 8 #define lowbit(x) (x)&(-x)
 9 #define pii pair<int,int>
10 #define mak(n,m) make_pair(n,m)
11 #define mem(a,b) memset(a,b,sizeof(a))
12 #define mod 998244353
13 const int maxn=1e5+10;
14 int n;
15 int u,v,ans[maxn],vis[maxn],pos[maxn];
16 int main(){
17     mem(ans,-1);
18     scanf("%d",&n);
19     for(int i=1;i<n;i++){
20         scanf("%d%d",&u,&v);
21         vis[u]++;vis[v]++;pos[u]=i;pos[v]=i;
22     }
23     int t=0;
24     for(it i=1;i<=n;i++){
25         if(vis[i]==1){
26             ans[pos[i]]=t++;
27         }
28     }
29     for(it i=n-1;i>=1;i--){
30         if(ans[i]==-1){
31             ans[i]=t++;
32         }
33     }
34     for(it i=1;i<n;i++){
35         if(ans[i]==n-1){ans[i]=0;}
36         printf("%d\n",ans[i]);
37     }
38     return 0;
39 }
View Code

D

题意:

x,y

求最少的数组个素和其元素,元素异或和为x,元素累加为y

我的思路:

x把他变为二进制,存一个数组a,

用另外一个数组b进行模拟,,把答案存在c这个数组,从0开始往上

首先,b0=y,(y-a0)%2==1 输入-1,然后y-=a0,如果a0是1,那么zhi+=1<<0,b1=y/2。

到b1这层,如果a1是1,那么zhi+=1<<a1,b1-=a1,b1%2==1 那么进行b1减一,b0现在等于2,查看(zhi>>(1))&1,如果是1 ,就去查看数组c里面(ci>>(1))==0,ci+=1<<(1),如果凑不足两个,就c数组中添入1<<(i-1),如果b1==0 a1==1这种情况输出-1,以此类推循环64次足够了

是不是很麻烦,比赛的时候写了这种,写完发现比赛快结束了,交了几分,都错了,然后发现1 1我输出-1,然后赛后检查发现少些了一个else,然后就ac了

 1 #include<iostream>
 2 #include<map>
 3 #include<set>
 4 #include<queue>
 5 #include<stdio.h>
 6 #include<string.h>
 7 #include<algorithm>
 8 using namespace std;
 9 #define ll long long
10 #define ull unsigned long long
11 #define il inline
12 #define it register int
13 #define inf 0x3f3f3f3f
14 #define lowbit(x) (x)&(-x)
15 #define pii pair<int,int>
16 #define mak(n,m) make_pair(n,m)
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define mod 998244353
19 const int maxn=1e5+10;
20 ll n,m;
21 ll a[110],b[110],da[maxn];
22 int main(){
23     scanf("%lld%lld",&n,&m);
24     if(n==0){
25         if(m==0){printf("0\n");return 0;}
26         else if(m&1){
27            printf("-1\n");return 0;
28         }
29         else{
30             printf("2\n");
31             printf("%lld %lld",m/2,m/2);return 0;
32         }
33     }
34     ll ans=n,sum=m;
35     int c=0,cc=0;
36     while(ans){
37         a[c++]=ans%2;
38         ans/=2;
39     }
40     int f=0,p=0;
41     ll daa=0;
42     b[0]=m;
43     for(it i=0;i<=100;i++){
44         if(a[i] && b[i]){
45             b[i]--;daa+=(ll)1<<i;
46         }
47         else if(a[i] && !b[i]){f=1;break;}//就是这里少了个else,淦
48         if(b[i]%2==1){
49             if(i==0){f=1;break;}
50             int ff=2;
51             if(!((daa>>(i-1))&1)){
52                 daa+=((ll)1<<(i-1));ff--;
53             }
54             for(it j=0;j<p;j++){
55                 if((da[j]>>(i-1))&1){continue;}
56                 if(ff){
57                     da[j]+=(ll)1<<(i-1);ff--;
58                 }
59             }
60             for(it j=0;j<ff;j++){
61                 da[p++]=(ll)1<<(i-1);
62             }
63             b[i]--;
64         }
65         b[i+1]+=b[i]/2;
66     }
67     if(f){printf("-1\n");return 0;}
68     da[p++]=daa;
69     printf("%d\n",p);
70     for(it i=0;i<p;i++){
71         printf(i==p-1?"%lld\n":"%lld ",da[i]);
72     }
73     return 0;
74 }
View Code

 

 

至于为什么说我的思路呢,因为官方给的题解比我的简单很多:

看代码就马上知道,其思路了

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     long long u,v;
 6     scanf("%I64d%I64d",&u,&v);
 7     if (u%2!=v%2 || u>v)
 8     {
 9         printf("-1");
10         return 0;
11     }
12     if (u==v)
13     {
14         if (!u)
15         printf("0");
16         else
17         printf("1\n%I64d",u);
18         return 0;
19     }
20     long long x=(v-u)/2;
21     if (u&x)
22     printf("3\n%I64d %I64d %I64d",u,x,x);
23     else
24     printf("2\n%I64d %I64d",(u^x),x);
25 }
View Code

 

就是x和y,如果前面条件都符合,最后如果u=(y-x)/2,当u和x有交集的情况,就是三个x,x,u(x^x=1),如果没交集就可以合并u^x,x

 

标签:int,ll,628,Codeforces,long,printf,Div,include,define
来源: https://www.cnblogs.com/luoyugongxi/p/12496989.html