日期:

八月七号

 总分:

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. 在无TNS配置时,登录到数据库。

    sqlplus user/pw@ip:port/servicename sqlplus user/pwd@tnsname sqlplus user/pwd---aix sqlplus /nolog&g ...

  2. c++作业:求N的阶乘。

    N的阶乘就是n.(n-1)! 5的阶乘是什么?5*4*3*2*1 #include <iostream> using namespace std; int jiecheng(int num ...

  3. lua调用java过程

    在cocos2dx框架中,有继承好的luaj文件来方便我们去使用lua调用java底层代码,注意:luaj只能使用在安卓平台下,如果在平台下使用,会出错, 所以使用前需要加平台判断,方法 如下: lo ...

  4. SDWebImage解析

    SDWebImage托管在github上.https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下 ...

  5. laravel连接数据库提示mysql_connect() :Connection refused...

    在.env配置文件中填写了正确的数据库连接配置的情况下连接还是出错了,明显提示的不是密码错误,那就看看端口吧, DB_HOST=127.0.0.1 DB_PORT= DB_DATABASE=test ...

  6. Python基础——异常

    捕捉所有异常 for i in range(10): try: input_number=input('write a number') if input_number=='q': break res ...

  7. CentOS 7.X 中systemctl命令用法详解

    systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体.可以使用它永久性或只在当前会话中启用/禁用服务,下面来看CentOS 7.X 中 ...

  8. 线段树:POJ3468-A Simple Problem with Integers(线段树注意事项)

    A Simple Problem with Integers Time Limit: 10000MS Memory Limit: 65536K Description You have N integ ...

  9. PAT Basic 1079

    1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0.N 被称 ...

  10. Java技术——多态的实现原理

    .方法表与方法调用 如有类定义 Person, Girl, Boy class Person { public String toString(){ return "I'm a person ...