8.1 NOIP模拟 11

今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我......想起来了,我当时没有做,完了,这就是之前坑哇的太大的缘故。我的内心当时就在滴血,心想推正解还不如先打个暴力,然后愉快的5分钟吗了一个暴力,整个就是俩sort,又花了五分钟改成了桶排,然后就愉快的交上去了,然后我T1还是没有思路,就15分钟的时候转了T2,T2一看就开始推组合数的柿子,但是由于我的误判成数学题,就完犊子了,那还等啥,一看20%的数据,就果断摔了一个dfs上去,然后就转T3,(此时内心虚的一批),T3一看,先想了一个啥都没有的暴力,然后又想到了前缀和优化,就优化一下,自己有造了几个极限数据,发现20%和40%应该都能过(当时心花怒放,但是其实60是不存在的),然后开考50分钟,打完了三个暴力,就歇菜了,剩下的时间就开始刚正解,最后的提交我也是挂着暴力交上去的,所以最后我的分数并没有因为我的覆盖而降低,但是也没有因为我的“正解”而分数增高,刚考完我就知道我这次凉凉,只打了3个暴力,肯定又垫底了,但是竟然还有暴力都没打对的大佬然后,我就和13个同学并列rank7,100分,虽然rank7,但是这是在别人失误的情况下得的,所以如果别人都没失误,那我这次就又垫底了,所以这次还是失败的考试。

T1 string

这这,一看就是之前学长讲过的那道用线段树维护的题,好像还带了二分,但是仔细一看略有不同,之前的那个是指询问地q个数,而这个是询问整个结果,所以我就(缨缨婴)只能打暴力,但是好像全场都没几个打正解的。在下面改题的过程中我就想到了一种奇爬的方法,就是维护一个每个字母出现次数的前缀和,然后通过一系列操作实现对字符串的变化,但是时间复杂度是$ O(n*m*26) $交上去T40,和我的暴力跑的时间一样,然后我就想怎么优化,有这么一种思路,就是我把前缀和的图像画在了之上,然后发现他是单调上升函数(这不是废话吗!),那么我就想到使用链表吧图像的拐点存下来,这样就可以知道了一些信息,而且可以 $ O(1) $计算出一些信息,但是需要 $ O(m*26) $的复杂度进行转移,所以应该比正解跑的还要快,但是男就难在了这个思路不好实现,所以我还是老老实实的打了线段树,最后还是没有忍住话了一点时间打了一下,发现确实很难条,我就暂且哇个坑,有神犇愿意为我条一下的也可以,后来我看cbx的T1快到飞起,其实他的思路和我的这个思路是一样的,就不赘述了;

我的T40暴力代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. using namespace std;
  8. int read()
  9. {
  10. int x=,f=;char cc;cc=getchar();
  11. while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
  12. while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
  13. return x*f;
  14. }
  15. char s[];
  16. int n,m,l,r,x;
  17. inline bool cmp1(char a,char b){return a<b;}
  18. inline bool cmp2(char a,char b){return a>b;}
  19. int main()
  20. {
  21. //freopen("cnm.txt","r",stdin);
  22. n=read();m=read();
  23. scanf("%s",s+);
  24. for(int i=;i<=m;i++)
  25. {
  26. l=read(),r=read(),x=read();
  27. if(x==)sort(s+l,s+r+,cmp1);
  28. else sort(s+l,s+r+,cmp2);
  29. }
  30. for(int i=;i<=n;i++)
  31. printf("%c",s[i]);
  32. puts("");
  33. return ;
  34. }

T40

