日期:

七月最后一天

 总分:

300分

 难度:

提高 ~ 省选

 得分:

30分(少的可怜)

我太弱了:(题目目录)

T1:Mushroom追妹纸

T2:抵制克苏恩

T3:美味

失分分析:(QAQ)

开始全部题目看了一遍,第二题期望dp,果断放弃……

看到T3,感觉像是线性基,但是要修改,似乎不可做……(QAQ)

只剩下T1,想到正解——后缀数组+KMP,结果忘记怎么打,耗了整个比赛……

最后T1打炸了,成功炸成屎……

剩下的二十分钟,赶紧打一个T3线性基暴力,但样例竟然过不了……

定睛一看,[○・`Д´・ ○],我TM竟然理解错题意了!!MMPPP!!

最后T3暴力30分………………

题解:

T1:Mushroom追妹纸

字符串题,前两个条件后缀数组求最长公共字串。

第三个条件,用 KMP 求出$s_3$在前两个串出现的位置,在统计答案的时候,不要选到$s_3$就好了

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. int n,n1,n2,n3,m,ans=;
  7. int nxt[],pos[],f[];
  8. int tp[],rak[],tax[];
  9. char s[],s1[],s2[],s3[];
  10. int height[],sa[];
  11.  
  12. void get_next(){
  13. int i=,j=;
  14. for(int i=;i<=n3;i++)nxt[i]=;
  15. nxt[]=;
  16. while(i<=n3){
  17. if(j==||s3[i]==s3[j])
  18. if(s3[++i]!=s3[++j])nxt[i]=j;
  19. else nxt[i]=nxt[j];
  20. else j=nxt[j];
  21. }
  22. }
  23.  
  24. void solve(){
  25. int i=,j=;
  26. while(i<=n){
  27. if(j==||s[i]==s3[j])i++,j++;
  28. else j=nxt[j];
  29. if(j>n3){
  30. pos[++pos[]]=i-;
  31. j=nxt[j];
  32. }
  33. }
  34. }
  35.  
  36. void sort(int a[],int b[]){
  37. for(int i=;i<=m;i++)tax[i]=;
  38. for(int i=;i<=n;i++)tax[a[i]]++;
  39. for(int i=;i<=m;i++)tax[i]+=tax[i-];
  40. for(int i=n;i>=;i--)sa[tax[a[b[i]]]--]=b[i];
  41. }
  42.  
  43. bool comp(int r[],int a,int b,int k){
  44. return r[a]==r[b]&&r[a+k]==r[b+k];
  45. }
  46.  
  47. void get_sa(int a[],int b[]){
  48. for(int i=;i<=n1;i++)s[i]=s1[i];
  49. s[n1+]='$';
  50. for(int i=;i<=n2;i++)s[n1+i+]=s2[i];
  51. n=n1+n2+;
  52. for(int i=;i<=n;i++)a[i]=s[i],b[i]=i;
  53. m=,sort(a,b);
  54. for(int j=,p=;p<n;j<<=,m=p){
  55. p=;
  56. for(int i=;i<=j;i++)b[++p]=n-j+i;
  57. for(int i=;i<=n;i++)if(sa[i]>j)b[++p]=sa[i]-j;
  58. sort(a,b);
  59. int *t=a;a=b;b=t;
  60. a[sa[]]=p=;
  61. for(int i=;i<=n;i++)
  62. a[sa[i]]=comp(b,sa[i],sa[i-],j)?p:++p;
  63. }
  64. for(int i=;i<=n;i++)rak[sa[i]]=i;
  65. }
  66.  
  67. void get_height(){
  68. int i=,j=,k=;
  69. for(i=;i<=n;height[rak[i++]]=k){
  70. j=sa[rak[i]-];
  71. if(k)k--;
  72. while(s[i+k]==s[j+k])k++;
  73. }
  74. }
  75.  
  76. int main(){
  77. scanf("%s%s%s",s1+,s2+,s3+);
  78. n1=strlen(s1+),n2=strlen(s2+),n3=strlen(s3+);
  79. get_sa(rak,tp),get_height();
  80. get_next(),solve();
  81. for(int i=;i<=n;i++){
  82. int *k=pos,s;
  83. do{
  84. k=lower_bound(k+,pos+pos[]+,i);
  85. s=*k;
  86. if(k-pos>pos[]){s=2e9;break;}
  87. }while(*k-n3+<i);
  88. f[i]=s-i;
  89. }
  90. for(int i=;i<=n;i++)
  91. if((sa[i]<=n1&&sa[i-]>n1)||(sa[i]>n1&&sa[i-]<=n1))
  92. ans=max(ans,min(height[i],min(f[sa[i]],f[sa[i-]])));
  93. printf("%d",ans);
  94. }

长啊!!(别人都是10几20毫秒,我竟然500ms+ MMP (▼ヘ▼#))

T2:抵制克苏恩

期望dp,$f[k][a][b][c]$ 表示攻击$k$次后,还剩$a$个 1 血,$b$个2血,$c$个3血,英雄受伤害的期望,直接递推!

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. int T,n,m,K,A,B,C;
  7. double f[][][][];
  8.  
  9. double dp(int k,int a,int b,int c){
  10. if(k==)return ;
  11. c=min(c,-a-b);
  12. if(f[k][a][b][c])return f[k][a][b][c];
  13. f[k][a][b][c]+=1.0/(a+b+c+)*(dp(k-,a,b,c)+);
  14. if(a)f[k][a][b][c]+=1.0*a/(a+b+c+)*dp(k-,a-,b,c);
  15. if(b)f[k][a][b][c]+=1.0*b/(a+b+c+)*dp(k-,a+,b-,c+);
  16. if(c)f[k][a][b][c]+=1.0*c/(a+b+c+)*dp(k-,a,b+,c);
  17. return f[k][a][b][c];
  18. }
  19.  
  20. int main(){
  21. scanf("%d",&T);
  22. while(T--){
  23. scanf("%d%d%d%d",&K,&A,&B,&C);
  24. printf("%.2f\n",dp(K,A,B,C));
  25. }
  26. }

T3:美味

主席树,类似 Trie 树的思想,按位贪心;

用一个变量$a$从高位走,0就走1,1就走0;

主席树维护值域和区间,判断,具体看代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. int n,m,b,x,l,r,y,tot=,root[];
  6. int sum[],lch[],rch[];
  7.  
  8. int read(){
  9. int x=;char ch=;
  10. while(ch<''||ch>''){ch=getchar();}
  11. while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
  12. return x;
  13. }
  14.  
  15. void update(int &o,int last,int l,int r,int x){
  16. o=++tot;
  17. lch[o]=lch[last],rch[o]=rch[last],sum[o]=sum[last]+;
  18. if(r-l==)return;
  19. else{
  20. int mid=l+r>>;
  21. if(x<mid)update(lch[o],lch[last],l,mid,x);
  22. else update(rch[o],rch[last],mid,r,x);
  23. }
  24. }
  25.  
  26. int query(int o1,int o2,int l,int r,int x,int y){
  27. if(l>=y||r<=x)return ;
  28. if(l>=x&&r<=y)return sum[o2]>sum[o1];
  29. int mid=l+r>>;
  30. int ans=;
  31. if(x<mid)ans|=query(lch[o1],lch[o2],l,mid,x,y);
  32. if(y>mid)ans|=query(rch[o1],rch[o2],mid,r,x,y);
  33. return ans;
  34. }
  35.  
  36. int main(){
  37. n=read(),m=read();
  38. for(int i=;i<=n;i+=){
  39. x=read();
  40. update(root[i],root[i-],,,x);
  41. x=read();
  42. update(root[i+],root[i],,,x);
  43. }
  44. register int i,j,a;
  45. for(i=,a=;i<=m;++i,a=){
  46. b=read(),x=read(),l=read(),r=read();
  47. for(register int j=;~j;--j){
  48. if(b&(<<j)){
  49. int L=max(a-x,),R=a+(<<j)--x;
  50. if(!query(root[l-],root[r],,,L,R+))a^=(<<j);//没法走0就走1
  51. }else{
  52. int L=max(a+(<<j)-x,),R=a+(<<j+)--x;
  53. if(query(root[l-],root[r],,,L,R+))a^=(<<j);//能走1就走1
  54. }
  55. }
  56. printf("%d\n",a^b);
  57. }
  58. }

成功 1960ms 卡过!!呵呵……  ┐(´∇`)┌

