2018.7.31 Noip2018模拟测试赛(十六)
日期: |
七月最后一天 |
总分: |
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:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int n,n1,n2,n3,m,ans=;
- int nxt[],pos[],f[];
- int tp[],rak[],tax[];
- char s[],s1[],s2[],s3[];
- int height[],sa[];
- void get_next(){
- int i=,j=;
- for(int i=;i<=n3;i++)nxt[i]=;
- nxt[]=;
- while(i<=n3){
- if(j==||s3[i]==s3[j])
- if(s3[++i]!=s3[++j])nxt[i]=j;
- else nxt[i]=nxt[j];
- else j=nxt[j];
- }
- }
- void solve(){
- int i=,j=;
- while(i<=n){
- if(j==||s[i]==s3[j])i++,j++;
- else j=nxt[j];
- if(j>n3){
- pos[++pos[]]=i-;
- j=nxt[j];
- }
- }
- }
- void sort(int a[],int b[]){
- for(int i=;i<=m;i++)tax[i]=;
- for(int i=;i<=n;i++)tax[a[i]]++;
- for(int i=;i<=m;i++)tax[i]+=tax[i-];
- for(int i=n;i>=;i--)sa[tax[a[b[i]]]--]=b[i];
- }
- bool comp(int r[],int a,int b,int k){
- return r[a]==r[b]&&r[a+k]==r[b+k];
- }
- void get_sa(int a[],int b[]){
- for(int i=;i<=n1;i++)s[i]=s1[i];
- s[n1+]='$';
- for(int i=;i<=n2;i++)s[n1+i+]=s2[i];
- n=n1+n2+;
- for(int i=;i<=n;i++)a[i]=s[i],b[i]=i;
- m=,sort(a,b);
- for(int j=,p=;p<n;j<<=,m=p){
- p=;
- for(int i=;i<=j;i++)b[++p]=n-j+i;
- for(int i=;i<=n;i++)if(sa[i]>j)b[++p]=sa[i]-j;
- sort(a,b);
- int *t=a;a=b;b=t;
- a[sa[]]=p=;
- for(int i=;i<=n;i++)
- a[sa[i]]=comp(b,sa[i],sa[i-],j)?p:++p;
- }
- for(int i=;i<=n;i++)rak[sa[i]]=i;
- }
- void get_height(){
- int i=,j=,k=;
- for(i=;i<=n;height[rak[i++]]=k){
- j=sa[rak[i]-];
- if(k)k--;
- while(s[i+k]==s[j+k])k++;
- }
- }
- int main(){
- scanf("%s%s%s",s1+,s2+,s3+);
- n1=strlen(s1+),n2=strlen(s2+),n3=strlen(s3+);
- get_sa(rak,tp),get_height();
- get_next(),solve();
- for(int i=;i<=n;i++){
- int *k=pos,s;
- do{
- k=lower_bound(k+,pos+pos[]+,i);
- s=*k;
- if(k-pos>pos[]){s=2e9;break;}
- }while(*k-n3+<i);
- f[i]=s-i;
- }
- for(int i=;i<=n;i++)
- if((sa[i]<=n1&&sa[i-]>n1)||(sa[i]>n1&&sa[i-]<=n1))
- ans=max(ans,min(height[i],min(f[sa[i]],f[sa[i-]])));
- printf("%d",ans);
- }
长啊!!(别人都是10几20毫秒,我竟然500ms+ MMP (▼ヘ▼#))
T2:抵制克苏恩
期望dp,$f[k][a][b][c]$ 表示攻击$k$次后,还剩$a$个 1 血,$b$个2血,$c$个3血,英雄受伤害的期望,直接递推!
CODE:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int T,n,m,K,A,B,C;
- double f[][][][];
- double dp(int k,int a,int b,int c){
- if(k==)return ;
- c=min(c,-a-b);
- if(f[k][a][b][c])return f[k][a][b][c];
- f[k][a][b][c]+=1.0/(a+b+c+)*(dp(k-,a,b,c)+);
- if(a)f[k][a][b][c]+=1.0*a/(a+b+c+)*dp(k-,a-,b,c);
- if(b)f[k][a][b][c]+=1.0*b/(a+b+c+)*dp(k-,a+,b-,c+);
- if(c)f[k][a][b][c]+=1.0*c/(a+b+c+)*dp(k-,a,b+,c);
- return f[k][a][b][c];
- }
- int main(){
- scanf("%d",&T);
- while(T--){
- scanf("%d%d%d%d",&K,&A,&B,&C);
- printf("%.2f\n",dp(K,A,B,C));
- }
- }
T3:美味
主席树,类似 Trie 树的思想,按位贪心;
用一个变量$a$从高位走,0就走1,1就走0;
主席树维护值域和区间,判断,具体看代码:
- #include<iostream>
- #include<cstdio>
- using namespace std;
- int n,m,b,x,l,r,y,tot=,root[];
- int sum[],lch[],rch[];
- int read(){
- int x=;char ch=;
- while(ch<''||ch>''){ch=getchar();}
- while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
- return x;
- }
- void update(int &o,int last,int l,int r,int x){
- o=++tot;
- lch[o]=lch[last],rch[o]=rch[last],sum[o]=sum[last]+;
- if(r-l==)return;
- else{
- int mid=l+r>>;
- if(x<mid)update(lch[o],lch[last],l,mid,x);
- else update(rch[o],rch[last],mid,r,x);
- }
- }
- int query(int o1,int o2,int l,int r,int x,int y){
- if(l>=y||r<=x)return ;
- if(l>=x&&r<=y)return sum[o2]>sum[o1];
- int mid=l+r>>;
- int ans=;
- if(x<mid)ans|=query(lch[o1],lch[o2],l,mid,x,y);
- if(y>mid)ans|=query(rch[o1],rch[o2],mid,r,x,y);
- return ans;
- }
- int main(){
- n=read(),m=read();
- for(int i=;i<=n;i+=){
- x=read();
- update(root[i],root[i-],,,x);
- x=read();
- update(root[i+],root[i],,,x);
- }
- register int i,j,a;
- for(i=,a=;i<=m;++i,a=){
- b=read(),x=read(),l=read(),r=read();
- for(register int j=;~j;--j){
- if(b&(<<j)){
- int L=max(a-x,),R=a+(<<j)--x;
- if(!query(root[l-],root[r],,,L,R+))a^=(<<j);//没法走0就走1
- }else{
- int L=max(a+(<<j)-x,),R=a+(<<j+)--x;
- if(query(root[l-],root[r],,,L,R+))a^=(<<j);//能走1就走1
- }
- }
- printf("%d\n",a^b);
- }
- }
成功 1960ms 卡过!!呵呵…… ┐(´∇`)┌
2018.7.31 Noip2018模拟测试赛(十六)的更多相关文章
- 2018.8.7 Noip2018模拟测试赛(二十)
日期: 八月七号 总分: 300分 难度: 提高 ~ 省选 得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...
- 2018.8.6 Noip2018模拟测试赛(十九)
日期: 八月六号 总分: 300分 难度: 提高 ~ 省选 得分: 10分(MMP) 题目目录: T1:Tree T2:异或运算 T3:Tree Restoring 赛后反思: Emmmmm ...
- 2018.8.8 Noip2018模拟测试赛(二十一)
日期: 八月七号 总分: 300分 难度: 提高 ~ 省选 得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...
- 2017.8.2 Noip2018模拟测试赛(十八)
日期: 八月二日 总分: 300分 难度: 提高 ~ 省选 得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...
- 2017.8.1 Noip2018模拟测试赛(十七)
日期: 八月第一天 总分: 300分 难度: 提高 ~ 省选 得分: 100分(不应该啊!) 题目目录: T1:战争调度 T2:选数 T3:由乃的OJ 赛后心得: MMP,首先第一题花了大概 ...
- [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania
[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...
- noi2019模拟测试赛(四十七)
noi2019模拟测试赛(四十七) T1与运算(and) 题意: 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
随机推荐
- 酷炫的3D照片墙
今天给大家分享的案例是酷炫的3D照片墙 这个案例主要是通过 CSS3 和原生的 JS 来实现的,接下来我给大家分享一下这个效果实现的过程.博客上不知道怎么放本地视频,所以只能放两张效果截图了. 1.实 ...
- Find the Longest Word in a String-freecodecamp算法题目
Find the Longest Word in a String(找出最长单词) 要求 在句子中找出最长的单词,并返回它的长度 函数的返回值应该是一个数字. 思路 用.split(' ')将句子分隔 ...
- 【二分 最小割】cf808F. Card Game
Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...
- mysql EOF
mysql shell 执行脚本 #!/bin/bash export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql-5.6/bin:/usr ...
- Linux - 后台运行 ctrl + z , jobs , bg , fg
一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停三.jobs查看当前有多少在后台运行的命令四.fg ...
- 【Python学习之五】高级特性1(切片、迭代、列表生成器、生成器、迭代器)
1.切片 有一个list—>L = [1,2,3,4,5,6,7]或tuple—>T = (1,2,3,4,5,6,7),如果想取得前三个元素,怎么操作? 硬方法,也是低效的方法是:L= ...
- Qt:实现子线程发送信号父线程切换图片
mainwindow.h中代码 #ifndef MAINWINDOW_H#define MAINWINDOW_H #include <QMainWindow>#include " ...
- 【java】 java 内存解读
具体请参考 vamei java 内存管理和垃圾回收 java的内存分为栈内存和堆内存两部分 栈内存 主要存储一些参数,局部变量和返回地址,参数和局部变量大部分是基本类型的变量,如果是引用类型,实际上 ...
- 【android】android对位图文件的支持
Android 支持以下三种格式的位图文件:.png(首选)..jpg(可接受)..gif(不建议).
- sqlmanagementstudio2008下载地址
http://big.wy119.com/sqlmanagementstudio2008_x86_chs.zip