• 2022“杭电杯”中国大学生算法设计超级联赛(2)(持续更新)


    还是太菜了,一定抽时间把杭电能补的补完

    目录

            1002 C++ to Python(签到)

    1003 Copy

    1007 Snatch Groceries(签到,四六级阅读题)

    1009 ShuanQ(数学,思维)

    1012 Luxury cruise ship(思维)


    1002 C++ to Python(签到)

    直接判断是否符合条件输出即可

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N =5e5+10,mod=998244353;
    5. void solve()
    6. {
    7. string s,s1="";
    8. cin>>s;
    9. for(int i=0;i
    10. {
    11. if((s[i]>='0'&&s[i]<='9')||s[i]=='('||s[i]==')'||s[i]==','||s[i]=='-')
    12. s1+=s[i];
    13. }
    14. cout<"\n";
    15. return ;
    16. }
    17. signed main()
    18. {
    19. int t;
    20. cin>>t;
    21. while(t--)
    22. solve();
    23. return 0;
    24. }

    1003 Copy

    思路:首先明确一件事,题目要求我们求异或和.如果一个数字被选中偶数次,那么在最终的异或和的贡献就为0,而为奇数则对结果贡献为本身.只含有01状态,所以我们想到可以采用bitset来表示这个区间内的数字被选取的情况,选取偶数次就为0,奇数次为1,每一位对应当前位置的数字是否被选择.

    然后就是对于题目中1,2操作的模拟.如果正向模拟会发现很难处理,这个时候如果把操作反着进行,会发现思路:

     每次我们对于某个位置进行2操作处理的话,那么这个位置的bitset值就会取反.如果是一操作的话,因为我们是倒着处理,那么完全可以把有原bitset中的r+1到N这一段进行向左(图中是向左,但是bitset相反)移动,直到r+1覆盖到 l 的位置,因为是倒着来的,所以我们后面的r+1到N其实是l到r这个区间后移得到的,那我们反着来前移就会返回上一步的状态,而且也不会影响结果,所以反着来模拟即可.我们把r+1到N和1到r这一段进行异或,为1的区间就表示这个点还是会被选中.

    1. #include
    2. using namespace std;
    3. const int N=1e5+10;
    4. bitsetf,bef,now;
    5. int a[N];
    6. int op[N][3];
    7. void solve()
    8. {
    9. int n,m;
    10. f.reset();
    11. bef.reset();
    12. now.reset();
    13. cin>>n>>m;
    14. for(int i=1;i<=n;i++)
    15. cin>>a[i];
    16. for(int i=1;i<=m;i++)
    17. {
    18. cin>>op[i][0];
    19. if(op[i][0]==1)
    20. cin>>op[i][1]>>op[i][2];
    21. else
    22. cin>>op[i][1];
    23. }
    24. //已知取偶数次进行异或相当于没有取,所以想到bitset
    25. for(int i=m;i>=1;i--)
    26. {
    27. if(op[i][0]==1)
    28. {
    29. int l=op[i][1],r=op[i][2];
    30. bitsettemp;
    31. temp.set();
    32. bef=f&(temp>>(N-r-1));
    33. //取得0-r这一段
    34. temp.set();
    35. now=f&(temp<<(r+1));
    36. //取得r+1-n这一段
    37. f=bef^(now>>(r-l+1));
    38. //看移动后相交区域
    39. }
    40. else
    41. {
    42. int x=op[i][1];
    43. f[x]=!f[x];
    44. }
    45. }
    46. int res=0;
    47. for(int i=1;i<=n;i++)
    48. if(f[i])
    49. res^=a[i];
    50. cout<
    51. return ;
    52. }
    53. signed main()
    54. {
    55. cin.tie(0);
    56. cout.tie(0);
    57. ios::sync_with_stdio(0);
    58. int t;
    59. cin>>t;
    60. while(t--)
    61. solve();
    62. return 0;
    63. }

    1007 Snatch Groceries(签到,四六级阅读题)

    直接判断哪些线段没有和其他线段相交即可

    1. #include
    2. #include
    3. using namespace std;
    4. const int N = 1e5 + 10;
    5. struct edge
    6. {
    7. int l,r;
    8. bool operator < (const edge & A)const{
    9. if(l == A.l) return r < A.r;
    10. return l < A.l;
    11. }
    12. }e[N];
    13. void solve()
    14. {
    15. int n;
    16. scanf("%d",&n);
    17. int ans = 0;
    18. for(int i=1;i<=n;i++)
    19. {
    20. scanf("%d%d",&e[i].l,&e[i].r);
    21. }
    22. sort(e+1,e+1+n);
    23. for(int i=1;i<=n;i++)
    24. {
    25. if((i + 1 <= n && e[i + 1].l > e[i].r) || i == n)ans ++;
    26. else break;
    27. }
    28. printf("%d\n",ans);
    29. }
    30. int main()
    31. {
    32. int T;
    33. scanf("%d",&T);
    34. while(T--)solve();
    35. return 0;
    36. }

    1009 ShuanQ(数学,思维)

    思路:我们可以把式子转化一下变为:

    P*Q-1=k*m

    由此可以知道m是p*q-1的一个质因子,又因为要满足m>=p且m>=q.所以我们直接用质因数分解来求出p*q-1的最大质因子,这个就是m的值,再check一下m和p,q的值即可

    1. #include
    2. #define int long long
    3. using namespace std;
    4. void solve()
    5. {
    6. int p,q,en;
    7. cin>>p>>q>>en;
    8. int m=p*q-1;
    9. for(int i=2;i*i<=m;i++)
    10. while(m%i==0)
    11. m/=i;
    12. if(m
    13. cout<<"shuanQ"<
    14. else
    15. {
    16. int ans=en*q%m;
    17. cout<
    18. }
    19. return ;
    20. }
    21. signed main()
    22. {
    23. cin.tie(0);
    24. cout.tie(0);
    25. ios::sync_with_stdio(0);
    26. int t;
    27. cin>>t;
    28. while(t--)
    29. solve();
    30. return 0;
    31. }

    1012 Luxury cruise ship(思维)

    思路:去年好像在cf上做过类似的题.我们先求出7,31,365的最小公倍数,因为三者互质,直接相乘即可.然后用n%lcm,整除lcm的部分我们用贪心去算,因为是7,31,365的公倍数,所以我们直接全部用365装就是最优解.然后剩下的部分也不大,直接三层for循环跑一下就行了(背包也可以,反正剩下部分不大,直接瞎搞)

    1. #include
    2. #define int long long
    3. using namespace std;
    4. const int N =5e5+10,mod=998244353;
    5. void solve()
    6. {
    7. int n,lcm=7*31*365;
    8. cin>>n;
    9. if(n>=lcm)
    10. {
    11. int temp=n/lcm;
    12. n%=lcm;
    13. int ans=1e18;
    14. for(int i=0;i*365<=n;i++)
    15. {
    16. for(int j=0;j*31<=n;j++)
    17. {
    18. if(n-i*365-j*31<0)
    19. break;
    20. if((n-i*365-j*31)%7==0)
    21. {
    22. ans=min(ans,i+j+(n-i*365-j*31)/7);
    23. }
    24. }
    25. }
    26. if(ans==1e18)
    27. {
    28. cout<<"-1\n";
    29. }
    30. else
    31. {
    32. ans+=temp*7*31;
    33. cout<"\n";
    34. }
    35. }
    36. else
    37. {
    38. int ans=1e18;
    39. for(int i=0;i*365<=n;i++)
    40. {
    41. for(int j=0;j*31<=n;j++)
    42. {
    43. if(n-i*365-j*31<0)
    44. break;
    45. if((n-i*365-j*31)%7==0)
    46. {
    47. ans=min(ans,i+j+(n-i*365-j*31)/7);
    48. }
    49. }
    50. }
    51. if(ans==1e18)
    52. {
    53. cout<<"-1\n";
    54. }
    55. else
    56. {
    57. cout<"\n";
    58. }
    59. }
    60. return ;
    61. }
    62. signed main()
    63. {
    64. int t;
    65. cin>>t;
    66. while(t--)
    67. solve();
    68. return 0;
    69. }
    70. //genius

  • 相关阅读:
    11.9 实现磁盘相关操作
    ComponentSpace SAML Suite Crack
    从 B 站出发,用 Chrome devTools performance 分析页面如何渲染
    Impala字符串截取left、right、substr/substring
    clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace
    volatile原理解析
    Hadoop伪分布式环境搭建
    面试题-React(十一):性能优化之PureComponent和memo
    一步解决Logcat日志错误:read: unexpected EOF!
    rxjs pipeable operators(下)
  • 原文地址:https://blog.csdn.net/qq_49593247/article/details/126078504