题目链接:http://codeforces.com/problemset/problem/633/G

大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的质数。

第一种操作非常熟悉了,把每个节点dfs过程中的pre和post做出来,对序列做线段树。维护取模也不是问题。第二种操作,可以利用bitset记录质数出现情况。所以整个线段树需要维护bitset的信息。

对于某一个bitset x,如果子树所有值需要加y,则x=(x<<y)|(x>>(m-y))

一开始写挂了几次,有一点没注意到,因为我bitset直接全都是1000,而不是m,所以上面式子左移会有问题,解决方法是做一个0到m每位都是1的全集,或者表示质数集的bitset上限做到m。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctime>
#include <numeric>
#include <bitset>
#include <cassert> using namespace std;
const int N=;
int a[N];
vector<int>edge[N];
bitset<>bs[N<<];
bitset<>prime;
int mark[N<<];
int L[N],R[N];
int dfn=;
int m;
int id[N];
void dfs(int u,int f) {
L[u]=++dfn;
id[dfn]=u;
for (int i=;i<edge[u].size();i++) {
int v=edge[u][i];
if (v==f)
continue;
dfs(v,u);
}
R[u]=dfn;
}
void up(int rt) {
bs[rt]=(bs[rt<<]|bs[rt<<|]);
}
void add(int rt,int x) {
bs[rt]=(((bs[rt]<<x))|(bs[rt]>>(m-x)));
}
void down(int rt) {
if (mark[rt]) {
add(rt<<,mark[rt]);
add(rt<<|,mark[rt]);
mark[rt<<]=(mark[rt<<]+mark[rt])%m;
mark[rt<<|]=(mark[rt<<|]+mark[rt])%m;
mark[rt]=;
}
}
void build(int l,int r,int rt) {
mark[rt]=;
if (l==r) {
int x=a[id[l]];
bs[rt].set(x);
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
up(rt);
} void upd(int L,int R,int x,int l,int r,int rt) {
if (L<=l&&r<=R) {
add(rt,x);
mark[rt]=(mark[rt]+x)%m;
return;
}
down(rt);
int m=(l+r)>>;
if (L<=m)
upd(L,R,x,l,m,rt<<);
if (R>m)
upd(L,R,x,m+,r,rt<<|);
up(rt);
}
bitset<> ans;
void ask(int L,int R,int l,int r,int rt) {
if (L<=l&&r<=R) {
ans|=bs[rt];
return;
}
down(rt);
int m=(l+r)>>;
if (L<=m)
ask(L,R,l,m,rt<<);
if (R>m)
ask(L,R,m+,r,rt<<|);
} int main () {
int n;
scanf("%d %d",&n,&m);
for (int i=;i<m;i++) {
bool isp=true;
for (int j=;isp&&j*j<=i;j++) {
if (i%j==)
isp=false;
}
if (isp){
prime.set(i);
}
}
for (int i=;i<=n;i++){
scanf("%d",a+i);
a[i]%=m;
}
for (int i=;i<n;i++) {
int u,v;
scanf("%d %d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfn=;
dfs(,-);
build(,n,);
int Q;
scanf("%d",&Q);
while (Q--) {
int op;
scanf("%d",&op);
if (op==) {
int u,x;
scanf("%d %d",&u,&x);
x%=m;
upd(L[u],R[u],x,,n,);
}
else {
int u;
scanf("%d",&u);
ans=;
ask(L[u],R[u],,n,);
ans&=prime;
int ret=ans.count();
printf("%d\n",ret);
}
}
return ;
}

CF Manthan, Codefest 16 G. Yash And Trees 线段树+bitset的更多相关文章

  1. Manthan, Codefest 16 G. Yash And Trees dfs序+线段树+bitset

    G. Yash And Trees 题目连接: http://www.codeforces.com/contest/633/problem/G Description Yash loves playi ...

  2. G. Yash And Trees 线段树 + dfs序 + bitset

    这个是要用bitset 一个大整数的二进制 学习推荐博客 这个题目大意就是:给你n,m 还有一个序列,还有一个一棵树,有一种操作一种询问 操作是给你一个节点 把这个节点及其子节点都加上x 询问是 给你 ...

  3. CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie

    题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...

  4. CF Manthan, Codefest 16 B. A Trivial Problem

    数学技巧真有趣,看出规律就很简单了 wa 题意:给出数k  输出所有阶乘尾数有k个0的数 这题来来回回看了两三遍, 想的方法总觉得会T 后来想想  阶乘 emmm  1*2*3*4*5*6*7*8*9 ...

  5. Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp

    C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...

  6. Manthan, Codefest 16

    暴力 A - Ebony and Ivory import java.util.*; import java.io.*; public class Main { public static void ...

  7. codeforces 633G. Yash And Trees dfs序+线段树+bitset

    题目链接 G. Yash And Trees time limit per test 4 seconds memory limit per test 512 megabytes input stand ...

  8. Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵

    H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...

  9. DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)

    题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...

随机推荐

  1. Node.js web快速入门 -- KoaHub.js

    介绍 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & ...

  2. SEO-站外优化规范

    站外优化规范 新站 前期(提高网站曝光率<信息发布平台>) 一. 分类目录信息发布 二. 黄页网信息发布 三. 友链平台信息发布 四. 各大论坛引蜘蛛区信息发布 五. 网址提交 六. 社区 ...

  3. 【转】Django Middleware

    Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的.我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以 ...

  4. 队列工厂之RedisMQ

    本次和大家分享的是RedisMQ队列的用法,前两篇文章队列工厂之(MSMQ)和队列工厂之RabbitMQ分别简单介绍对应队列环境的搭建和常用方法的使用,加上本篇分享的RedisMQ那么就完成了咋们队列 ...

  5. 解决在eclipse中写ImageView时有警告的问题

    Eclipse中写了一个android程序其中main.xml中ImageView哪行是个黄叹号!不知道为什么? 解决办法: android:contentDescription="@str ...

  6. 初识vuex

    1.简介 vuex是 vue官方推荐的一个状态管理器.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就展现出来. 我们从vuex的原理以及vuex的api两个部分介绍vue ...

  7. Jmeter-测试计划元件

    打开Jmeter页面,默认显示测试计划和工作台: 1.测试计划: 用来描述一个性能测试,包含与本次性能测试所有相关的功能.也就说性能测试的所有内容是于基于一个计划的. 右键单击"测试计划&q ...

  8. sqlcmd的使用小结

    据说,超过80M的sql文件是不能在查询分析器中执行的(可能是运行得太慢,也可能查询分析器就不能容载如此多的语句). 那么就有了sqlcmd命令: 首先进入cmd窗口,便可进行以下操作 1.登录sql ...

  9. Access SQL实现连续及不连续Rank排名

    一.关于起因 在Excel中我们经常使用Rank函数对数据进行排名操作.而在Access中我们要进行排名是找不到这个Rank函数的,此时我们需要自己书写VBA代码或者建立SQL查询来完成排序操作. 今 ...

  10. 利用php数组函数进行函数式编程

    因为一个BUG, 我在一个摇摇欲坠,几乎碰一下就会散架的项目中某一个角落中发现下面这样一段代码 这段程序与那个BUG有密切的关系. 我来回反复的捉摸这段代码, 发现这段代码实现了两个功能 第一个是在一 ...