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


    C++ to Python

    给出一行C++代码,输出对应的Python代码。

    思路:省略字母,冒号,"_"输出即可。

    AC Code:

    1. #include
    2. int t;
    3. std::string s;
    4. int main(){
    5. std::ios::sync_with_stdio(false);
    6. std::cin.tie(0);
    7. std::cout.tie(0);
    8. std::cin>>t;
    9. while(t--){
    10. std::cin>>s;
    11. int len=s.length();
    12. for(int i=0;i
    13. if(s[i]=='s') std::cout<<'(';
    14. if(s[i]>='0'&&s[i]<='9') std::cout<
    15. if(s[i]==','||s[i]==')'||s[i]=='-') std::cout<
    16. }
    17. std::cout<<'\n';
    18. }
    19. return 0;
    20. }

    Snatch Groceries

    前面一大段没啥用,,看最后一段即可。给出若干区间,计算有多少不重叠的区间,注意,一旦遇到重叠的区间就不再计算了。

    思路:扫一遍讨论即可。

    AC Code:

    1. #include
    2. const int N=1e5+5;
    3. int t,n,l,r;
    4. struct node{
    5. int l,r;
    6. } e[N];
    7. bool cmp(node a,node b){
    8. if(a.lreturn true;
    9. else if(a.l==b.l&&a.rreturn true;
    10. else return false;
    11. }
    12. int main(){
    13. std::ios::sync_with_stdio(false);
    14. std::cin.tie(0);
    15. std::cout.tie(0);
    16. std::cin>>t;
    17. while(t--){
    18. std::cin>>n;
    19. for(int i=1;i<=n;i++){
    20. std::cin>>l>>r;
    21. e[i].l=l,e[i].r=r;
    22. }
    23. int cnt=0;
    24. std::sort(e+1,e+1+n,cmp);
    25. r=e[1].r;
    26. for(int i=2;i<=n;i++){
    27. if(r>=e[i].l) break;
    28. else cnt++,r=e[i].r;
    29. }
    30. if(r==e[n].r) cnt++;
    31. std::cout<'\n';
    32. }
    33. return 0;
    34. }

     os:很简单的题给队里贡献了两发WA,我是fw

    Luxury cruise ship

    给出一个long long范围内的数,判断是否可以用7,31,365组成,若能则输出最少组成所需要的个数,若不能输出-1。

    思路: 在n较小的范围内,可以直接暴力预处理得到答案,我们队取的这个范围是365*2,这个范围可以再大一些;较大时,先把n减去若干个365使其到我们预处理的范围,再判断。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. const int N=365;
    4. int t;
    5. ll n;
    6. std::vectora(N<<1+5,-1);
    7. void init(){
    8. a[0]=0;
    9. for(int i=1;i<=(N<<1);i++){
    10. for(int j=0;j<=i/31;j++){
    11. int tmp=i-31*j;
    12. if(tmp%7==0) a[i]=j+tmp/7;
    13. }
    14. }
    15. }
    16. int main(){
    17. std::ios::sync_with_stdio(false);
    18. std::cin.tie(0);
    19. std::cout.tie(0);
    20. init();
    21. std::cin>>t;
    22. while(t--){
    23. std::cin>>n;
    24. ll ans=n/365;
    25. ll res=n%365;
    26. if(a[res]==-1){
    27. if(ans==0) ans=-1;
    28. else ans=ans-1+a[res+365];
    29. }
    30. else ans+=a[res];
    31. std::cout<'\n';
    32. }
    33. return 0;
    34. }

    ShuanQ

    给出一些关系,如第二三四段那样,给出P,Q,ed,求满足条件的rd,若没有输出“shuanQ”。

    思路:由题目所说,可以得出P*Q-1=0 MOD M,即M是P*Q-1的质因子,处理一下质因数,挨个带入第三四段等式即可,注意限制条件,P,Q,ed

    AC Code:

    1. #include
    2. typedef long long ll;
    3. const int N=2e6+5;
    4. int t,cnt;
    5. ll p,q,e;
    6. ll prime[N];
    7. void pr(ll x){
    8. cnt=0;
    9. memset(prime,0,sizeof(prime));
    10. ll temp=x;
    11. for(int i=2;i<=sqrt(x);i++){
    12. if(x%i==0){
    13. prime[++cnt]=i;
    14. while(temp%i==0)
    15. temp/=i;
    16. }
    17. if(temp==1) break;
    18. }
    19. if(temp!=1)
    20. prime[++cnt]=temp;
    21. }
    22. int main(){
    23. std::ios::sync_with_stdio(false);
    24. std::cin.tie(0);
    25. std::cout.tie(0);
    26. std::cin>>t;
    27. while(t--){
    28. std::cin>>p>>q>>e;
    29. memset(prime,0,sizeof(prime));
    30. pr(p*q-1);
    31. ll ans=-1;
    32. for(int i=1;i<=cnt;i++){
    33. if(prime[i]<=e||prime[i]<=p||prime[i]<=q) continue;
    34. ll r=e*q%prime[i];
    35. ll E=r*p%prime[i];
    36. if(e==E){
    37. ans=r;
    38. break;
    39. }
    40. }
    41. if(ans==-1){
    42. std::cout<<"shuanQ"<<'\n';
    43. continue;
    44. }
    45. std::cout<'\n';
    46. }
    47. return 0;
    48. }

    os:这个题真的栓Q了,一开始队友推出来是二元一次方程,结果解了半天一直WA,没想到暴力就可以,乐了

    Copy

    给出一个序列,每次操作可以将某一段复制后放在该段后面,也可以询问某一位的数字,求最后所有被询问过的数字的异或和是多少。

    思路: (1)暴力:没想到这个题暴力就可以过,但是由于我对STL实在不熟练,学习一下别的大佬的代码;

    (2)正解:首先容易知道修改对后面的查询的影响,如果x<=r则无影响,否则相当于查询x-(r-l+1),因此可以离线,倒着修改每次操作,每个修改操作之后,对于x>r的,令x-=r-l+1。因为我们只需要答案的异或和,所以对于两次相同的查询可以抵消,因此同一位置最多只会查询一次,我们使用bitset表示每一位的信息。令f第i位为1表示答案需要对a[i]异或。倒着遍历所有操作,如果是查询操作,f[x]^=1,否则就令r+1....n这些位右移r-l+1,即:

    1. low=f&(~std::bitset(0)>>(N-r-1));
    2. high=f&(~std::bitset(0)<<(r+1));
    3. f=low^(high>>(r+1-l));

    low表示[1,r]部分,high表示[r+1,n]部分,每次操作将后面一部分向前移动r-l+1个单位,最后累加答案即可。

    AC Code:

    (1)暴力:

    1. #include
    2. int t,n,q;
    3. int main(){
    4. std::ios::sync_with_stdio(false);
    5. std::cin.tie(0);
    6. std::cout.tie(0);
    7. std::cin>>t;
    8. while(t--){
    9. std::cin>>n>>q;
    10. std::vector<int>a(n+1);
    11. for(int i=1;i<=n;i++){
    12. std::cin>>a[i];
    13. }
    14. int ans=0;
    15. for(int i=1;i<=q;i++){
    16. int op;
    17. std::cin>>op;
    18. if(op==1){
    19. int l,r;
    20. std::cin>>l>>r;
    21. auto p=a.begin()+r+1;
    22. auto L=a.begin()+l;
    23. auto R=a.begin()+r+1;
    24. auto del=a.begin()+n+1;
    25. if(del!=a.end()) a.erase(del,a.end());
    26. std::vector<int>vec(L,R);
    27. a.insert(p,vec.begin(),vec.end());
    28. }
    29. else{
    30. int pos;
    31. std::cin>>pos;
    32. ans^=a[pos];
    33. }
    34. }
    35. std::cout<'\n';
    36. }
    37. return 0;
    38. }

    (2)标解:

    1. #include
    2. #define int long long
    3. const int N=1e5+5;
    4. int t,n,m;
    5. int a[N],v[N][3];
    6. std::bitsetf,low,high;
    7. signed main(){
    8. std::ios::sync_with_stdio(false);
    9. std::cin.tie(0);
    10. std::cout.tie(0);
    11. std::cin>>t;
    12. while(t--){
    13. std::cin>>n>>m;
    14. for(int i=1;i<=n;i++){
    15. std::cin>>a[i];
    16. }
    17. for(int i=1;i<=m;i++){
    18. std::cin>>v[i][0];
    19. if(v[i][0]==1) std::cin>>v[i][1]>>v[i][2];
    20. else std::cin>>v[i][1];
    21. }
    22. f.reset();
    23. for(int i=m;i>=1;i--){
    24. if(v[i][0]==1){
    25. int l=v[i][1],r=v[i][2];
    26. low=f&(~std::bitset(0)>>(N-r-1));
    27. high=f&(~std::bitset(0)<<(r+1));
    28. f=low^(high>>(r+1-l));
    29. }
    30. else{
    31. int x=v[i][1];
    32. f[x]=!f[x];
    33. }
    34. }
    35. int ans=0;
    36. for(int i=1;i<=n;i++){
    37. if(f[i]) ans^=a[i];
    38. }
    39. std::cout<'\n';
    40. }
    41. return 0;
    42. }

    剩下的基本都触及知识盲区了,,好多线段树啊,不会啊呜呜呜

  • 相关阅读:
    讯飞输入法怎么用密语模式
    Bellman-Ford算法
    2024牛客暑期多校训练营7
    设计模式之兼容不同厂家的相机
    项目范围管理
    Flink 启用与配置检查点 Checkpoint
    sizeof()与strlen()在指针和数组笔试题(超详细!!!绝对有帮助!!!)
    next.js极速入门
    mysql--两个查询结果合并到一起,两表无关联关系。
    Windows操作系统基础-第01课-基础介绍与安装
  • 原文地址:https://blog.csdn.net/m0_62289613/article/details/126030171