首页 > 其他分享 >CF633G Yash And Trees

CF633G Yash And Trees

时间:2023-07-20 18:58:26浏览次数:34  
标签:ch int Yash tr mid Trees bitset CF633G define

简单题。

先把树拍扁成序列,在 dfn 序上区间修改区间查询。

由于时限 4s,我们可以整点怪的,比如 bitset

把区间内的数有/没有表示成 \(01\) 序列,考虑到区间加取模相当于区间内的数全部循环右移,用 bitset 可以做到 \(O(\frac m \omega)\)。

然后用线段树维护这个序列就行了,查询的时候和质数的 bitset 与一下,复杂度 \(O\left(\dfrac{nm\log n}{\omega}\right)\)。跑得飞快。

#include <bits/stdc++.h>
using namespace std;

namespace vbzIO {
	char ibuf[(1 << 20) + 1], *iS, *iT;
	#if ONLINE_JUDGE
	#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
	#else
	#define gh() getchar()
	#endif
	#define rd read
	#define wr write
	#define pc putchar
	#define pi pair<int, int>
	#define mp make_pair
	#define fi first
	#define se second
	#define pb push_back
	#define ins insert
	#define era erase
	inline int read () {
		char ch = gh();
		int x = 0;
		bool t = 0;
		while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
		while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
		return t ? ~(x - 1) : x;
	}
	inline void write(int x) {
		if (x < 0) {
			x = ~(x - 1);
			putchar('-');
		}
		if (x > 9)
			write(x / 10);
		putchar(x % 10 + '0');
	}
}
using vbzIO::read;
using vbzIO::write;

const int N = 1e5 + 100;
const int M = 1e3 + 100;
int n, m, q, dfc, tot, pr[M], a[N], id[N], p[N], sz[N], tg[N << 2];
vector<int> g[N];
bitset<M> tr[N << 2], vis, S;

void dfs(int u, int fa) {
	p[id[u] = ++dfc] = u, sz[u] = 1;
	for (int v : g[u]) {
		if (v == fa) continue;
		dfs(v, u), sz[u] += sz[v];
	}
}

#define ls x << 1
#define rs x << 1 | 1
#define mid ((l + r) >> 1)
void pushup(int x) { tr[x] = tr[ls] | tr[rs]; }
void pushtg(int x, int c) {
	c %= m, tg[x] = (tg[x] + c) % m;
	tr[x] = (tr[x] >> (m - c)) | ((tr[x] << c) & S);
}

void pushdown(int x) {
	if (!tg[x]) return;
	pushtg(ls, tg[x]), pushtg(rs, tg[x]);
	tg[x] = 0;
}

void build(int l, int r, int x) {
	if (l == r) return tr[x][a[p[l]]] = 1, void();
	build(l, mid, ls), build(mid + 1, r, rs), pushup(x);
}

void add(int l, int r, int s, int t, int c, int x) {
	if (s <= l && r <= t) return pushtg(x, c);
	pushdown(x);
	if (s <= mid) add(l, mid, s, t, c, ls);
	if (t > mid) add(mid + 1, r, s, t, c, rs);
	pushup(x);
}

auto qry(int l, int r, int s, int t, int x) {
	if (s <= l && r <= t) return tr[x];
	pushdown(x);
	if (s > mid) return qry(mid + 1, r, s, t, rs);
	else if (t <= mid) return qry(l, mid, s, t, ls);
	else return qry(l, mid, s, t, ls) | qry(mid + 1, r, s, t, rs);
}

int main() {
	n = rd(), m = rd();
	for (int i = 1; i <= n; i++) a[i] = rd() % m;
	for (int i = 1, u, v; i <= n - 1; i++) {
		u = rd(), v = rd();
		g[u].pb(v), g[v].pb(u);
	}
	dfs(1, 0), build(1, n, 1);
	vis.set(), vis[1] = vis[0] = 0;
	for (int i = 2; i <= m; i++) {
		if (vis[i]) pr[++tot] = i;
		for (int j = 1; j <= tot && i * pr[j] <= m; j++) {
			vis[i * pr[j]] = 0;
			if (i % pr[j] == 0) break;
		}
	}
	for (int i = 0; i <= m - 1; i++) S[i] = 1;
	q = rd();
	while (q--) {
		int op = rd(), u = rd();
		if (op == 1) {
			int v = rd();
			add(1, n, id[u], id[u] + sz[u] - 1, v % m, 1);
		} else wr((qry(1, n, id[u], id[u] + sz[u] - 1, 1) & vis).count()), puts("");
	}
	
	return 0;
}

