这个是要用bitset 一个大整数的二进制 学习推荐博客

这个题目大意就是:给你n,m 还有一个序列,还有一个一棵树,有一种操作一种询问

操作是给你一个节点 把这个节点及其子节点都加上x

询问是 给你一个节点,问你这个节点以下 小于m的质数有多少种,注意是种,所以要去重,所以需要bitset

这个题目我写了一上午,wa了一下午,在lj的帮助之下终于写出来了。

写法,操作就可以用<< 来代替加上x,但是因为如果超出了m,就要对m取模,所以相当于一个环,这个环的处理要注意。

注意:

我wa的地方:

忘记了update 的push_up 操作,

query的两个区间合起来的时候没有去重。

还有就是 << 这个操作,因为素数一定要小于m,而且每一个数一定小于m,所以<<m,就可以了,而且素数的bitset 只要到m-1就可以了

最后一个最重要的!!!

我建树建错了,这个dfs序之后,如果我想把给的a序列放进来,那么就需要按照dfs序来,所以dfs序,不仅仅要存每一个数映射的位置,而且要存每一个位置存的数。

建树要注意!!! 第一次碰到这个问题,以后希望不要再这样wa一下午了,

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <bitset>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
const int mx = ;
bitset<mx>B;
bitset<mx>C;
bitset<mx>ex;
struct node
{
bitset<mx>bt;
ll lazy;
}tree[maxn*];
int n, m, q, p[maxn];
ll a[maxn];
//素数筛
void init() {
for (int i = ; i < maxn; i++) p[i] = ;
for (int i = ; i*i < maxn; i++) {
if (p[i]) {
for (int j = i * i; j < maxn; j += i) {
p[j] = ;
}
}
}
B.reset(); C.reset();
for (int i = ; i < m; i++) {
if (p[i]) B.set(i);//B构造出一个全部都是素数的bitset
C.set(i);
}
}
//v数组记录每一个i的最小质因数,isp记录所有的质数
int er[maxn], el[maxn], tot;
vector<int>G[maxn];
bool vis[maxn];
int num[maxn];
//dfs序 转化成二叉树
void dfs(int x)
{
vis[x] = ;
el[x] = ++tot;
num[tot] = x;
for(int i=;i<G[x].size();i++)
{
int v = G[x][i];
if (vis[v]) continue;
dfs(v);
}
er[x] = tot;
}
 
