• Educational Codeforces Round 138 (Rated for Div. 2)-赛后总结


    Dashboard - Educational Codeforces Round 138 (Rated for Div. 2) - Codeforces

    总结一个教训就是不要心急,特别是对于一些题目,发现越写越复杂的时候,一定及时转换思路

    Problem - A - Codeforces

    有意思的一道题,由于必须移动,那么枚举移动位置,移动位置必须空白,条件是,同行同列没有冲突或者仅有一个冲突(把该冲突点放在这个移动位置)

    1. #include
    2. using namespace std;
    3. typedef long long int ll;
    4. int a[100][100], x[100],y[100];
    5. int main ()
    6. {
    7. int t;
    8. cin>>t;
    9. while(t--)
    10. {
    11. int n,m;
    12. cin>>n>>m;
    13. for(int i=1;i<=n;i++)
    14. {
    15. for(int j=1;j<=m;j++)
    16. {
    17. a[i][j]=0;
    18. }
    19. }
    20. for(int i=1;i<=m;i++)
    21. {
    22. cin>>x[i]>>y[i];
    23. a[x[i]][y[i]]=1;
    24. }
    25. int flag=0;
    26. for(int i=1;i<=n;i++)
    27. {
    28. for(int j=1;j<=m;j++)
    29. {
    30. if(a[i][j]==0)
    31. {
    32. int cnt=0;
    33. for(int ii=1;ii<=n;ii++)
    34. {
    35. if(a[ii][j])
    36. cnt++;
    37. }
    38. for(int jj=1;jj<=m;jj++)
    39. {
    40. if(a[i][jj])
    41. cnt++;
    42. }
    43. if(cnt<=1)
    44. {
    45. flag=1;
    46. break;
    47. }
    48. }
    49. }
    50. }
    51. if(flag)
    52. {
    53. cout<<"YES"<
    54. }
    55. else
    56. {
    57. cout<<"NO"<
    58. }
    59. }
    60. return 0;
    61. }

    Problem - B - Codeforces

    B题真的是抽风了,本以为没开LL,开完又WA,白WA两次。实际上是贪心策略跑偏了。应该仔细研究模型,可见从一边开始进行消灭能使代价最小。这样每个人只能影响一次。减去最大值就行

    1. #include
    2. using namespace std;
    3. typedef long long int ll;
    4. int main ()
    5. {
    6. int t;
    7. cin>>t;
    8. while(t--)
    9. {
    10. int n;
    11. cin>>n;
    12. ll ans=0,x,y;
    13. for(int i=1; i<=n; i++)
    14. {
    15. cin>>x;
    16. ans+=x;
    17. }
    18. ll maxx=0;
    19. for(int i=1; i<=n; i++)
    20. {
    21. cin>>y;
    22. ans+=y;
    23. maxx=max(maxx,y);
    24. }
    25. cout<
    26. }
    27. return 0;
    28. }

    Problem - C - Codeforces

    C题算是一个小贪心与模拟

    A同学想赢就应该保证每次都有删的数,而我们已知,每次删的数是必须减少的。那么就容易推知,每次都删最大的。

    B同学为了让自己赢,就必须让A同学能删的越来越少,也就是把当前最小的给“破坏掉” 

    这样来看,n很小,k超过n的时候易知没有意义。故我们倒叙暴力枚举k,第一个答案就是我们要的。

    1. #include
    2. using namespace std;
    3. typedef long long int ll;
    4. int a[110],n;
    5. int temp[110];
    6. bool check(int k)
    7. {
    8. if(!k)
    9. return 1;
    10. for(int i=1; i<=n; i++)
    11. {
    12. temp[i]=a[i];
    13. }
    14. int now=1;
    15. while(now<=k)
    16. {
    17. int flag=0;
    18. int pos=0,maxx=0;
    19. for(int i=1; i<=n; i++)
    20. {
    21. if(temp[i]==-1)
    22. continue;
    23. if(temp[i]<=k-now+1&&maxx
    24. {
    25. pos=i;
    26. maxx=temp[i];
    27. flag=1;
    28. }
    29. }
    30. if(flag==0)
    31. {
    32. return 0;
    33. }
    34. temp[pos]=-1;
    35. pos=0;
    36. int minn=1e9;
    37. for(int i=1; i<=n; i++)
    38. {
    39. if(temp[i]==-1)
    40. continue;
    41. if(temp[i]
    42. {
    43. minn=temp[i];
    44. pos=i;
    45. }
    46. }
    47. temp[pos]+=k-now+1;
    48. now++;
    49. }
    50. return 1;
    51. }
    52. int main ()
    53. {
    54. int t;
    55. cin>>t;
    56. while(t--)
    57. {
    58. cin>>n;
    59. for(int i=1; i<=n; i++)
    60. {
    61. cin>>a[i];
    62. }
    63. for(int k=100; k>=0; k--)
    64. {
    65. if(check(k))
    66. {
    67. cout<
    68. break;
    69. }
    70. }
    71. }
    72. return 0;
    73. }

    Problem - D - Codeforces

    D的突破点在于他给定的数列定义,要求拥有两个所谓的“序列”。前面很多话都是把人绕远的,实际上突破点就在这个不起眼的地方。拥有大于等于两个所谓的序列是合法的,言外之意就是一个是不合法的。有可能是0个吗,不可能,从头一直删一定可以。

    这样就暗示我们,我们要排除的序列一定是只能从头往后删的,也就是说,我们位置i上面的数字,无论前面怎么缩短,始终找不到一个能使之gcd为1的位置(该位置小于等于i,通过消灭开头得到),既然如此,我们这样想,这个数字与前面的合数gcd不是1,与前面的质数gcd也不是1,特鄙视与质数gcd也不是1,那么其必定是前面所有质数的最小公倍数的若干倍,也就是前面所有质数的乘积!!那么前面的合数呢?合数就是两个质数的积!!,质数满足合数一定满足!

    所以我们只需要预处理出n范围内全部质数,求出质数前缀积,每个位置也就有了方案数,乘法原理搞一搞,排斥一下即可

    代码请在CF  C++20版本下提交

    1. #include
    2. # define mod 998244353
    3. using namespace std;
    4. typedef __int128 ll;
    5. ll n,m;
    6. ll dp[300000+10];
    7. int prime[300000+10],not_prime[300000+10],len;
    8. void init()
    9. {
    10. for(int i=2;i<=300000;i++)
    11. {
    12. if(!not_prime[i])
    13. {
    14. len++;
    15. prime[len]=i;
    16. }
    17. for(int j=1;j<=len&&prime[j]*i<=300000;j++)
    18. {
    19. not_prime[i*prime[j]]=1;
    20. if(i%prime[j]==0)
    21. break;
    22. }
    23. }
    24. }
    25. ll x[300000+10];
    26. __int128 read(){
    27. __int128 x=0,f=1;
    28. char ch=getchar();
    29. while(!isdigit(ch)&&ch!='-')ch=getchar();
    30. if(ch=='-')f=-1,ch=getchar();
    31. while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    32. return f*x;
    33. }
    34. void print(__int128 x){
    35. if(x<0)putchar('-'),x=-x;
    36. if(x>9)print(x/10);
    37. putchar(x%10+'0');
    38. }
    39. int main()
    40. {
    41. n=read();
    42. m=read();
    43. init();
    44. ll sum=0,now=1;
    45. ll tempm=m%mod;
    46. for(int i=1;i<=n;i++)
    47. {
    48. now=(now*m)%mod;
    49. now%=mod;
    50. sum=(sum+now)%mod;
    51. }
    52. x[0]=1;
    53. x[1]=1;
    54. for(int i=1;i<=n;i++)
    55. {
    56. if(!not_prime[i])
    57. {
    58. x[i]=x[i-1]*i;
    59. }
    60. else
    61. {
    62. x[i]=x[i-1];
    63. }
    64. }
    65. ll temp=1;
    66. for(int i=1;i<=n;i++)
    67. {
    68. dp[i]=m/x[i];
    69. temp*=dp[i];
    70. temp%=mod;
    71. sum=((sum-temp)%mod+mod)%mod;
    72. }
    73. print(sum);
    74. return 0;
    75. }

  • 相关阅读:
    多源视频融合平台VMS/smarteye,免费的GB28181 server, 免费的RTMP推流server,RTSP server
    Android-Firebase合规问题解决方案-详细攻略,debug模式破解难题
    分布式技术之dubbo二
    【洛谷题解/ZJOI2005】P2585 三色二叉树
    深入聊聊Linux五种IO模型
    (二)实现Bean属性依赖注入功能【手撸Spring】
    jscpd对项目进行查重(支持150+类语言)
    vscode软件安装包下载安装教程
    微服务架构项目open-cloud的认证方式及单点登录应用
    怎样从零开始训练一个AI车手?
  • 原文地址:https://blog.csdn.net/jisuanji2606414/article/details/127438314