标签:ch,int,Yash,tr,mid,Trees,bitset,CF633G,define
From: https://www.cnblogs.com/Ender32k/p/17569300.html

相关文章

  • vue-treeselect 被 overflow 遮挡
    场景在一个内容区域设置了overflow纵向滚动的对话框中,内部的vue-treeselect组件下拉框选项被遮挡了。解决办法给vue-treeselect设置appendToBody和z-index属性。注意事项设置了appendToBody后,下拉框选项的字号会变大。为了与原来的字号相匹配,需要修改样式。找......
  • TreeSaver 图片的定位
    Treesaver是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browsersize),选用不同的分栏表格(grid)做排版。不同排版效果下,图片出现的位置有啥规律,这就是本文要分析的内容: 一些典型的图片出现的规律:首先我们看一些图片出现的规律:一、当显示的区域只有两栏时,显示另外一个......
  • TreeSaver 使用教程整理——Step 4: Using a Title Figure
    请首先阅读前几篇教程,才能对本篇文章了解比较深入:TreeSaver使用教程整理——Step1:GettingStartedTreeSaver使用教程整理——Step2:AddingBasicUITreeSaver使用教程整理——Step3:CreatingGrids我们在第二步的基础上,copy到step4作为我们step4初始的基础。 Step4......
  • TreeSaver 使用教程整理——Step 3: Creating Grids
    请首先阅读前几篇教程,才能对本篇文章了解比较深入:TreeSaver使用教程整理——Step1:GettingStartedTreeSaver使用教程整理——Step2:AddingBasicUI我们在第二步的基础上,copy到step3作为我们step3初始的基础。 Step3:CreatingGrids模板文件resources.html的变化在......
  • TreeSaver 使用教程整理——Step 2: Adding Basic UI
    请首先阅读前一篇教程:TreeSaver使用教程整理——Step1:GettingStartedStep2:AddingBasicUI我们上一步实现的网页有了一个最最简单的功能,这一步我们将在上一步基础上添加切换分页的按钮以及显示当前页面信息。请Copy上一步的内容,并对下面文件做如下修改: 对资源文件(resource......
  • TreeSaver 使用教程整理——Step 1: Getting Started
    TreeSaver介绍Treesaver是一个开源的JavaScript框架,用来创建杂志风格的网页布局。 为何要整理这个系列的文章下面的教程整理自:https://github.com/Treesaver/treesaver/wiki/Walkthrough,也许是这个框架目前才刚刚起步,它的文档很成问题,文档中一些链接不能下载,源代码中欠缺一......
  • TreeSelect 树形选择 选中子级显示所有父级及本身
    由于需求的需要,需要在选中二级的时候,将全部路径完整的在输入框显示:如图所示 看了一下,tree自带的属性没有此功能,经过一番思考,直接可以给绑定的model赋值的操作实现,代码如下:<template><el-tree-select:disabled='props.disabled'ref='treeRef'node-key='value':props="t......
  • [数据结构]Binary Indexed Trees(树状数组)
    BinaryIndexedTrees(树状数组)1.lowbitlowbit(x)是x的二进制表达式中最低位的1所对应的值。比如,6的二进制是110,所以lowbit(6)=2。lowbit(x)=x&(-x)2.定义,查询,修改(eg1)\(a1,a2,...,an\)能在BZ的时间复杂度下完成:单点加,\(ai+=d\)查询前缀和\(\sum_{i=1}^{x}ai......
  • Codeforces Round 875 (Div. 2) C. Copil Copac Draws Trees
    bfs解法如果是暴力求解的话就每次都扫描一次所有边直到所有点都和树连接优化:每次扫描我们可以发现会重复扫描那些已经存在树中的边了,因此我们可以只扫描还没有存在树中的边且是没扫过的边对于每次更新,比如由点a已经在树中,更新点b,我们只需判断点a被更新到树中点的编号和a-b边的......
  • TreeSaver.js 的工作流程逻辑
    Treesaver是浏览器大小尺寸敏感(size-sensitive)的,会就着当前的浏览器尺寸(browsersize),选用不同的分栏表格(grid)做排版。初始化TreeSaver.js框架的入口源代码在后面可以看到:https://github.com/Treesaver/treesaver/blob/master/src/init.js这里的代码用到了Google开发的JS库:Closur......