日期:

八月七号

 总分:

300分

 难度:

提高 ~ 省选  

 得分:

100分(呵呵一笑)

题目列表:

  T1:SS

  T2:Tree Game

  T3:二元运算

赛后反思:

Emmmmmm……

开局随便看,第二题发现手算样例不对……

比赛快结束时,又看了看题,才发现自己看错了……

最终,改A了……Emmmmmm……

题解:

T1:SS

特别特别玄学的一道题……

原串是一个偶串,设半个原串为S,加起来就是SS。

设S的最长公共前缀后缀为T,(用 KMP 的 next 求)

那么接下来的串为 STST,STSSTS,STSSTSTSST……

只看一半:S,ST,STS,STSST……

这不是斐波那契吗?由于斐波那增长很快,我们暴力求出在 l,r 的串,差分出答案。

CODE:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; char s[];
long long l,r,siz[],sum[][],ans[];
int n,lim,nxt[]; void get_next(){
int i=,j=;
nxt[]=;
while(i<=n){
if(j==||s[i]==s[j]){
nxt[++i]=++j;
}else j=nxt[j];
}
} void get_ans(long long x,int f){
for(int i=lim;i>=;i--)
if(x>=siz[i]){
for(int j=;j<;j++)
ans[j]+=f*sum[i][j];
x-=siz[i];
}
for(int i=;i<=x;i++)ans[s[i]-'a']+=f;
} int main(){
scanf("%s%lld%lld",s+,&l,&r);
n=strlen(s+)>>;
get_next();
int t=nxt[n];
for(int i=;i<=n;i++)sum[][s[i]-'a']++;
for(int i=;i<;i++)sum[][i]=sum[][i];
for(int i=;i<=n-t;i++)sum[][s[i]-'a']++;
siz[]=n,siz[]=*n-t;
for(int i=;i<=;i++){
for(int j=;j<;j++)
sum[i][j]=sum[i-][j]+sum[i-][j];
siz[i]=siz[i-]+siz[i-];
if(siz[i]>1e18){lim=i;break;}
}
get_ans(l-,-);
get_ans(r,);
for(int i=;i<;i++)printf("%lld ",ans[i]);
return ;
}

T2:Tree Game

你可以很轻易的发现一个结论,先手必须要往权值更小的点走,不然对手跟你对着干就能把你逼死。

当前子树如果有必胜的策略,那就一定有一个儿子的子树是必胜的,且权值小于它。

于是乎,dp秒杀吧!时间 $O(n^2)$

CODE:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int tot=,h[];
int n,x,y,f[],val[];
struct Edge{
int x,next;
}e[]; inline void add_edge(int x,int y){
e[++tot].x=y;
e[tot].next=h[x],h[x]=tot;
} void dfs(int x){
f[x]=;
for(int i=h[x];i;i=e[i].next){
if(~f[e[i].x])continue;
dfs(e[i].x);
if(val[e[i].x]<val[x]&&f[e[i].x]==)f[x]=;
}
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",val+i);
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
for(int i=;i<=n;i++){
memset(f,-,sizeof(f));
dfs(i);
if(f[i])printf("%d ",i);
}
}

T3:二元运算

CDQ分治加FFT。

如果只有第一种运算就是裸的FFT求卷积,只有第二种运算可以把B序列翻转,然后求卷积即可。

但是有 x 与 y 大小关系的限制使得我们不能直接求卷积来得出答案。

考虑分治,对于每个区间 $[l,r]$,处理出$A$中的$[l,mid]$与$B$中的$[mid+1,r]$对答案的贡献以及$A$中的$[mid+1,r]$与$B$中的$[l,mid]$对答案的贡献,这两个是有严格的 x 与 y 的大小关系的,分别使用 FFT 求卷积解决。再递归处理子区间即可。

时间复杂度$O(Tnlog^2n)$

