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. 环游世界 首先我们先排个序,想一下如果不用走回来 ...
随机推荐
- PAT (Basic Level) Practise (中文)- 1018. 锤子剪刀布 (20)
http://www.patest.cn/contests/pat-b-practise/1018 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统 ...
- 01_12_JSP简介
01_12_JSP简介 1. JSP简介 JSP---Java Server Pages 拥有servlet的特性与优点(本身就是一个servlet) 直接在HTML中内嵌JSP代码 JSP程序有JS ...
- numpy的linspace使用详解
文档地址: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html Parameters(参数): start ...
- OpenCV3.42+VS2017配置+模块计算机类型“X86”与目标计算机类型“x64”冲突”的问题解决
目录 OpenCV3.42+VS2017配置 Visual Studio 2017 第三方依赖设置,附加依赖项和附加库目录 "fatal error LNK1112: 模块计算机类型&quo ...
- Unity学习之路——C#相关
1.C#数组数组定义 int[] number; float[] score; string[] names;动态初始化,借助new运算符为数组元素分配空间int[] Array = new int[ ...
- Struts2和SpringMVC简单配置以及区别总结
Struts2: struts 2 是一个基于MVC(mode-view-con)设计模式的Web应用框架,是由Struts1和WebWork两个经典框架发展而来的. 工作流程: 1客户端浏览器发出H ...
- 【结构型模式】《大话设计模式》——读后感 (12)在NBA我需要翻译?——适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能在一起工作的 那些类可以在一起工作了[DP] UML类图: 简单模拟一下代码: //已存在的.具有 ...
- PEP-8 规范1
代码布局 缩进 每个缩进级别使用4个空格. 延续线应使用Python的隐含线连接在括号,括号和大括号内,或使用悬挂缩进[7],垂直对齐包装元素.使用悬挂式凹痕时,应考虑以下因素;第一行应该没有参数,应 ...
- 【HIHOCODER 1599】逃离迷宫4
描述 小Hi被坏女巫抓进一座由无限多个格子组成的矩阵迷宫. 小Hi一开始处于迷宫(x, y)的位置,迷宫的出口在(a, b).小Hi发现迷宫被女巫施加了魔法,假设当前他处在(x, y)的位置,那么他只 ...
- Makefile基础(一)
在大型的C语言项目中,一般都是由多个源文件编译链接形成的可执行程序,而这些源文件的处理步骤,通常交给Makefile来管理,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后 ...