题面:https://www.cnblogs.com/Juve/articles/11479415.html

T1:高精度gcd,其实不用写高精度取模,gcd还有一种求法

  1. int gcd(int a,int b){
  2. if(a==b) return a;
  3. if(a%2==0&&b%2==0) return 2*gcd(a/2,b/2);
  4. if(a%2==0) return gcd(a/2,b);
  5. if(b%2==0) return gcd(a,b/2);
  6. if(a<b) swap(a,b);
  7. return gcd(a-b,b);
  8. }

然后愉快地AC

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define int long long
  5. #define re register
  6. using namespace std;
  7. int t,la,lb,c[105];
  8. char a[105],b[105];
  9. struct bigint{
  10. int m[105];
  11. bigint(){memset(m,0,sizeof(m));}
  12. inline friend void operator *= (bigint &a,re int b){
  13. int x=0;
  14. for(re int i=1;i<=a.m[0];i++){
  15. re int y=a.m[i]*b+x;
  16. a.m[i]=y%10;
  17. x=y/10;
  18. }
  19. while(x){
  20. a.m[++a.m[0]]=x%10;
  21. x/=10;
  22. }
  23. }
  24. inline friend void operator /= (bigint &a,re int b){
  25. re int x=0;
  26. for(re int i=a.m[0];i>=1;i--){
  27. x+=a.m[i];
  28. a.m[i]=x/b;
  29. x%=b;
  30. x*=10;
  31. }
  32. while(a.m[a.m[0]]==0&&a.m[0]>1)
  33. a.m[0]--;
  34. }
  35. inline friend bigint operator - (bigint a,bigint b){
  36. bigint c;
  37. re int i=1;
  38. while((i<=a.m[0])||(i<=b.m[0])){
  39. if(a.m[i]<b.m[i]){
  40. a.m[i]+=10;
  41. a.m[i+1]--;
  42. }
  43. c.m[i]=a.m[i]-b.m[i];
  44. i++;
  45. }
  46. while(c.m[i]==0&&i>1)
  47. i--;
  48. c.m[0]=i;
  49. return c;
  50. }
  51. inline friend bool operator >= (bigint a,bigint b){
  52. if(a.m[0]>b.m[0]) return 1;
  53. if(a.m[0]<b.m[0]) return 0;
  54. for(int i=a.m[0];i>=1;--i){
  55. if(a.m[i]==b.m[i]) continue;
  56. return a.m[i]>b.m[i];
  57. }
  58. return 1;
  59. }
  60. inline friend bool operator == (bigint a,bigint b){
  61. int p=a.m[0],q=b.m[0];
  62. if(p!=q) return 0;
  63. for(int i=1;i<=p;++i){
  64. if(a.m[i]!=b.m[i]) return 0;
  65. }
  66. return 1;
  67. }
  68. inline friend void print(bigint a){
  69. for(re int i=a.m[0];i>=1;i--)
  70. printf("%lld",a.m[i]);
  71. puts("");
  72. }
  73. }n,m;
  74. bool judge(bigint a){
  75. int p=a.m[1];
  76. //cout<<p<<endl;
  77. if(p%2==0) return 1;
  78. return 0;
  79. }
  80. bool check(bigint a,bigint b){
  81. //print(a),print(b);
  82. if(a==b){
  83. if(a.m[0]==1&&a.m[1]==1) return 1;
  84. else return 0;
  85. }
  86. bool p=judge(a),q=judge(b);
  87. //cout<<p<<' '<<q<<endl;
  88. if(p&&q) return 0;
  89. if(p){
  90. a/=2;
  91. return check(a,b);
  92. }
  93. if(q){
  94. b/=2;
  95. return check(a,b);
  96. }
  97. if(!(a>=b)) swap(a,b);
  98. return check(a-b,b);
  99. }
  100. int gcd(int a,int b){
  101. if(a==b) return a;
  102. if(a%2==0&&b%2==0) return 2*gcd(a/2,b/2);
  103. if(a%2==0) return gcd(a/2,b);
  104. if(b%2==0) return gcd(a,b/2);
  105. if(a<b) swap(a,b);
  106. return gcd(a-b,b);
  107. }
  108. signed main(){
  109. scanf("%lld",&t);
  110. while(t--){
  111. memset(n.m,0,sizeof(n.m));
  112. memset(m.m,0,sizeof(m.m));
  113. scanf("%s %s",a+1,b+1);
  114. la=strlen(a+1),lb=strlen(b+1);
  115. n.m[0]=la,m.m[0]=lb;
  116. for(int i=1;i<=la;++i) n.m[la-i+1]=a[i]-'0';
  117. for(int i=1;i<=lb;++i) m.m[lb-i+1]=b[i]-'0';
  118. if(check(n,m)==1) puts("Yes");
  119. else puts("No");
  120. }
  121. return 0;
  122. }