我的AC线段树代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. const int maxn=;
  7. using namespace std;
  8. #define re register
  9. #define debug(x) cout<<x<<" debug!"<<endl;
  10. inline int read()
  11. {
  12. re int x=,f=;char cc;cc=getchar();
  13. while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
  14. while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
  15. return x*f;
  16. }
  17. int m,n,k,t,sum[];
  18. char s[maxn];
  19. struct tree{
  20. int l,r,vv,lev;
  21. }tr[maxn<<];
  22. inline void pushup(int x)
  23. {
  24. if(tr[x<<].vv==tr[x<<|].vv)
  25. tr[x].vv=tr[x<<].vv;
  26. else tr[x].vv=-;
  27. }
  28. inline void pushdown(int x)
  29. {
  30. if(tr[x].vv!=-)
  31. tr[x<<].vv=tr[x<<|].vv=tr[x].vv;
  32. else tr[x].vv=-;
  33. }
  34. inline void build(int x,int l,int r)
  35. {
  36. tr[x].l=l, tr[x].r=r;
  37. tr[x].vv=-;
  38. if(tr[x].l==tr[x].r)
  39. {
  40. tr[x].vv=s[l]-'a';
  41. return;
  42. }
  43. int mid=(tr[x].l+tr[x].r)>>;
  44. build(x<<,l,mid); build(x<<|,mid+,r);
  45. pushup(x);
  46. }
  47. inline void query(int x)
  48. {
  49. if(tr[x].vv!=-)
  50. {
  51. for(register int i=;i<=tr[x].r-tr[x].l+;++i)
  52. putchar(tr[x].vv+'a');
  53. return;
  54. }
  55. query(x<<);
  56. query(x<<|);
  57. }
  58. inline void make(int x,int l,int r)
  59. {
  60. if(l<=tr[x].l&&tr[x].r<=r)
  61. {
  62. if(tr[x].vv!=-)
  63. {
  64. sum[tr[x].vv]+=tr[x].r-tr[x].l+;
  65. return;
  66. }
  67. }
  68. pushdown(x);
  69. int mid=(tr[x].l+tr[x].r)>>;
  70. if(l<=mid)make(x<<,l,r);
  71. if(mid+<=r)make(x<<|,l,r);
  72. }
  73. inline void change(int x,int l,int r,int vv)
  74. {
  75. if(l>r) return;
  76. if(l<=tr[x].l&&tr[x].r<=r)
  77. {
  78. tr[x].vv=vv;
  79. return;
  80. }
  81. int mid=(tr[x].l+tr[x].r)>>;
  82. if(l<=mid)change(x<<,l,r,vv);
  83. if(mid+<=r)change(x<<|,l,r,vv);
  84. pushup(x);
  85. }
  86. int main()
  87. {
  88. //freopen("1.txt","r",stdin);
  89. n=read(),m=read();
  90. scanf("%s",s+);
  91. build(,,n);
  92. while(m--)
  93. {
  94. memset(sum,,sizeof(sum));
  95. int l,r,x;
  96. scanf("%d%d%d",&l,&r,&x);
  97. make(,l,r);
  98. if(x==)
  99. {
  100. int L=l;
  101. for(register int i=;i<;++i)
  102. {
  103. change(,L,L+sum[i]-,i);
  104. L+=sum[i];
  105. }
  106. }
  107. if(x==)
  108. {
  109. int L=l;
  110. for(register int i=;i>=;--i)
  111. {
  112. change(,L,L+sum[i]-,i);
  113. L+=sum[i];
  114. }
  115. }
  116. }
  117. query();
  118. puts("");
  119. }

AC

还有cbx的代码就不放了,本人懒得征求版权了!

T2 Matrix

这到题是本人感觉正常最难的题,虽然看起来像组合数学(而且我也是按组合数学打的,但是并不是)

