题意:给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex
mex就是一个集合中最小的没有出现的非负整数,注意0要算

rand出 \(\sqrt n\)个点,把每次查询拆成 x->fx0->fx->lca->fy->fy0->y

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
template<typename T> void read(T & x) {int c = getchar(); x = 0;while(!isdigit(c)) c = getchar();while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
}
#define read2(a, b) (read(a), read(b))
#define read3(a, b, c) (read(a), read2(b, c))
const int MAXN = 100007;
struct Edge{int v, next;
}G[MAXN<<1]; int tot, head[MAXN], dq[MAXN], n, q, siz[MAXN], dep[MAXN], top[MAXN], anc[MAXN], son[MAXN], cnt[1<<16], s, m, u, v, up[MAXN], pos[357], lca, b, tpos[MAXN];
bool vis[MAXN], f;
int _popcount(int x) {static int ret;for(ret = 0; x; ret += x & 1, x >>= 1);return ret;
}
int popcount(ull x) {static int ret = 0;for(ret = 0; x; ret += cnt[x & 0xffff], x >>= 16);return ret;
}
inline void chmax(int &x, int y) {if (x < y) x = y;}
struct Bitset{static const ull ful = 0xffffffffffffffff;ull bit[470]; int len, Mex, Num;void reset() {for(int i = 0; i <= len; ++i) bit[i] = 0; len = 0; Num = Mex = 0;}void operator |= (const Bitset &rhs) {chmax(len, rhs.len);for(int i = 0; i <= len; ++i) bit[i] |= rhs.bit[i];}void operator |= (int x) {chmax(len, x >> 6);bit[x >> 6] |= 1ull << (x & 63);}int mex() {for(int i = 0; i <= len; ++i) if (bit[i] != ful) for(int j = 0; j < 64; ++j) if (!(bit[i] & (1ull<<j))) return Mex = i * 64 + j;}int num() {for(int i = 0; i <= len; ++i) Num += popcount(bit[i]);return Num;}
}dis[353][351], t; void add(int u, int v) {G[++tot] = (Edge){v, head[u]}; head[u] = tot;}
#define v G[i].v
void dfs1(int u) {dep[u] = dep[anc[u]] + 1;siz[u] = 1;for(int i = head[u]; i; i = G[i].next) {if (v == anc[u]) continue;anc[v] = u;dfs1(v), siz[u] += siz[v];if (siz[son[u]] <= siz[v]) son[u] = v;}
}
void dfs2(int u, int t) {top[u] = t;if (son[u]) dfs2(son[u], t);for(int i = head[u]; i; i = G[i].next) if (v != son[u] && v != anc[u]) dfs2(v, v);
}
#undef v
int LCA(int u, int v) {while(top[u] != top[v]) dep[top[u]] >= dep[top[v]] ? u = anc[top[u]] : v = anc[top[v]];return dep[u] < dep[v] ? u : v;
}
#define u1(x) while(!vis[x] && x != lca) t |= dq[x], x = anc[x];
#define u3(x) while(x != lca) t |= dq[x], x = anc[x];
void u2(int &x) {int nx = x;while(dep[up[x]] > dep[lca]) x = up[x];t |= dis[tpos[nx]][tpos[x]];
}
void update() {u1(u); u1(v);u2(u); u2(v);u3(u); u3(v);
}
int main(void) {
//  freopen("data.in", "r", stdin);for(int i = 0; i < (1<<16); ++i) cnt[i] = _popcount(i);read3(n, m, f);for(int i = 1; i <= n; ++i) read(dq[i]);for(int i = 1; i < n; ++i) read2(u, v), add(u, v), add(v, u);dfs1(1);dfs2(1, 1);s = sqrt(n);for(int i = 1; i <= s; ++i) {do q = rand()%n+1;while(vis[q]);vis[q] = 1, tpos[pos[i] = q] = i;}for(int i = 1; i <= s; ++i) {int u = pos[i]; t.reset();while(u){t |= dq[u];if (vis[u] && u != pos[i]) {dis[i][tpos[u]] |= t;if (!up[pos[i]]) up[pos[i]] = u;}u = anc[u];}}int last = 0;while(m--) {t.reset(); read(b);while(b--) {read2(u, v); if (f) u ^= last, v ^= last;lca = LCA(u, v), t |= dq[lca];update();}last = t.num()+t.mex();printf("%d %d\n", t.Num, t.Mex);}return 0;
}

转载于:https://www.cnblogs.com/storz/p/10191275.html

