Codeforces Round #628 (Div. 2) A、B、C、D

傷城~ 2023-07-15 09:04 147阅读 0赞

EhAb AnD gCd

题意:给你一整数x,让你求两个数a,b ,使得 gcd(a,b)+lcm(a,b)=x

题解:令a=1,b=x-1 即可。

code:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. #include<vector>
  7. #include<set>
  8. #include<sstream>
  9. using namespace std;
  10. typedef long long ll;
  11. const ll maxn=1e6+10;
  12. const ll inf=0x3f3f3f3f3f3f3f3f;
  13. int main()
  14. {
  15. ios::sync_with_stdio(false);
  16. cin.tie(0);cout.tie(0);
  17. ll t;
  18. cin>>t;
  19. while(t--)
  20. {
  21. ll x;
  22. cin>>x;
  23. cout<<1<<" "<<x-1<<endl;
  24. }
  25. return 0;
  26. }

CopyCopyCopyCopyCopy

题意:给你一个无序的数组,问你通过copy这些无序数组LIS最大长度多少。

题解: 无限copy数组,第一个次数组选最小的,第二个次数组选次小的…

其实就看这个无序数组有多少个不同的数就是答案。
set去重,输出set里数的数量。

code:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. #include<vector>
  7. #include<set>
  8. #include<sstream>
  9. using namespace std;
  10. typedef long long ll;
  11. const ll maxn=1e6+10;
  12. const ll inf=0x3f3f3f3f3f3f3f3f;
  13. set<ll> s;
  14. int main()
  15. {
  16. ios::sync_with_stdio(false);
  17. cin.tie(0);cout.tie(0);
  18. ll t;
  19. cin>>t;
  20. while(t--)
  21. {
  22. s.clear();
  23. ll n;
  24. cin>>n;
  25. for(int i=0;i<n;i++)
  26. {
  27. ll a;
  28. cin>>a;
  29. s.insert(a);
  30. }
  31. cout<<s.size()<<endl;
  32. }
  33. return 0;
  34. }

Ehab and Path-etic MEXs

题意:给出一个n个节点的树,让你给每条边(n-1条)填上一个唯一的数( 0~n-2 ), 使得任意mex(u,v)的最大值最小

mex(u,v):表示从u到v这条路径上边权未出现过的数的最小的一个。

For example:
mex(u,v) 这条路径上的边权为1、3、4 (本题以0为最小值),mex(u,v)=0,0未出现过且最小

题解:
1.如果他就一条链,n-1条边从头到尾的mex(u,v) 就是n-1
2.如果他有支链(某个点的度>=3),我们就把0、1放到这个点的主链部分,把2放到这个点连接的支链部分,这样可以保证整个数的任意mex(u,v)最大值为2,是optimal.

可以这样想,我们的目的就是让0、1、2不在同一链路上,我们找一条链路上的所有边,每个点连接两条边,我们可以把最小的两个边0、1加到这个点(某个点的度>=3)两侧,并且这条链路上我们不放2这个边权,我们这时已经让这条链路的mex=2,再把2连接到这个点(就是保证0、1、2不在同一链路上),所以经过这个点的所有路径的最大mex为2,不经过这个点的所有mex=0

说的可能不明白,画图很清晰。

代码:找一个度为不小于3的点,让他的任意3条边等于0、1、2,其他边随机添加。

code:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. #include<vector>
  7. #include<set>
  8. #include<sstream>
  9. using namespace std;
  10. typedef long long ll;
  11. const ll maxn=1e6+10;
  12. const ll inf=0x3f3f3f3f3f3f3f3f;
  13. ll a[maxn],u[maxn],v[maxn],du[maxn],edge[maxn];
  14. int main()
  15. {
  16. ios::sync_with_stdio(false);
  17. cin.tie(0);cout.tie(0);
  18. ll n;
  19. cin>>n;
  20. for(int i=0;i<n-1;i++)
  21. {
  22. cin>>u[i]>>v[i];
  23. du[u[i]]++;
  24. du[v[i]]++;
  25. edge[i]=-1;
  26. }
  27. ll m=0,flag=0;
  28. for(int i=1;i<n;i++)
  29. {
  30. if(flag) break;
  31. if(du[i]>=3)
  32. {
  33. for(int j=0;j<n-1;j++)
  34. {
  35. if(u[j]==i||v[j]==i)
  36. edge[j]=m++;
  37. if(m==3)
  38. {
  39. flag=1;
  40. break;
  41. }
  42. }
  43. }
  44. }
  45. for(int i=0;i<n-1;i++)
  46. {
  47. if(edge[i]==-1)
  48. edge[i]=m++;
  49. }
  50. for(int i=0;i<n-1;i++)
  51. cout<<edge[i]<<'\n';
  52. return 0;
  53. }

