日期:

八月七号

 总分:

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. Html5的等学习

    看了w3c感觉是说明文档,没有详细的说明,然后就去看其他的 html5其实就是在html的基础上做了一些改变,感觉html5的推广还是需要时间的,因为习惯问题,虽然html5有很多很方便的标签如art ...

  2. iOS 资源大全整理

    这是个精心编排的列表,它包含了优秀的 iOS 框架.库.教程.XCode 插件.组件等等. 这个列表分为以下几个部分:框架( Frameworks ).组件( Components ).测试( Tes ...

  3. iOS跳转到各种系统设置界面

    定位服务 定位服务有很多APP都有,如果用户关闭了定位,那么,我们在APP里面可以提示用户打开定位服务.点击到设置界面设置,直接跳到定位服务设置界面.代码如下: //定位服务设置界面 NSURL *u ...

  4. 【差分约束】poj1275Cashier Employment

    比较经典的差分约束 Description A supermarket in Tehran is open 24 hours a day every day and needs a number of ...

  5. mysql基本知识点

    1.建表格式:create table 表名(字段名 约束条件,字段名 约束条件,...);示例:create table brand(brand_id int unique primary key, ...

  6. JS - Array.prototype.sort(compare)

    function compare(a, b) { return -1; // a 在 b 前面 return 1; // a 在 b 后面 return 0; // 并列排序,保持在源数组中的先后顺序 ...

  7. 笔记--Day1--python基础1

    一.目录 1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum),目前已经是使用频度特别高的开发语言. 主要应用领域: 云计算:云计算最火的语言,典型应用有Op ...

  8. 这一千个Python库,总有你想要的!

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...

  9. poj 3262 牛毁坏花问题 贪心算法

    题意:有n头牛,每头牛回去都需要一定时间,如果呆在原地就会毁坏花朵.问:怎么安排使得毁坏的花朵最少? 思路: 拉走成本最高的. 什么是成本?毁坏花朵的数量. 例如有两种排序   (这里用(a,b)表示 ...

  10. NOIP 2017 小凯的疑惑

    # NOIP 2017 小凯的疑惑 思路 a,b 互质 求最大不能表示出来的数k 则k与 a,b 互质 这里有一个结论:(网上有证明)不过我是打表找的规律 若 x,y(设x<y) 互质 则 : ...