[BZOJ4763][P3603]雪辉[手写bitset+静态分块]相关推荐

  1. 2017 Multi-University Training Contest - Team 5:1001. Rikka with Candies(手写bitset)

    题意: 给你两个数组A,B,数组中每个数字范围在[1, 50000]内且不重复,q次询问,每次一个值x,问有多少对(a, b),满足 a%b==x,a∈A,b∈B 实际上这题正解还是n²的暴力 思路很 ...

  2. 4763: 雪辉[点分治+可持久化分块]

    4763: 雪辉 Time Limit: 39 Sec  Memory Limit: 666 MB Submit: 85  Solved: 51 [Submit][Status][Discuss] D ...

  3. 「BZOJ4763」雪辉

    「BZOJ4763」天野雪辉 题目大意:有一棵 \(n\) 个点的树,树上每一个点有权值 \(a_i \leq 30000\) ,每次询问给出若干路径,求出这些路径的并上面的不同颜色数与 \(mex\ ...

  4. glide默认的缓存图片路径地址_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...

    上一篇文章<详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化>我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. ...

  5. html如何获取请求头变量的值。_手写一个静态资源中间件,加深了解服务器对文件请求的缓存策略...

    上一篇文章<详解页面静态资源的缓存策略,搞懂强缓存和协商缓存再做性能优化>我们从理论上介绍了浏览器和服务器是如何对静态资源做缓存的,这篇文章我们把它做成一个node服务器的静态资源中间件. ...

  6. [题解] 洛谷 P3603 雪辉

    模拟赛中遇到了这个题,当时我这个沙雕因为把一个\(y\)打成了\(x\)而爆零.回来重新写这道题,莫名其妙的拿了rank1... 我的解法与其他几位的题解有些不同我太蒻了.并没有选取所谓的关键点,而是 ...

  7. [bzoj4763]雪辉[bzoj4812][Ynoi2017]由乃打扑克

    来自FallDream的博客,未经允许,请勿转载,谢谢. cut掉部分题面. 给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有 ...

  8. Bzoj4763 雪辉

    Time Limit: 39 Sec  Memory Limit: 666 MB Submit: 151  Solved: 80 Description 上次立下的NOIP退役Flag没有成功 这次就 ...

  9. [洛谷]CON1466 洛谷2017春节联欢赛 Hello Dingyou题解 Bzoj4763雪辉

    题目来源:https://www.luogu.org/contest/show?tid=1466 创建时间:2017/3/13 18:33 镇楼图:       猜猜她是谁~ 解题思路: 春节居然也有 ...

最新文章

  1. 20万个法人、百万条银行账户信息,正在暗网兜售
  2. 【CUDA编程】Warp Divergence分析
  3. User status profile field in WebUI
  4. xvhfeng的工作回忆总结(第二年)阅读手记
  5. java 序列化工具kryo_java jackson avro kryo等几种序列化与反序列化工具的使用
  6. android.graphics.drawable.Drawable.Callback回调接口
  7. 第2章_Java基本语法(下):程序流程控制
  8. 多标签分类的评价指标
  9. homebrew下安装mysql_Mac下homebrew安装Mysql以及配置问题
  10. 服务器安全配置常用软件
  11. 锁定计算机和睡眠有什么区别,电脑休眠和睡眠哪个好?电脑计算机睡眠和休眠有什么区别...
  12. 深度学习论文翻译解析:YOLOv4: Optimal Speed and Accuracy of Object Detection
  13. 如何远程控制您的PC(即使崩溃)
  14. img固定宽高,图片等比缩小不变形
  15. 成都聚华祥科技:标题的关键词组合技巧
  16. ANSJ调用word2vec model文件
  17. 3大利器推荐,帮你写出规范漂亮的python代码
  18. 谷歌浏览器导入密码设置
  19. SYU新人提高90题1(基础题)
  20. 华为OD机试 - 考古学家(Python)| 代码编写思路+核心知识点

热门文章

  1. MySQL NDB Cluster 搭建
  2. 微软认知服务的使用 – 漫画翻译
  3. 开脑洞:数字文明的等级
  4. 【delphi】各大平台短信功能控件实现(含源代码、演示程序、帮助)
  5. 磁力搜索网站+下载神器放送2019-03-05
  6. Oracle_02查询函数
  7. wx小程序笔记(2)
  8. 3dvary灯光材质为什么不亮_为什么老司机都不把卤素车灯升级?听老司机说完,后悔升级了...
  9. .bat文件打开闪退
  10. Fiddler抓包夜神模拟器