A:签到。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inf 1000000010
  5. #define N 510
  6. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  7. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  8. int read()
  9. {
  10. int x=0,f=1;char c=getchar();
  11. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  12. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  13. return x*f;
  14. }
  15. int n,k,a[N],f[N*N],t;
  16. signed main()
  17. {
  18. n=read(),k=read();
  19. for (int i=1;i<=n;i++) a[i]=read();
  20. for (int i=1;i<=n;i++)
  21. for (int j=i+1;j<=n;j++)
  22. f[++t]=a[i]+a[j];
  23. sort(f+1,f+t+1);reverse(f+1,f+t+1);
  24. ll ans=0;
  25. for (int i=1;i<=k;i++) ans+=f[i];
  26. cout<<ans;
  27. return 0;
  28. //NOTICE LONG LONG!!!!!
  29. }

  B:找到第一个和最后一个有1的列,状压dp一下即可,即设f[i][0/1][0/1]为第i列为0/1,0/1时的最优方案要加多少个1。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inf 1000000010
  5. #define N 100010
  6. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  7. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  8. int read()
  9. {
  10. int x=0,f=1;char c=getchar();
  11. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  12. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  13. return x*f;
  14. }
  15. int n,a[N][2],f[N][2][2],first,last,ans;
  16. signed main()
  17. {
  18. n=read();
  19. for (int i=1;i<=n;i++) a[i][0]=read();
  20. for (int i=1;i<=n;i++) a[i][1]=read();
  21. for (int i=1;i<=n;i++) if (a[i][0]||a[i][1]) {first=i;break;}
  22. for (int i=n;i>=1;i--) if (a[i][0]||a[i][1]) {last=i;break;}
  23. memset(f,42,sizeof(f));f[first-1][1][1]=0;
  24. for (int i=first;i<=last;i++)
  25. {
  26. for (int x0=0;x0<2;x0++)
  27. for (int x1=0;x1<2;x1++)
  28. for (int y0=0;y0<2;y0++)
  29. for (int y1=0;y1<2;y1++)
  30. {
  31. int tot=0;
  32. if (a[i][0]==0&&x0==1) tot++;
  33. if (a[i][1]==0&&x1==1) tot++;
  34. if (x0==1&&y0==1||x1==1&&y1==1) f[i][x0][x1]=min(f[i][x0][x1],f[i-1][y0][y1]+tot);
  35. }
  36. }
  37. ans=1000000000;
  38. for (int i=0;i<2;i++)
  39. for (int j=0;j<2;j++)
  40. ans=min(ans,f[last][i][j]);
  41. cout<<ans;
  42. return 0;
  43. //NOTICE LONG LONG!!!!!
  44. }

  C:容易发现子序列中一个数的贡献是2l,而只需要考虑其是否是m的倍数,于是l超过logm后就没什么意义了。于是设f[i][j][k]为前i个数选了模m为j的k个数的方案数,转移显然。复杂度O(nmlogm),直接就可以暴力过去。事实上应该是可以做到O(nm)的,因为只需要考虑模m/2k的值。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inf 1000000010
  5. #define N 5010
  6. #define P 1000000007
  7. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  8. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  9. int read()
  10. {
  11. int x=0,f=1;char c=getchar();
  12. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  13. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  14. return x*f;
  15. }
  16. int n,m,a[N],f[15][N],g[N],t;
  17. inline void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
  18. inline int dec(int x,int y){x-=y;if (x<0) x+=m;return x;}
  19. signed main()
  20. {
  21. n=read(),m=read();int tmp=m;while (tmp%2==0) t++,tmp>>=1;t++;
  22. for (int i=1;i<=n;i++) a[i]=read();
  23. f[0][0]=1;
  24. for (int i=1;i<=n;i++)
  25. {
  26. for (int j=0;j<m;j++) g[j]=f[t][j];
  27. for (int j=0;j<m;j++) inc(f[t][j],g[dec(j,a[i])]);
  28. for (int k=t;k;k--)
  29. {
  30. for (int j=0;j<m;j++)
  31. {
  32. inc(f[k][j],f[k-1][dec(j,a[i])]);
  33. }
  34. }
  35. }
  36. int ans=0;
  37. for (int i=0;i<m;i++)
  38. for (int j=1;j<=t;j++)
  39. {
  40. int x=i;for (int _=1;_<j;_++) x=(x<<1)%m;
  41. if (x==0) inc(ans,f[j][i]);
  42. }
  43. cout<<ans;
  44. return 0;
  45. //NOTICE LONG LONG!!!!!
  46. }

  D:差分序列,则区间修改变成单点修改,然后只要维护区间线性基即可,注意要强制令第一个数是否选,这样才能考虑完选偶数个数和奇数个数的情况。开始莫名其妙想成了前缀和,然后发现了一个选奇数个数的最大异或和的做法,即将每个数比最高位更高的一位设为1。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inf 1000000010
  5. #define N 50010
  6. #define P 1000000007
  7. #define uint int
  8. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
  9. int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
  10. int read()
  11. {
  12. int x=0,f=1;char c=getchar();
  13. while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
  14. while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
  15. return x*f;
  16. }
  17. int n,m,L[N<<2],R[N<<2],tree_o[N];
  18. int a[N],mx;
  19. void modify_o(int x,int y){while (x<=n) tree_o[x]^=y,x+=x&-x;}
  20. int query_o(int x){int s=0;while (x) s^=tree_o[x],x-=x&-x;return s;}
  21. struct base
  22. {
  23. int b[32];
  24. void ins(int v)
  25. {
  26. for (int i=30;~i;i--)
  27. if (v&(1<<i))
  28. {
  29. if (b[i]==0) {b[i]=v;return;}
  30. else v^=b[i];
  31. }
  32. }
  33. int work(int v)
  34. {
  35. for (int i=30;~i;i--) v=max(v,v^b[i]);
  36. return v;
  37. }
  38. void clear(){memset(b,0,sizeof(b));}
  39. }tree[N<<2],e;
  40. base merge(base x,base y)
  41. {
  42. for (int i=30;~i;i--)
  43. if (x.b[i]) y.ins(x.b[i]);
  44. return y;
  45. }
  46. void build(int k,int l,int r)
  47. {
  48. L[k]=l,R[k]=r;
  49. if (l==r) {tree[k].ins(a[l]);return;}
  50. int mid=l+r>>1;
  51. build(k<<1,l,mid);
  52. build(k<<1|1,mid+1,r);
  53. tree[k]=merge(tree[k<<1],tree[k<<1|1]);
  54. }
  55. void modify(int k,int x,int p)
  56. {
  57. if (L[k]==R[k]) {tree[k].clear();a[x]^=p;modify_o(x,p);tree[k].ins(a[x]);return;}
  58. int mid=L[k]+R[k]>>1;
  59. if (x<=mid) modify(k<<1,x,p);
  60. else modify(k<<1|1,x,p);
  61. tree[k]=merge(tree[k<<1],tree[k<<1|1]);
  62. }//给x xor 上p
  63. base query(int k,int l,int r)
  64. {
  65. if (l>r) return e;
  66. if (L[k]==l&&R[k]==r) return tree[k];
  67. int mid=L[k]+R[k]>>1;
  68. if (r<=mid) return query(k<<1,l,r);
  69. else if (l>mid) return query(k<<1|1,l,r);
  70. else return merge(query(k<<1,l,mid),query(k<<1|1,mid+1,r));
  71. }//区间线性基
  72. signed main()
  73. {
  74. n=read(),m=read();
  75. for (int i=1;i<=n;i++) a[i]=read();
  76. for (int i=n;i;i--) a[i]^=a[i-1],modify_o(i,a[i]);
  77. build(1,0,n);
  78. while (m--)
  79. {
  80. int op=read(),l=read(),r=read();
  81. int v=read();
  82. if (op==1)
  83. {
  84. modify(1,l,v);
  85. if (r<n) modify(1,r+1,v);
  86. }
  87. else
  88. {
  89. int ans=max(query(1,l+1,r).work(v),query(1,l+1,r).work(v^query_o(l)));
  90. printf("%d\n",ans);
  91. }
  92. }
  93. return 0;
  94. //NOTICE LONG LONG!!!!!
  95. }

  小裙子!