//线段树的建树过程
void build(int id,int l,int r)
{
tree[id].lazy = ;
if(l==r)
{
tree[id].bt.set(a[num[l]]);
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
tree[id].bt = tree[id << ].bt | tree[id << | ].bt;
// printf("id=%d l=%d r=%d\n", id, l, r);
// std::cout << tree[id].bt << endl;
}
void push_down(int id)
{
if(tree[id].lazy)
{
ex.reset();
int val = tree[id].lazy;
tree[id << ].bt <<= val;
ex = tree[id << ].bt >> m;
tree[id << ].bt |= ex;
tree[id << ].bt &= C;
 
tree[id << ].lazy += val;
tree[id << ].lazy %= m;
 
ex.reset();
tree[id << | ].bt <<= val;
ex = tree[id << | ].bt >> m;
tree[id << | ].bt |= ex;
tree[id << | ].bt &= C;
 
tree[id << | ].lazy += val;
tree[id << | ].lazy %= m;
 
tree[id].lazy = ;
}
}
 
void update(int id,int l,int r,int x,int y,int val)
{
if(x<=l&&y>=r)
{
// printf("1 id=%d l=%d r=%d x=%d y=%d\n", id, l, r, x, y);
// std::cout << tree[id].bt << endl;
ex.reset();
tree[id].lazy += val;
tree[id].lazy %= m;
 
tree[id].bt <<= val;
// printf("2\n");
// std::cout << tree[id].bt << endl;
ex = tree[id].bt >> m;
tree[id].bt |= ex;
// printf("3\n");
// std::cout << tree[id].bt << endl;
tree[id].bt &= C;
// printf("id=%d l=%d r=%d x=%d y=%d val=%d \n", id, l, r, x, y, val);
// std::cout << tree[id].bt << endl;
return;
}
push_down(id);
int mid = (l + r) >> ;
if (x <= mid) update(id << , l, mid, x, y, val);
if (y > mid) update(id << | , mid + , r, x, y, val);
tree[id].bt = tree[id << ].bt | tree[id << | ].bt;
}
 
bitset<mx> query(int id,int l,int r,int x,int y)
{
if (x <= l && y >= r) {
// printf("id=%d l=%d r=%d x=%d y=%d\n", id, l, r, x, y);
// std::cout << tree[id].bt << endl;
return tree[id].bt&B;
}
push_down(id);
int mid = (l + r) >> ;
bitset<mx>ans;
if (x <= mid) ans |= query(id << , l, mid, x, y);
if (y > mid) ans |= query(id << | , mid + , r, x, y);
// printf("id=%d l=%d r=%d x=%d y=%d\n", id, l, r, x, y);
// std::cout << ans << endl;
return (ans & B);
}
 
int main()
{
tot = ;
scanf("%d%d", &n, &m);
init();
for (int i = ; i <= n; i++) scanf("%lld", &a[i]), a[i] %= m;
for(int i=;i<n;i++)
{
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
memset(vis, , sizeof(vis));
dfs();
build(, , n);
scanf("%d", &q);
while(q--)
{
int opt, v, x;
scanf("%d", &opt);
if(opt==)
{
scanf("%d%d", &v, &x);
x %= m;
update(, , n, el[v], er[v], x);
}
else
{
scanf("%d", &v);
bitset<mx>ans = query(, , n, el[v], er[v]);
printf("%d\n", ans.count());
}
}
return ;
}
 
/*
3 33
94 21 38
3 1
3 2
9
2 1
2 2
1 3 127
2 2
1 2 381
1 1 275
2 2
2 3
1 1 695
 
*/

bitset

G. Yash And Trees 线段树 + dfs序 + bitset的更多相关文章

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

    题目链接:http://codeforces.com/problemset/problem/633/G 大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的 ...

  2. CF620E New Year Tree 线段树+dfs序+bitset

    线段树维护 dfs 序是显然的. 暴力建 60 个线段树太慢,于是用 bitset 优化就好了 ~ code: #include <bits/stdc++.h> #define M 63 ...

  3. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  4. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  5. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  6. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  7. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  8. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数

    R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...

随机推荐

  1. Linux c++ vim环境搭建系列(4)——vim插件安装配置使用

    4. 插件 主要是c++相关的. ~/.vimrc文件在GitHub上有:https://github.com/whuwzp/vim_config 以下内容参考: https://github.com ...

  2. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...

  3. syncronized如何上锁

    上锁,根据操作系统所说的原则,对共享变量上锁,对临界区上锁.谁访问临界资源?就给谁上锁 同步监视器,它上锁的对象. 1.用关键字给方法上锁 2.用synchronized代码块上锁 默认上锁对象:th ...

  4. python2.7安装numpy和pandas

    扩展官网安装numpy,use [v][p][n]下载得会比较快 然后在CMD命令行下进入该文件夹然后输入pip install +numpy的路径+文件名.比如我的是:pip install num ...

  5. Extjs入门——环境配置

    Extjs框架作为一个07年就上线的框架,虽然与现在的框架对比,显得十分臃肿.但是在针对企业内部引用系统上,它依旧能发挥出不错的效果.现在我接触到了Extjs,所以我准备写一个入门框架,简单的介绍Ex ...

  6. 爬虫实战2_有道翻译sign破解

    目标url 有道翻译 打开网站输入要翻译的内容,一一查找network发现数据返回json格式,红框就是我们的翻译结果 查看headers,发现返回结果的请求是post请求,且携带一大堆form_da ...

  7. [PHP][thinkphp5] 学习一:增删改查

    <?php namespace app\index\controller; use think\Controller; use think\Db; class Test extends Cont ...

  8. net core天马行空系列:降低net core门槛,数据库操作和http访问仅需写接口,实现类由框架动态生成

    引文   hi,大家好,我是三合.不知各位有没有想过,如果能把数据库操作和http访问都统一封装成接口(interface)的形式, 然后接口对应的实现类由框架去自动生成,那么必然能大大降低工作量,因 ...

  9. react: typescript integrate withRouter

    define interface: export interface INav { nav: string } export interface IModuleItem { state?: strin ...

  10. prefetch 和 preload 及 webpack 的相关处理

    使用预取和预加载是网站性能和用户体验提升的一个很好的途径,本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法,并使用 webpack 进行实现 Link 的链接类型 < ...