2018.7.31 Noip2018模拟测试赛(十六)的更多相关文章

  1. 2018.8.7 Noip2018模拟测试赛(二十)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...

  2. 2018.8.6 Noip2018模拟测试赛(十九)

    日期: 八月六号  总分: 300分  难度: 提高 ~ 省选    得分: 10分(MMP) 题目目录: T1:Tree T2:异或运算 T3:Tree Restoring 赛后反思: Emmmmm ...

  3. 2018.8.8 Noip2018模拟测试赛(二十一)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...

  4. 2017.8.2 Noip2018模拟测试赛(十八)

     日期: 八月二日  总分: 300分  难度: 提高 ~ 省选  得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...

  5. 2017.8.1 Noip2018模拟测试赛(十七)

    日期: 八月第一天  总分: 300分  难度: 提高 ~ 省选    得分: 100分(不应该啊!) 题目目录: T1:战争调度 T2:选数 T3:由乃的OJ 赛后心得: MMP,首先第一题花了大概 ...

  6. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  7. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  8. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  9. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

随机推荐

  1. 酷炫的3D照片墙

    今天给大家分享的案例是酷炫的3D照片墙 这个案例主要是通过 CSS3 和原生的 JS 来实现的,接下来我给大家分享一下这个效果实现的过程.博客上不知道怎么放本地视频,所以只能放两张效果截图了. 1.实 ...

  2. Find the Longest Word in a String-freecodecamp算法题目

    Find the Longest Word in a String(找出最长单词) 要求 在句子中找出最长的单词,并返回它的长度 函数的返回值应该是一个数字. 思路 用.split(' ')将句子分隔 ...

  3. 【二分 最小割】cf808F. Card Game

    Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...

  4. mysql EOF

    mysql shell 执行脚本 #!/bin/bash export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.6/bin:/usr ...

  5. Linux - 后台运行 ctrl + z , jobs , bg , fg

    一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停三.jobs查看当前有多少在后台运行的命令四.fg ...

  6. 【Python学习之五】高级特性1(切片、迭代、列表生成器、生成器、迭代器)

    1.切片 有一个list—>L = [1,2,3,4,5,6,7]或tuple—>T = (1,2,3,4,5,6,7),如果想取得前三个元素,怎么操作? 硬方法,也是低效的方法是:L= ...

  7. Qt:实现子线程发送信号父线程切换图片

    mainwindow.h中代码 #ifndef MAINWINDOW_H#define MAINWINDOW_H #include <QMainWindow>#include " ...

  8. 【java】 java 内存解读

    具体请参考 vamei java 内存管理和垃圾回收 java的内存分为栈内存和堆内存两部分 栈内存 主要存储一些参数,局部变量和返回地址,参数和局部变量大部分是基本类型的变量,如果是引用类型,实际上 ...

  9. 【android】android对位图文件的支持

    Android 支持以下三种格式的位图文件:.png(首选)..jpg(可接受)..gif(不建议).

  10. sqlmanagementstudio2008下载地址

    http://big.wy119.com/sqlmanagementstudio2008_x86_chs.zip