CF633G
题目大意:
给你一棵树,根节点为1
有2种操作,第一种是给u节点所在的子树的所有节点的权值+x
第二种是询问,假设v是子树u中的节点,有多少种质数p满足av = p + m·k
做法:维护子树信息显然dfs序,考虑用线段树维护一个区间内有哪些值
每个区间用一个bitset维护
这里有一个小技巧,bitset都+x然后%m,可以bt2[k]=(bt2[k]<<y)|(bt2[k]>>(m-y));
然后求出区间的bitset,和质数的bitset&一下,求1的个数即可
代码如下:
#include<bits/stdc++.h>
#define N 500005
using namespace std;bool vis[N];
int n,m,Q,x,y,opt,tim1,kk,tot,head[N],a[N],dfn[N],sz[N],pr[N];
bitset<1005>bt1,bt2[N],bt3;int ee[N],reall[N];
struct Tree{int nxt,to;}e[N];
inline void link(int x,int y){e[++kk].nxt=head[x];e[kk].to=y;head[x]=kk;}
inline void init(){
for (int i=2;i<m;i++){
if (!vis[i]) pr[++tot]=i;
for (int j=1;j<=tot;j++){
if (i*pr[j]>=m) break;
vis[i*pr[j]]=true;
if (i%pr[j]==0) break;
}
}
}
void dfs(int u,int fa){
sz[u]=1;dfn[u]=++tim1;reall[tim1]=a[u];
for (int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if (v==fa) continue;
dfs(v,u);sz[u]+=sz[v];
}
}
void build(int k,int l,int r){
if (l==r){bt2[k][reall[l]]=1;return;}
int mid=(l+r)>>1;
build(k*2,l,mid);build(k*2+1,mid+1,r);
bt2[k]=bt2[k*2]|bt2[k*2+1];
}
void update(int k,int y){y%=m;bt2[k]=(bt2[k]<<y)|(bt2[k]>>(m-y));}
inline void pushdown(int k){
if (!ee[k]) return;
ee[k*2]=(ee[k*2]+ee[k])%m;
ee[k*2+1]=(ee[k*2+1]+ee[k])%m;
update(k*2,ee[k]);update(k*2+1,ee[k]);
ee[k]=0;
}
void add(int k,int l,int r,int x,int y,int z){
if (l!=r) pushdown(k);
if (x<=l&&y>=r){update(k,z);ee[k]=(ee[k]+z)%m;return;}
int mid=(l+r)>>1;
if (y<=mid) add(k*2,l,mid,x,y,z);
else if (x>mid) add(k*2+1,mid+1,r,x,y,z);
else add(k*2,l,mid,x,mid,z),add(k*2+1,mid+1,r,mid+1,y,z);
bt2[k]=bt2[k*2]|bt2[k*2+1];
}
void query(int k,int l,int r,int x,int y){
if (l!=r) pushdown(k);
if (x<=l&&y>=r){bt3=bt3|bt2[k];return;}
int mid=(l+r)>>1;
if (y<=mid) query(k*2,l,mid,x,y);
else if (x>mid) query(k*2+1,mid+1,r,x,y);
else query(k*2,l,mid,x,mid),query(k*2+1,mid+1,r,mid+1,y);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]%=m;
for (int i=1;i<n;i++){
scanf("%d%d",&x,&y);
link(x,y);link(y,x);
}
init();
for (int j=1;j<=tot;j++) bt1[pr[j]]=1;
//printf("%d\n",(int)bt1.count());
dfs(1,-1);
//for (int i=1;i<=n;i++) printf("%d ",dfn[i]);puts("");
//for (int i=1;i<=n;i++) printf("%d ",reall[i]);puts("");
build(1,1,n);
//if (bt2[7][5]) puts("Yes1");
/*if (bt2[3][5]) puts("Yes1");//
if (bt2[3][1]) puts("Yes2");
if (bt2[2][7]) puts("YES1");
if (bt2[2][8]) puts("YES2");
if (bt2[2][0]) puts("YES3");
if (bt2[1][8]) puts("Yes1");
if (bt2[1][7]) puts("Yes2");
if (bt2[1][5]) puts("Yes3");
if (bt2[1][1]) puts("Yes4");
if (bt2[1][0]) puts("Yes5");*/
scanf("%d",&Q);
while (Q--){
scanf("%d%d",&opt,&x);
if (opt==1){
scanf("%d",&y);y%=m;
if (y) add(1,1,n,dfn[x],dfn[x]+sz[x]-1,y);
}
else {
/*if (bt2[1][0]) puts("Yes1");
if (bt2[1][9]) puts("Yes2");
if (bt2[1][7]) puts("Yes3");
if (bt2[1][3]) puts("Yes4");
if (bt2[1][2]) puts("Yes5");*/
bt3.reset();
query(1,1,n,dfn[x],dfn[x]+sz[x]-1);
//printf("%d\n",(int)bt3.count());
bt3=bt3&bt1;
printf("%d\n",(int)bt3.count());
}
}
return 0;
}
CF633G的更多相关文章
随机推荐
- 一个iOS6系统bug+一个iOS7系统bug
先看实际工作中遇到的两个bug:(1)iPhone Qzone有一个导航栏背景随着页面滑动而渐变的体验,当页面滑动到一定距离时,会改变导航栏上title文本的颜色,但是有一个莫名其妙的bug,如下:
- OpenCV实时美颜摄像并生成H264视频流
为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者f ...
- Android批量打包-如何一秒内打完几百个apk渠道包
在国内Android常用渠道可能多达几十个,如: 谷歌市场.腾讯应用宝.百度手机助手.91手机商城.360应用平台.豌豆荚.安卓市场.小米.魅族商店.oppo手机.联想乐商.中兴汇天地.华为.安智.应 ...
- Nginx创建密码保护目录
nginx 的根目录 为:/home/undoner/nginx-wwwnginx 访问地址 为:http://127.0.0.1本文实现对nginx根目录文件访问的权限控制 (1)nginx指定密码 ...
- IBM SPSS 实习总结
2015过完年,我知道导师要出国了,自己也算是水了一个idea 的论文.希望研二能找个实习,早听说西安IBM这边有学长在里面实习过,2月底联系了一下简历就塞了过去.面试就在锦业一路软件园他们上班的地方 ...
- Java中的this关键字
//Java中的this //this引用---->当前对象的引用 /* * 1.this在什么地方(非静态的)访问另外一个成员(非静态,可以是属性或者方法) * 前面都省略了this * 2. ...
- UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
一.记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区. 字节范围锁 byte-range locking 二.历史 flock函数, ...
- android异步任务asyntask详解
在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...
- 小试ImageMagik——使用篇
===================================================== ImageMagick的使用和开发的文章: 小试ImageMagik--使用篇 小试Imag ...
- Django介绍、安装配置、基本使用、Django用户注册例子
Django介绍 Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站 DjangoMTV的思想 没有controller ...