T2:

正解$O(n)$,数状数组卡常可A

$sum_i$表示前缀和

我们对于每一个i,求出$sum_i-sum_{j-1}>\frac{i-j+1}{2}(j<i)$的数量

然后就转化成了$2sum_i-i>2sum_{j-1}-(j-1)$,然后数状数组即可

然后用总区间减去不合法的即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #define re register
  7. using namespace std;
  8. const int MAXN=5e6+5;
  9. int n,sum0[MAXN],sum1[MAXN],sum2[MAXN],sum[MAXN];
  10. char a[MAXN],ch;
  11. long long ans=0;
  12. struct BIT_tree{
  13. int c[MAXN*3];
  14. inline int lowbit(re int x){
  15. return x&-x;
  16. }
  17. inline void add(re int pos){
  18. //cout<<pos<<' '<<val<<endl;
  19. while(pos<=2*n){
  20. ++c[pos];
  21. pos+=lowbit(pos);
  22. //cout<<pos<<endl;
  23. }
  24. }
  25. inline int query(re int pos){
  26. re int res=0;
  27. while(pos>0){
  28. res+=c[pos];
  29. pos-=lowbit(pos);
  30. }
  31. return res;
  32. }
  33. }tr[3];
  34. signed main(){
  35. //freopen("ex4.in","r",stdin);
  36. scanf("%d",&n);
  37. scanf("%s",a+1);
  38. for(re int i=1;i<=n;++i){
  39. sum0[i]=sum0[i-1],sum1[i]=sum1[i-1],sum2[i]=sum2[i-1];
  40. if(a[i]=='0') ++sum0[i];
  41. if(a[i]=='1') ++sum1[i];
  42. if(a[i]=='2') ++sum2[i];
  43. tr[0].add(2*sum0[i-1]-i+n+2);
  44. ans+=tr[0].query(2*sum0[i]-i+n);
  45. tr[1].add(2*sum1[i-1]-i+n+2);
  46. ans+=tr[1].query(2*sum1[i]-i+n);
  47. tr[2].add(2*sum2[i-1]-i+n+2);
  48. ans+=tr[2].query(2*sum2[i]-i+n);
  49. }
  50. printf("%lld\n",(1ll*n*(n+1)/2)-ans);
  51. return 0;
  52. }

%%正解大佬gby

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #define lowbit(x) ((x)&(-(x)))
  5. #define N 5555555
  6. #define LL long long
  7. #define pre(i,j) pre[(i)+nn][j]
  8. #define tb(i,j) tb[(i)+nn][j]
  9.  
  10. using namespace std;
  11.  
  12. int nn,pre[2*N][3],tb[2*N][3];
  13. char arr[N];
  14. int dat[N][3];
  15. LL ans;
  16. int main(){
  17. scanf("%d",&nn);
  18. scanf("%s",arr+1);
  19. for(int i=1;i<=nn;i++){
  20. dat[i][0]=dat[i-1][0]+1;
  21. dat[i][1]=dat[i-1][1]+1;
  22. dat[i][2]=dat[i-1][2]+1;
  23. dat[i][arr[i]-'0']-=2;
  24. }
  25. /*for(int i=0;i<=2;i++){
  26. printf("%d:",i);
  27. for(int j=1;j<=nn;j++)
  28. cout<<dat[j][i]<<" ";
  29. cout<<endl;
  30. }*/
  31. ans=(long long)nn*(nn+1)/2;
  32. //cout<<ans<<endl;
  33. pre(0,0)++,pre(0,1)++,pre(0,2)++;
  34. tb(0,0)++ ,tb(0,1)++, tb(0,2)++;
  35. static int lst[3];
  36. for(int i=1;i<=nn;i++){
  37. for(int k=0;k<=2;k++){
  38. tb(dat[i][k],k)++;
  39. if(dat[i][k]==lst[k]+1){
  40. pre(dat[i][k],k)=pre(lst[k],k)+tb(dat[i][k],k);
  41. }
  42. else {//dat[i][k]==lst[k]-1
  43. pre(dat[i][k],k)=pre(dat[i][k]-1,k)+tb(dat[i][k],k);
  44. pre(lst[k],k)=pre(dat[i][k],k)+tb(lst[k],k);
  45. }
  46. ans-=i+1-pre(dat[i][k],k);
  47. // cout<<k<<":"<<i+1-pre(dat[i][k],k)<<endl;
  48. }
  49. lst[0]=dat[i][0];
  50. lst[1]=dat[i][1];
  51. lst[2]=dat[i][2];
  52. /*for(int i=0;i<=2;i++){
  53. printf("%d:",i);
  54. for(int j=-nn;j<=nn;j++)
  55. cout<<pre(j,i)<<" ";
  56. cout<<endl;
  57. }*/
  58. }
  59. cout<<ans<<endl;
  60. }

