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