2018.8.7 Noip2018模拟测试赛(二十)
|
日期: |
八月七号 |
总分: |
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模拟测试赛(二十)的更多相关文章
- 2018.7.31 Noip2018模拟测试赛(十六)
日期: 七月最后一天 总分: 300分 难度: 提高 ~ 省选 得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...
- 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 05 04 NOIP2018 模拟赛(十二)
这次的试卷应该是激励我们一下的,链接 然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩 掉了5rating但Rank竟然发杀了 X_o_r dalao && YZ ...
- EZ 2018 06 24 NOIP2018 模拟赛(二十)
很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...
随机推荐
- stringByAppendingString和stringByAppendingPathComponent
NSString提供了两个拼串的方法: /** * @brief 简单的字符串拼接,头文件 NSString (NSStringExtensionMethods) * * @param aString ...
- Java的WatchService文件夹监听遇到的一些问题
打开word文档时会新增一个~$开头的同名文件,关闭时该文件自动删除 修改excel文件时,会新增一个文件名像E56B4610,CBC15610等这样的文件,同时也会产生tmp格式的文件 PPT文件修 ...
- 关于上传文件 非ajax提交 得到后台数据问题
<form name="configForm" id="configForm" method="post" action=" ...
- 20181207(sys,shelve,logging)
一.logging模块 logging专门用来记录日志 日志的级别分为五级,可以用数字表示,从低到高分别为: import logginglogging.info('info') #10logg ...
- python多进程并发进程池Pool
简介: python中的多进程主要使用到 multiprocessing 这个库.低版本python这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级 ...
- Nordic Collegiate Programming Contest 2015 D. Disastrous Downtime
You're investigating what happened when one of your computer systems recently broke down. So far you ...
- selenium2用AutoIt上传文件
1.标签是input,如下图所示: WebElement e1= driver.findElement(By.id("load"));//输入要上传文件的地址e1.sendKeys ...
- 可持久化treap(FHQ treap)
FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值 ...
- LA 7056 Colorful Toy Polya定理
题意: 平面上给出一个\(N\)个点\(M\)条边的无向图,要用\(C\)种颜色去给每个顶点染色. 如果一种染色方案可以旋转得到另一种染色方案,那么说明这两种染色方案是等价的. 求所有染色方案数 \( ...
- 当列表推导式遇到lambda(匿名函数)
Python这么优雅的语言,我也是醉了...... 事情由一段代码引发,请看: 上述的列表推导式+lambda表达式+for循环,他们碰撞出来的结果搞的人晕头转向,咱们逐步来分析一下他们到底是个什么鬼 ...