T3:

wqs二分

首先一个暴力dp:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define re register
  5. using namespace std;
  6. const int MAXN=100005;
  7. int n,a,b;
  8. double p[MAXN],q[MAXN],ans=0.0,f[2][605][605];
  9. inline double max(re double a,re double b){
  10. return a>b?a:b;
  11. }
  12. signed main(){
  13. while(~scanf("%d%d%d",&n,&a,&b)){
  14. //memset(f,0,sizeof(f));
  15. for(re int i=1;i<=n;++i) scanf("%lf",&p[i]);
  16. for(re int i=1;i<=n;++i) scanf("%lf",&q[i]);
  17. ans=0.0;
  18. //f[0][0][0]=0;
  19. memset(f[0],0,sizeof(f[0]));
  20. for(re int i=1;i<=n;++i){
  21. for(re int j=0;j<=min(a,n);++j){
  22. for(re int k=0;k<=min(b,n);++k){
  23. f[i&1][j][k]=f[i&1^1][j][k];
  24. if(j!=0) f[i&1][j][k]=max(f[i&1][j][k],f[i&1^1][j-1][k]+p[i]);
  25. if(k!=0) f[i&1][j][k]=max(f[i&1][j][k],f[i&1^1][j][k-1]+q[i]);
  26. if(j!=0&&k!=0)
  27. f[i&1][j][k]=max(f[i&1][j][k],f[i&1^1][j-1][k-1]+p[i]+q[i]-p[i]*q[i]);
  28. }
  29. }
  30. }
  31. printf("%0.3lf\n",f[n&1][a][b]);
  32. }
  33. return 0;
  34. }

然后优化:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define re register
  5. #define eps 1e-8
  6. using namespace std;
  7. const int MAXN=100005;
  8. int n,a,b;
  9. double p[MAXN],q[MAXN],ans=0.0,l,r,L,R,f[MAXN],fa[MAXN],fb[MAXN];
  10. inline double max(re double a,re double b){
  11. return a>b?a:b;
  12. }
  13. bool judge(double na,double nb){
  14. memset(f,0,sizeof(f));
  15. memset(fa,0,sizeof(fa));
  16. memset(fb,0,sizeof(fb));
  17. for(int i=1;i<=n;i++){
  18. f[i]=f[i-1],fa[i]=fa[i-1],fb[i]=fb[i-1];
  19. if(f[i-1]+p[i]>f[i]+na)
  20. f[i]=f[i-1]+p[i]-na,fa[i]=fa[i-1]+1,fb[i]=fb[i-1];
  21. if(f[i-1]+q[i]>f[i]+nb)
  22. f[i]=f[i-1]+q[i]-nb,fb[i]=fb[i-1]+1,fa[i]=fa[i-1];
  23. if(f[i-1]+p[i]+q[i]-p[i]*q[i]>f[i]+na+nb)
  24. f[i]=f[i-1]+p[i]+q[i]-p[i]*q[i]-na-nb,fa[i]=fa[i-1]+1,fb[i]=fb[i-1]+1;
  25. }
  26. return fb[n]>b;
  27. }
  28. bool check(double na){
  29. L=0.0,R=1.0;
  30. while(R-L>eps){
  31. double mid=(L+R)/2.0;
  32. if(judge(na,mid)) L=mid;
  33. else R=mid;
  34. }
  35. judge(na,R);
  36. return fa[n]>a;
  37. }
  38. signed main(){
  39. while(~scanf("%d%d%d",&n,&a,&b)){
  40. for(re int i=1;i<=n;++i) scanf("%lf",&p[i]);
  41. for(re int i=1;i<=n;++i) scanf("%lf",&q[i]);
  42. l=0.0,r=1.0;
  43. ans=0.0;
  44. memset(f,0,sizeof(f));
  45. memset(fa,0,sizeof(fa));
  46. memset(fb,0,sizeof(fb));
  47. while(r-l>eps){
  48. double mid=(l+r)/2.0;
  49. if(check(mid)) l=mid;
  50. else r=mid;
  51. }
  52. judge(r,R);
  53. printf("%0.5lf\n",f[n]+a*r+b*R);
  54. }
  55. return 0;
  56. }