这是题解,其实就是一个贼神仙的dp,由于时间限制以及任务繁多,本人扔下代码就跑:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. #define LL long long
  5. #define re register
  6. inline LL read()
  7. {
  8. re LL x=,f=;char cc;cc=getchar();
  9. while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
  10. while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
  11. return x*f;
  12. }
  13. const LL p=;
  14. LL n,m,dp[][],pw[],inv[],ipw[],l[],r[];
  15. int main()
  16. {
  17. n=read(),m=read();
  18. for(re LL i=;i<=n;++i)++l[read()],++r[read()];
  19. for(re LL i=;i<=m;++i)l[i]+=l[i-],r[i]+=r[i-];
  20. dp[][]=;
  21. for(re LL i=;i<=m;++i)
  22. {
  23. dp[i][]=dp[i-][];
  24. for(re LL j=;j<=r[i];++j)
  25. dp[i][j]=(dp[i-][j]+dp[i-][j-]*(r[i]-j+)%p)%p;
  26. for(re LL j=l[i-];j<l[i];++j)
  27. for(re LL k=;k<=i-j;++k)
  28. dp[i][k]=dp[i][k]*(i-k-j)%p;
  29. }
  30. printf("%lld\n",dp[m][n]);
  31. }

T2

T3 big

本人也是先哇下坑,先沽了;

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. #define LL long long
  6. #define re register
  7. LL ch[][],tot;
  8. LL num[],n,m;
  9. LL ans,cnt,sum,pre[],x;
  10. LL head[],nxt[],ver[],tot2,vvt[];
  11. const int pc=;
  12. inline LL read()
  13. {
  14. re LL x=,f=;char cc;cc=getchar();
  15. while(cc>''||cc<''){if(cc=='-')f=-;cc=getchar();}
  16. while(cc>=''&&cc<=''){x=(x<<)+(x<<)+cc-'';cc=getchar();}
  17. return x*f;
  18. }
  19. void inser(LL x)
  20. {
  21. LL h=x%pc;
  22. for(int i=head[h];i;i=nxt[i])
  23. if(ver[i]==x)++vvt[i];
  24. ver[++tot2]=x;
  25. nxt[tot2]=head[h];
  26. head[h]=tot2;
  27. vvt[tot2]++;
  28. }
  29. LL query(LL x)
  30. {
  31. LL h=x%pc;
  32. LL op=;
  33. for(int i=head[h];i;i=nxt[i])
  34. if(ver[i]==x)
  35. op=vvt[i];
  36. return op;
  37. }
  38. LL insert(LL x)
  39. {
  40. LL u=,wc=,xx=x;
  41. for(register int i=n-;i>=;--i)
  42. {
  43. wc=(xx&(<<i))?:;
  44. if(!ch[u][wc])
  45. ch[u][wc]=++tot;
  46. u=ch[u][wc];
  47. }
  48. }
  49. inline void dfs(int x,int dep,int sum)
  50. {
  51. if(dep==-)
  52. {
  53. if(sum>=ans) ans=sum,inser(ans);
  54. return;
  55. }
  56. if(!ch[x][]) dfs(ch[x][],dep-,sum^(<<dep));
  57. if(!ch[x][]) dfs(ch[x][],dep-,sum^(<<dep));
  58. if(ch[x][]&&ch[x][])
  59. {
  60. dfs(ch[x][],dep-,sum);
  61. dfs(ch[x][],dep-,sum);
  62. }
  63. }
  64. int main()
  65. {
  66. n=read(),m=read();
  67. for(register int i=;i<=m;++i)
  68. x=read(),pre[i]=pre[i-]^x;
  69. for(register int i=,x;i<=m;++i)
  70. {
  71. x=((*pre[i])/(<<n)+*pre[i])%(<<n);
  72. insert(x^pre[i]^pre[m]);
  73. }
  74. dfs(,n-,);
  75. LL uu=query(ans);
  76. printf("%lld\n%lld\n",ans,uu);
  77. }

T3