Comet OJ Contest #3的更多相关文章

  1. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  2. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  3. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  4. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  5. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  6. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  7. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  8. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)

    来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...

  9. Comet OJ - Contest #5

    Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...

  10. Comet OJ Contest #13 D

    Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...

随机推荐

  1. DCL:管理用户

    1. 管理用户 (1) 查询用户 MySQL把用户的数据存放在 "mysql" 数据库的 "user" 表中. SELECT * FROM user; (2) ...

  2. jQuery之编写插件

    一.学习插件编写背景 作为一名前端人员,应该注重前端复用性及组件化,更应该考虑前端的性能优化,做到代码简洁有序,不冗余.特别是在大型团队中,如果一个团队中存在多个功能相似的组件,举个栗子,拿分页组件举 ...

  3. arcgis python 调用工具两种两种方法

    arcpy.Select_analysis("p","kk") arcpy.analysis.Select("p","kk1&qu ...

  4. P5662 纪念品

    P5662 纪念品 题解 拿到题目想到DP,但是就是不知道咋写 后来证实这是个背包DP(最近整理背包白整了 我们观察这道题目的特殊之处: 也就是说,对于手中的物品,我们可以今天买了然后明天早上接着卖出 ...

  5. xss绕过姿势

    #未完待续... 00x1.绕过 magic_quotes_gpc magic_quotes_gpc=ON 是php中的安全设置,开启后会把一些特殊字符进行轮换, 比如: ' 会被转换为 \' 再比如 ...

  6. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_11-前端显示当前用户-前端请求jwt

    前端代码 sessionStorage也是key/value的格式 页头显示当前用户 查询jwt nginx里面的配置 测试 开启认证服务 进行登陆 跳转到首页就应该立即请求查询. 跳转到首页 coo ...

  7. Delphi分割字符串函数Split源码

    function TStringHelper.Split(const Separator: array of string; Count: Integer; Options: TStringSplit ...

  8. 怎么用Ubuntu系统制作Ubuntu系统盘

    ubuntu 16 下载地址: http://releases.ubuntu.com/16.04/?_ga=2.211639766.273896083.1564759714-49163328.1564 ...

  9. mysql新建数据库(database)设置为utf8

    CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

  10. 无权限安装vim8

    本文介绍Ubuntu14.04在没有sudo权限的情况下安装vim8 1.默认vim版本为7.3 $ vim --versionVIM - Vi IMproved 7.3 (2010 Aug 15, ...