CODE:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std; #pragma GCC optimize(3) const double PI=acos(-);
int T,n,m,q,x;
int rev[],A[],B[];
long long ans[];
struct cmplx{
double x,y;
cmplx(double a=,double b=){x=a;y=b;}
cmplx operator+(cmplx b){
return cmplx(x+b.x,y+b.y);
}
cmplx operator+=(cmplx b){
return *this=*this+b;
}
cmplx operator-(cmplx b){
return cmplx(x-b.x,y-b.y);
}
cmplx operator*(cmplx b){
return cmplx(x*b.x-y*b.y,x*b.y+y*b.x);
}
cmplx operator*=(cmplx b){
return *this=*this*b;
}
}a[],b[]; int read(){
int x=;
char c;
do c=getchar();
while(!isdigit(c));
do{
x=(x<<)+(x<<)+(c^);
c=getchar();
}while(isdigit(c));
return x;
} void FFT(cmplx a[],int bit,int dft){
for(int i=;i<bit;i++)
if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<bit;i<<=){
cmplx W(cos(PI/i),dft*sin(PI/i));
for(int j=;j<bit;j+=i<<){
cmplx w(,);
for(int k=j;k<i+j;k++,w=w*W){
cmplx x=a[k];
cmplx y=w*a[k+i];
a[k]=x+y,a[k+i]=x-y;
}
}
}
if(dft==-)for(int i=;i<bit;i++)a[i].x/=bit;
} void solve(int l,int r){
if(l==r)return;
int mid=l+r>>,n=;
while(n<=r-l+)n<<=;
for(int i=l;i<=mid;i++)
a[i-l]=cmplx(A[i],);
for(int i=mid+;i<=r;i++)
b[i-mid-]=cmplx(B[i],);
for(int i=mid-l+;i<n;i++)
a[i]=cmplx(,);
for(int i=r-mid;i<n;i++)
b[i]=cmplx(,);
for(int i=;i<n;i++)
rev[i]=(rev[i>>]>>)|(i&)*(n>>);
FFT(a,n,),FFT(b,n,);
for(int i=;i<n;i++)a[i]=a[i]*b[i];
FFT(a,n,-);
for(int i=;i<=r-l+;i++)
ans[i+l+mid+]+=(long long)(a[i].x+0.5);
solve(l,mid),solve(mid+,r);
} int main(){
T=read();
while(T--){
memset(A,,sizeof(A));
memset(B,,sizeof(B));
memset(a,,sizeof(a));
memset(b,,sizeof(b));
memset(ans,,sizeof(ans));
int maxn=,bit=;
n=read(),m=read(),q=read();
for(int i=;i<=n;i++){
x=read();
A[x]++,maxn=max(maxn,x);
}
for(int i=;i<=m;i++){
x=read();
B[x]++,maxn=max(maxn,x);
}
while(bit<=maxn<<)bit<<=;
for(int i=;i<bit;i++)
rev[i]=(rev[i>>]>>)|(i&)*(bit>>);
for(int i=;i<=maxn;i++)
b[maxn-i].x=B[i];
for(int i=;i<=maxn;i++)
a[i].x=A[i];
FFT(a,bit,),FFT(b,bit,);
for(int i=;i<bit;i++)a[i]=a[i]*b[i];
FFT(a,bit,-);
for(int i=;i<=maxn;i++)
ans[i]=(long long)(a[i+maxn].x+0.5);
solve(,maxn);
for(int i=;i<=q;i++){
x=read();
printf("%lld\n",ans[x]);
}
}
}

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

  1. 2018.7.31 Noip2018模拟测试赛(十六)

     日期: 七月最后一天  总分: 300分  难度: 提高 ~ 省选  得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...

  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 05 04 NOIP2018 模拟赛(十二)

    这次的试卷应该是激励我们一下的,链接 然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩 掉了5rating但Rank竟然发杀了 X_o_r dalao && YZ ...

  9. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

随机推荐

  1. Python——序列封包与序列解包

    一.序列封包与序列解包 把多个值赋给一个变量时,Python会自动的把多个值封装成元组,称为序列封包. 把一个序列(列表.元组.字符串等)直接赋给多个变量,此时会把序列中的各个元素依次赋值给每个变量, ...

  2. 4G 内存 怎么只有2.99G可用

    32为系统只可以识别3.25G,而且有256M的内存被显卡共享显存了,所以只剩2,99G.

  3. python - 日期处理模块

    首先就是模块的调用,很多IDE都已经安装好了很多Python经常使用到的模块,所以我们暂时不需要安装模块了. ? 1 2 3 import datetime import time import ca ...

  4. (2) html 语义化

    HTML语义化标签 1 什么是语义化标签? 通过标签判断内容语义,例如根据h1标签判断出内容是标题,根据 p 判断内容是段落.input 标签是输入框等. 2 为什么要标签语义化? 1.搜素引擎友好 ...

  5. 13Shell脚本—编写简单脚本

    1. 概述 Shell脚本命令的工作方式有两种:交互式和批处理. 交互式(Interrctive): 用户每输入一条命令就立即执行. 批处理(Batch): 由用户事先编写好一个完整的 Shell 脚 ...

  6. 如何用纯 CSS 创作一个行驶中的火车 loader

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RBLWzJ 可交互视频 ...

  7. 通过源码编译安装VIM

    开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载旧版本的Vim: sudo ...

  8. stm32L0系列学习(二)HAL-LL库等比较

  9. centos新增或删除用户

    新增用户snzigod:adduser snzigod 修改snzigod密码:passwd snzigod 删除用户snzigod:userdel snzigod 删除用户以及用户目录: userd ...

  10. BZOJ 5336: [TJOI2018]party

    状压最长公共子序列的DP数组,一维最多K(15)个数,且相邻两个数的差不超过1,2^15种状态,预处理转移 #include<cstdio> #include<algorithm&g ...