$分块$

$一个很有趣的技巧$

$在树上选sqrt(n)个关键点,每两个关键点之间的距离<=sqrt(n),每个关键点属于一条链$

$预处理出每两个关键点的bitset$

$每次询问就暴力向上爬,合并bitset$

$由于要查询,所以要手写bitset$

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int bl = , N = 1e5 + ;
ull Num[];
vector<int> G[N];
int n, m, f, bbl, last;
ull Max;
int fa[N][], dep[N], mx[N], w[N], mark[N], top[N], mir[N];
int read() {
int x = , f = ;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') {
f = -;
}
c = getchar();
}
while(isdigit(c)) {
x = x * + c - '';
c = getchar();
}
return x * f;
}
struct Bitset {
int len;
ull s[bl];
void clear() {
for(int i = ; i <= len; ++i) {
s[i] = ;
}
len = ;
}
void operator |= (const Bitset &a) {
len = max(len, a.len);
for(int i = ; i <= len; ++i) {
s[i] |= a.s[i];
}
}
void operator |= (int b) {
len = max(len, b >> );
s[b >> ] |= 1LL << (b & );
}
int num() {
int ret = ;
for(int i = ; i <= len; ++i) {
ret += Num[s[i] >> ] + Num[(s[i] >> ) & ] + Num[(s[i] >> ) & ] + Num[s[i] & ];
}
return ret;
}
int mex() {
for(int i = ; i <= len; ++i) {
if(s[i] != Max) {
for(int j = ; j < ; ++j) {
if(!(s[i] & (1LL << j))) {
return i * + j;
}
}
}
}
}
} b[][], ans;
void dfs(int u) {
mx[u] = dep[u];
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(v == fa[u][]) {
continue;
}
fa[v][] = u;
dep[v] = dep[u] + ;
dfs(v);
mx[u] = max(mx[u], mx[v]);
}
if(mx[u] - dep[u] >= bbl || u == ) {
mark[u] = ++mark[];
mir[mark[u]] = u;
mx[u] = ;
}
}
int lca(int u, int v) {
if(dep[u] < dep[v]) {
swap(u, v);
}
int d = dep[u] - dep[v];
for(int i = ; i < ; ++i) {
if(d & ( << i)) {
u = fa[u][i];
}
}
if(u == v) {
return u;
}
for(int i = ; i >= ; --i) {
if(fa[u][i] != fa[v][i]) {
u = fa[u][i];
v = fa[v][i];
}
}
return fa[u][];
}
int main() {
n = read();
m = read();
f = read();
bbl = sqrt(n);
for(int i = ; i < ; ++i) {
Max |= 1LL << i;
}
for(int i = ; i < ; ++i) {
for(int j = ; j < ; ++j) {
if(i & ( << j)) {
++Num[i];
}
}
}
for(int i = ; i <= n; ++i) {
w[i] = read();
}
for(int i = ; i < n; ++i) {
int u = read(), v = read();
G[u].push_back(v);
G[v].push_back(u);
}
dep[] = ;
dfs();
for(int j = ; j <= ; ++j) {
for(int i = ; i <= n; ++i) {
fa[i][j] = fa[fa[i][j - ]][j - ];
}
}
for(int i = ; i <= mark[]; ++i) {
ans.clear();
ans |= w[mir[i]];
int x;
b[i][i] |= w[mir[i]];
for(x = fa[mir[i]][]; x; x = fa[x][]) {
ans |= w[x];
if(mark[x]) {
b[i][mark[x]] = ans;
if(!top[mir[i]]) {
top[mir[i]] = x;
}
}
}
}
while(m--) {
int a = read(), x, y, z;
ans.clear();
while(a--) {
x = read();
y = read();
if(f) {
x = x ^ last;
y = y ^ last;
}
ans |= w[x];
ans |= w[y];
z = lca(x, y);
for(; x && !mark[x] && dep[x] > z; x = fa[x][]) {
ans |= w[x];
}
for(; y && !mark[y] && dep[y] > z; y = fa[y][]) {
ans |= w[y];
}
int xx, yy;
for(xx = x; dep[top[xx]] >= dep[z]; xx = top[xx]);
for(yy = y; dep[top[yy]] >= dep[z]; yy = top[yy]);
ans |= b[mark[x]][mark[xx]];
ans |= b[mark[y]][mark[yy]];
for(x = xx; dep[x] >= dep[z]; x = fa[x][]) {
ans |= w[x];
}
for(y = yy; dep[y] >= dep[z]; y = fa[y][]) {
ans |= w[y];
}
}
int ta = ans.num(), tb = ans.mex();
last = ta + tb;
printf("%d %d\n", ta, tb);
}
return ;
}

bzoj4763的更多相关文章

  1. 「BZOJ4763」雪辉

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

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

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

  3. Bzoj4763 雪辉

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

  4. bzoj2589: Spoj 10707 Count on a tree II

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初 ...

随机推荐

  1. 【Atheros】禁用CSMA之后pktgen发包一分钟后无法发送的问题

    无线网络中各个节点不断地广播信标帧,收到某节点的信标帧之后才知道这个节点存在,知道它的网络配置是怎么样的,才能知道应该怎么和它通信. 那么问题来了,禁用了CSMA之后,发送节点全力发送,那么它会永远占 ...

  2. iOS中用UIWebView的loadHTMLString后图片和文字失调解决方法

    iOS中用UIWebView的loadHTMLString后图片和文字失调,图片过大,超过屏幕,文字太小.或者图片太小.文字太大,总之就是不协调. 我们的需求是让图片的大小跟着屏幕的变化而变化.就是动 ...

  3. Spring属性编辑器详解

    1.常见的属性的注入:int,string,list,set,map 2.什么是属性编辑器及作用? (1)将spring配置文件中的字符串转换为相应的java对象 (2)spring内置了一些属性编辑 ...

  4. 对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更高的肩膀

    2017 EasyDarwin现状 自从2012年EasyDarwin项目创立开始,经过了快5年了,时光飞逝,如今EasyDarwin已经发展成为了不仅仅是一个单纯的开源流媒体服务器项目了,已经是各种 ...

  5. 操作符表示指针指向的底层值 切片 nill 清空 按值引用赋值 获取地址赋值

    package main import "fmt" var thisVisitedUrls [] string func tf() { p := &thisVisitedU ...

  6. Tomcat学习笔记【5】--- 项目部署详解

    本文主要讲在Tomcat中部署项目的几种方式:静态部署.动态部署. 一 静态部署 静态部署项目有好几种方式,比较典型的有如下4种: 1.1 方式一:将Web项目放到webApps目录下 直接将web项 ...

  7. ubuntu中设置wireshark抓包

    安装wireshark软件后,打开进行抓包的时候会提示权限不足.原因是普通用户没有执行权限,也打不开网络端口捕捉,因为dumpcap需要root权限. 产生这种问题的原因:比如:wireshark在进 ...

  8. Mac root Operation not permitted

      在mac下sudo 拷贝和删除文件时提醒Operation not permitted. 网上查了一些资料,需要执行 chflags nouchg /path/to/item 命令. 赶紧照做, ...

  9. smartforms 条码打印

    转自:http://blog.csdn.net/zhongguomao/article/details/6759642 SAP 条码打印有 新旧 两种技术方法:1.传统的(旧):将数据发送到打印机上, ...

  10. 转 Spring 组件 <context:component-scan base-pakage="">用法

    1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...