Ehab the Xorcist

题意:给你一个u,v ,让你求一个最小长度的数组满足

  1. 1.数组里所有数异或=u
  2. 2.数组的所有数和=v

我们分析数组异或值为u,保证最小长度,所以数组最长为3个:u,(v-u)/2, (v-u)/2
u⊕x⊕x=u 其中x=(v-u)/2;

a+b=a⊕b+2*(a&b)
所以:a+b>=a⊕b

&运算,全1位1,否则为0,
⊕运算,相同为0,不同为1,

所以我们分情况讨论
1.u>v 输出-1
2.u=v 输出1 u,最短的数组就是他本身。
对于 u,(v-u)/2, (v-u)/2 ,此时为0,u,不用证明就知道最小数组肯定就是u本身。

证明:
a+b=a⊕b+2*(a&b), 即a&b=0 ,说明a和b对应的位数只出现了最多1个1,所以不会牵扯到二进制加法的进制问题,即a+b=a⊕b,a+0=a⊕0

3.u<v

(1) (v-u)是奇数:输出-1,

证明:
我们只看最后一位:
偶⊕偶=偶,偶+偶=偶
偶⊕奇=奇,偶+奇=奇
奇⊕奇=偶,奇+奇=偶
所以我们可以看出,v-u 一定是偶数才可以找到数组。

(2) (v-u)是偶数:

我们考虑最小的是数组2个元素,
想法一:我们把u,(v-u)/2, (v-u)/2,前两项合并为(v-u)/2、(v+u)/2, 我们如果合并后两项在这里不符合条件,因为u⊕(v-u)=u ,v-u一定为0,不满足u<v
想法二: a+b=a⊕b+2*(a&b) a&b=(v-u)/2 a和b求&的值,此值一定满足如果二进制位上如果是1,a和b的此位也一定是1,a和b的其他位二者最多只有1个1。假设如果有1我们就放到a的二进制位上,则b的这一位就是0,此时的b就等于(v-u)/2 ,因为a+b=v,则a=(v+u)/2

最后判断一下(v-u)/2⊕(v+u)/2=u && (v-u)/2+(v+u)/2=v 满足就输出 这两个值;

以上都不满足最坏就是数组为3的情况,直接输出。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<map>
  5. #include<queue>
  6. #include<vector>
  7. #include<set>
  8. #include<sstream>
  9. using namespace std;
  10. typedef long long ll;
  11. const ll maxn=1e6+10;
  12. const ll inf=0x3f3f3f3f3f3f3f3f;
  13. int main()
  14. {
  15. ios::sync_with_stdio(false);
  16. cin.tie(0);cout.tie(0);
  17. ll u,v;
  18. cin>>u>>v;
  19. if(u>v||(v-u)&1)
  20. {
  21. cout<<"-1"<<endl;
  22. }
  23. else if(u==v&&v==0)
  24. {
  25. cout<<"0"<<endl;
  26. }
  27. else if(u==v&&u!=0&&v!=0)
  28. {
  29. cout<<1<<endl<<u<<endl;
  30. }
  31. else
  32. {
  33. ll a=(v-u)/2;
  34. ll b=(v+u)/2;
  35. ll ans=a^b;
  36. if((ans==u)&&(a+b==v))
  37. {
  38. cout<<2<<endl<<a<<" "<<b<<endl;
  39. }
  40. else
  41. {
  42. cout<<3<<endl<<u<<" "<<a<<" "<<a<<endl;
  43. }
  44. }
  45. return 0;
  46. }

发表评论

表情:
评论列表 (有 0 条评论,147人围观)

还没有评论,来说两句吧...

相关阅读