8.1 NOIP模拟11的更多相关文章

  1. Noip模拟11 2021.7.11

    T1 math 其实看看题面,看看给的那机组数据即可看出规律了(然而当时并没有,只是发现模数的循环节,存了个vector,接下来就暴力了) 有个柿子: 其实就是裴蜀定理. 然后想一想的话就是 那么只要 ...

  2. noip模拟11

    T1 math 就挺水一小破题目,第一眼看好像不可做,看着看着突然发现假设x和y的最大公约数是gcd,那么kx%y一定是gcd的倍数, 然后想到可以把所有数字与k的gcd求出来,打一个完全背包,可是仔 ...

  3. NOIP模拟 11

    差点迟到没赶上开题 开题后看了T1,好像一道原题,没分析复杂度直接敲了个NC线段树,敲了个暴力,敲了个对拍,就1h了.. 对拍还对出错了,发现标记下传有点问题,改了以后对拍通过,就把T1扔掉看T2 觉 ...

  4. [考试总结]noip模拟11

    菜 这次考试又是骗了一堆分数... 然而其实一个正解都没写... \(T1\) 的方法说实话确实不是很正统.... 然而却 \(A\) 了... 在打完 \(T1\) 后拍了老长时间... 然后就耽搁 ...

  5. NOIP 模拟 $11\; \rm english$

    题解 本题有一定代码难度 对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解 那么 ...

  6. NOIP 模拟 $11\; \rm biology$

    题解 首先对 \(a\) 离散化,则可推出转移方程 \[dp_{i,j}=\max\{{dp_{{i^{'}},{j^{'}}}+|i-i^{'}|+|j-j^{'}|}\}+b_{i,j} \;\; ...

  7. NOIP 模拟 $11\;\rm math$

    题解 签到题(然而还是不会) 考虑所有可能的值一定是 \(\in [0,k)\),且一定为 \(gcd(a_1,a_2,...a_n,k)\) 的倍数. 证明: 设 \(tmp=b_1a_1+b_2a ...

  8. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  9. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

随机推荐

  1. Redis 复制过程详解

    Redis 的复制功能分为同步( sync )和命令传播( command propagate )两个步骤: 同步用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态. 命令传播则用于在主服务 ...

  2. 终端 10X 工作法(一)

    目录 1. Terminal 2. Grep 3. Sed 4. Awk 5. Xargs 6. Find 在 github 上面有一个 700 多人 star 的 repo 叫做 Bash-Onel ...

  3. RF用例执行方法

    用例如下图: 1.执行整个项目下的所有用例 dos命令下输入robot D:\work_doc\RF (RF为下图中脚本项目Test目录的上级目录) 2.执行某个suite中的所有用例 dos命令下输 ...

  4. axios学习和使用

    网络请求的方式 传统的Ajax,基于XMLHttpRequest(不推荐) 配置调用方式混乱(回调地狱) jQuery-Ajax (在vue开发中不推荐) 相对于传统的Ajax非常好用 但是jQuer ...

  5. Ubuntu安装NASM和简单的使用教程

    1. 安装 sudo apt-get install nasm 这样nasm就安装好了,终端输入命令: nasm -version 输出版本信息就说明安装成功 2. 使用 创建"hello. ...

  6. [Luogu3112] [USACO14DEC]后卫马克Guard Mark

    题意翻译 FJ将飞盘抛向身高为H(1 <= H <= 1,000,000,000)的Mark,但是Mark被N(2 <= N <= 20)头牛包围.牛们可以叠成一个牛塔,如果叠 ...

  7. RIDE的Edit界面

    有四种类型的Edit界面(注:测试套件主要是存放测试案例,资源文件主要是存放用户关键字) 1.测试套件(file类型)的Edit界面 首先展开Setting: 对右侧红框按钮简单说明: Library ...

  8. MongoDB-系统时钟跳变引发的风波

    目录 背景 一. 对 oplog 的影响 oplog 原理 二.主备倒换 小结 声明:本文同步发表于 MongoDB 中文社区,传送门: http://www.mongoing.com/archive ...

  9. 【Java必修课】各种集合类的合并(数组、List、Set、Map)

    1 介绍 集合类可谓是学习必知.编程必用.面试必会的,而且集合的操作十分重要:本文主要讲解如何合并集合类,如合并两个数组,合并两个List等.通过例子讲解几种不同的方法,有JDK原生的方法,还有使用第 ...

  10. Arduino学习笔记⑥ 硬件串口通信

    1.前言     Ardunio与计算机通信最常用的方式就是串口通信.在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接.该转换芯片 ...