HZOI20190906模拟38 金,斯诺,赤的更多相关文章

  1. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  2. 湖南附中模拟day1 金坷垃

    题意描述"没有金坷垃,怎么种庄稼?"花花家有一块田,所有庄稼排成了 N 行 M 列.初始时,每棵庄稼都有一个自己的高度hi;j.花花每次可以使用 1mol 的金克拉使一棵庄稼的高度 ...

  3. Noip模拟38 2021.8.13

    T1 a 跟入阵曲很像,但是忘记入阵曲这题的思路是什么了 这里再提一下,入阵曲是子矩阵和是$k$的倍数,这道题目是子矩阵和是在一段区间内$[L,R]$ 因为这道题$n$特别小,$m$较大,考虑复杂度为 ...

  4. 2021.8.13考试总结[NOIP模拟38]

    T1 a 入阵曲.枚举矩形上下界,之后从左到右扫一遍.用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减. $code:$ 1 #include<bits/st ...

  5. NOIP模拟 38

    liu_runda的题! 错过辽QAQ T1虽然没用题解的损益法,但是用高精%还能过.. 没想到敲完就过编译了,还以为要调一天呢 高精度的阴影没了- T2的思路很巧妙 首先一个区间最多有一种颜色占一半 ...

  6. [CSP-S模拟测试]:金(king)(高精度+模拟)

    题目传送门(内部题36) 输入格式 第一行一个整数$T$,表示数据组数. 接下来$T$行,每行两个空格隔开的整数$n,m$. 输出格式 对于每组数据,输出一行$"Yes"$或$&q ...

  7. HZOI20190906模拟39 工业,卡常,玄学

    题面:https://www.cnblogs.com/Juve/articles/11484209.html 工业: 推一个式子,AC 没有用组合数....推了2个多小时 我sbsbsbsbsbsbs ...

  8. NOIP 模拟 $38\; \rm c$

    题解 \(by\;zj\varphi\) 发现就是一棵树,但每条边都有多种不同的颜色,其实只需要保留随便三种颜色即可. 直接点分治,将询问离线,分成一端为重心,和两端都不为重心的情况. 每次只关心经过 ...

  9. NOIP 模拟 $38\; \rm b$

    题解 \(by\;zj\varphi\) 考虑转化问题,将计算最大公约数换为枚举最大公约数. 设 \(sum_i\) 为最大公约数为 \(i\) 的方案数,可以容斥求解,\(sum_i=f_i-\su ...

随机推荐

  1. 牛客多校第四场 A meeting 树的半径

    题意: 有一棵树,树上有许多人,他们要聚会,找一个点使得所有人到这个点的距离的最大值最小. 题解: 首先,以一个有人的点为根,求一个生成树,删掉所有没有人的子树,保证所有的悬挂点(只连接一条边的点)都 ...

  2. 使用SharpZipLib实现zip压缩

      使用国外开源加压解压库ICSharpCode.SharpZipLib实现加压,该库的官方网站为http://www.icsharpcode.net/OpenSource/SharpZipLib/D ...

  3. axios HTTP 400后,error没有详细信息

    参考网址:axios怎么获取到error中的状态值,具体信息 error.response

  4. day24 面向对象设计part1

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ----------------------------------------------------- ...

  5. ubuntu 没有桌面 没有图标,只剩下壁纸

    sudo apt-get update sudo apt-get install --reinstall ubuntu-desktop sudo apt-get install unity sudo ...

  6. clipboard.js操作剪贴版——一些移动端交互和兼容经验

    https://github.com/zenorocha/clipboard.js 库,真的是个好库,而且不依赖flash,几乎完美支持移动端.但是,移动端应用有些不趟不知的小tip,这里归档下. 原 ...

  7. vue之.native修饰符

    .native 修饰符就是用来注册元素的原生事件而不是组件自定义事件的 比如:自定义 Button.vue 组件 <template> <button type="butt ...

  8. 024_mysql应用

    初级照片位置:https://www.cnblogs.com/a276665092/gallery/image/277598.html 好丑啊 ,这怎么改啊!!!! 高级:https://www.cn ...

  9. 大型SQL文件导入mysql方案

    一. 场景 现有俩个体积较大的单表sql文件,一个为8G,一个为4G,要在一天内完整导入到阿里云的mysql中,需要同时蛮子时间和空间这俩种要求. 二. 思路 搜索了网上一堆的方案,总结了如下几个: ...

  10. UBOOT把文件写入 NandFlash

    如果把一个传到内存中的文件写入到 Nand Flash 中, 如:新的 uboot.bin, zImage(内核), rootfs 等, 如果做呢?我们可以用 Nand Flash 命令来完成. 但是 ...