bzoj4763
$分块$
$一个很有趣的技巧$
$在树上选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的更多相关文章
- 「BZOJ4763」雪辉
「BZOJ4763」天野雪辉 题目大意:有一棵 \(n\) 个点的树,树上每一个点有权值 \(a_i \leq 30000\) ,每次询问给出若干路径,求出这些路径的并上面的不同颜色数与 \(mex\ ...
- [bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克
来自FallDream的博客,未经允许,请勿转载,谢谢. cut掉部分题面. 给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有 ...
- Bzoj4763 雪辉
Time Limit: 39 Sec Memory Limit: 666 MBSubmit: 151 Solved: 80 Description 上次立下的NOIP退役Flag没有成功 这次 ...
- bzoj2589: Spoj 10707 Count on a tree II
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor lastans和v这两个节点间有多少种不同的点权.其中lastans是上一个询问的答案,初 ...
随机推荐
- Layout布局位置
- - GUILayout 这个本身就是用于自动布局的. 不用给定位置的,这也是它与GUI的区别所在.通常默认开始的位置是屏幕的左上角. 当然你也可以限定开始自动布局的位置.用 GUILayout.B ...
- EasyDarwin在做拉模式转发海康RTSP摄像机视频流的过程中出现花屏问题的解决方案
问题描述 在3年前我当时基于EasyDarwin为用户开发了一款RTSP拉模式转发的程序,也发布了一篇博客<用Darwin开发RTSP级联服务器(拉模式转发)>,当时考虑的很简单,只要将R ...
- 常用sql集锦
1.从数据库A中把表tableA导入到数据库B中 --如果主键是自增,则必须列出具体字段.-- select * into tableA from A..tableA 2.批量更改表中某列中的某个字符 ...
- 【题解】[SCOI2010]股票交易
十分普通的DP+不平凡的转移 传送门 这道题状态十分明显.转移是\(O(n^4)\)的,过不去,我们需要优化. 一个十分显然的DP是\(f(i,j)\)表示第\(i\)天时候拥有\(j\)单位股票的最 ...
- Flask:程序结构
在Flask中需要配置各种各样的参数.比如设置秘钥,比如上一章介绍到的配置数据库类型. app.config['SECRET_KEY']=os.urandom(20) app.config['SQLA ...
- 销售订单增强字段 bapi更新
如果增强字段在销售订单抬头(vbak)上,则要将增强字段一并append到如下四个表/结构中: VBAKKOZ VBAKKOZX BAPE_VBAK BAPE_VBAKX 在行项目(vbap)上: V ...
- debian下编译openwrt固件
参考文章:Ubuntu下编译OpenWRT固件 我买的路由器是RG100A-AA,采用了bcm63xx系列的芯片. 下载openwrt源码: svn co svn://svn.openwrt.org/ ...
- Linux-3.14.12内存管理笔记【内存泄漏检测kmemleak示例】【转】
本文转载自:http://blog.chinaunix.net/uid-26859697-id-5758037.html 分析完kmemleak实现后,照常实验一下,以确定功能正常. 如kmemche ...
- 架构设计:系统间通信(34)——被神化的ESB(上)
1.概述 从本篇文章开始,我们将花一到两篇的篇幅介绍ESB(企业服务总线)技术的基本概念,为读者们理清多个和ESB技术有关名词.我们还将在其中为读者阐述什么情况下应该使用ESB技术.接下来,为了加深读 ...
- css的核心
css核心内容--流 流:在现实生活中就是流水,在网页设计中就是元素的排列方式. 标准流:元素在网页中就像流水,排在前面的元素内容前面出现,排在后面的元素内容后面显示. 这种布局方式就称为标准流的布局 ...