有毒

第一开始一直RE,我就把dfs改成了bfs

结果一直TLE,自己造的数据要跑8s

因为 lxl 等人讲随机 $\sqrt{n}$ 个点作为关键点就可以了

但是我把随机改成深度有关就AC了,而且那组数据跑了200ms

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define dbg(x) cerr<<#x" = "<<x<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define Es(x,i) for(Edge*i=G[x];i;i=i->nxt)
typedef long long ll;
typedef pair<int,int> pii;
const int inf=~0u>>1,MOD=1e9+7;
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=((TT=but)+fread(but,1,1<<15,stdin)),TT==mo))?-1:*TT++)
inline int rd() {
int x,c,f=1;while(!isdigit(c=getchar()))f=c!='-';x=c-'0';
while(isdigit(c=getchar()))x=x*10+c-'0';return f?x:-x;
}
#define Q 64
const int N=100011,MX=30000/Q+2,Modx=131;
typedef unsigned long long ui;
#define lb _lb_
int fx[1<<16],fy[Modx];
inline int pcal(){
For(i,1,1<<16)fx[i]=fx[i^(i&-i)]+1;
ui t=1;
fy[1]=0;
For(i,1,Q)t<<=1,fy[t%Modx]=i;
}
inline int cal1(unsigned int i){
//cout<<i<<" f "<<fx[i&((1<<16)-1)]+fx[i>>16]<<endl;
return fx[i&((1<<16)-1)]+fx[i>>16];
} inline int cal(ui i){
unsigned int a=i>>32,b=i&(~0ull);
return cal1(a)+cal1(b);
}
inline int lb(ui i){
return fy[i%Modx];
}
struct bs{
ui w[MX];
bs (int _t=1){if(!_t)memset(w,0,sizeof w);}
void Ci(){memset(w,0,sizeof w);}
//inline uint&operator&(int i){return w[i];}
void operator|=(const bs&b){
For(i,0,MX)this->w[i]|=b.w[i];
} bs operator|(const bs&b)const{
static bs c;
c.Ci();
For(i,0,MX)c.w[i]=w[i]|b.w[i];
return c;
}
inline void in(int i){
int j=i>>6;i&=(63);
w[j]|=(1ull<<i);
}
inline pii query(){
static const ui I=~0ull;
//cerr<<I<<endl;
//int t=clock();
int a=0,b;
For(i,0,MX)if(w[i]!=I){
ui t=w[i];int p=0;
t=~t;
t=t&-t;
//while(t&1)t>>=1,++p;
b=(i<<6)+lb(t);break;
}
For(i,0,MX)if(w[i]){
a+=cal(w[i]);
//cout<<i<<" "<<w[i]<<endl;
}
//dbg(clock()-t);
return mp(a,b);
}
#undef Q
} b[(int)(1.8*N+1000)],*it=b;
struct Edge{int v;Edge*nxt;}pl[N<<1],*cur=pl,*G[N];
inline void ins(int u,int v){*cur=(Edge){v,G[u]},G[u]=cur++;}
int n,rt,a[N],m,bel[N],fa[N];
int L[N],tot;
int Top[N],dep[N],son[N],sz[N],q[N];
inline void dfs(int S){
int h,t=1;q[h=0]=S;
while(h<t){
int x=q[h++];
dep[x]=dep[fa[x]]+1,sz[x]=1;
Es(x,i)if(i->v!=fa[x]){
fa[q[t++]=i->v]=x;
}
}
per(o,0,t-1){
int x=q[o];
Es(x,i)if(i->v!=fa[x]){
sz[x]+=sz[i->v];
if(sz[i->v]>sz[son[x]])son[x]=i->v;
}
}
For(o,0,t){
int x=q[o];
Top[x]=(son[fa[x]]==x)?Top[fa[x]]:x;
}
}
inline void dfs2(int S){
For(o,0,n){
int x=q[o];
L[x]=tot; if(!bel[x])bel[x]=bel[fa[x]];
else if(x!=rt){
it->in(a[x]);
int t=fa[x],y=bel[t],lst=-1;
while(bel[t]==y){
it->in(a[t]);
lst=t,t=fa[t];
}
++tot,++it;
while(t>0){
*it=b[L[lst]]|*(it-1);
++it,++tot;
if((lst=bel[t])==-1)break;
else t=fa[lst];
}
//R[x]=tot;
} } }
inline void Init(){
rt=rand()%n+1;
dfs(rt);
rep(i,1,n){
if(dep[i]%200==0)bel[i]=i;
}
bel[rt]=-1;
dfs2(rt);
}
bs A;
inline int lca(int x,int y){
while(Top[x]!=Top[y]){
if(dep[Top[x]]<dep[Top[y]])swap(x,y);
x=fa[Top[x]];
}
return dep[x]<dep[y]?x:y;
}
inline void query(int x,int y){
//int t=clock();
int l=lca(x,y);
{
//dbg(x),dbg(rt),dbg(l);
while(bel[x]!=x&&x!=l)A.in(a[x]),x=fa[x];//dbg(x);
if(bel[x]==x){
int e=L[x],f=x,g=bel[fa[x]];
while(g>0&&dep[g]>=dep[l])++e,f=g,g=bel[fa[g]];
if(e>L[x])A|=b[e-1];//cout<<"fff\n";;
while(f!=l)A.in(a[f]),f=fa[f];
}
}
//cerr<<"OK1"<<endl;
swap(x,y);
{
while(bel[x]!=x&&x!=l)A.in(a[x]),x=fa[x];
if(bel[x]==x){
int e=L[x],f=x,g=bel[fa[x]];
while(g>0&&dep[g]>=dep[l])++e,f=g,g=bel[fa[g]];
if(e>L[x])A|=b[e-1];//cout<<"fff\n";;
while(f!=l)A.in(a[f]),f=fa[f];
}
}
A.in(a[l]);
}
int main(){
#ifdef flukehn
freopen("test.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
srand((unsigned long long)(new char));
pcal();
n=rd();int q=rd(),f=rd(),lst=0;
rep(i,1,n)a[i]=rd();
For(i,1,n){
int x=rd(),y=rd();
ins(x,y),ins(y,x);
}
Init();
// dbg(clock());
// if(n>=90000)return 0;
while(q--){
//cerr<<q<<endl;
//int t=clock();
A.Ci();
int a=rd();
while(a--){int x=rd()^(f?lst:0),y=rd()^(f?lst:0);query(x,y);}
//cerr<<q<<endl;
pii tmp=A.query();
lst=tmp.fi+tmp.se;
printf("%d %d\n",tmp.fi,tmp.se);
//dbg(clock()-t);
//cerr<<q<<endl;
} // cerr<<clock()<<endl;
}

BZOJ 4763的更多相关文章

  1. [BZOJ 4763]雪辉

    [BZOJ 4763] 雪辉 题意 给定一棵 \(n\) 个点的无根树, 点带权. \(q\) 次询问, 每次给定树上的若干路径, 求这些路径上的点共有多少种不同权值以及这些点的权值组成的集合的 \( ...

  2. 洛谷P3603 || bzoj 4763 雪辉 && bzoj4812: [Ynoi2017]由乃打扑克

    https://www.luogu.org/problemnew/show/P3603 https://www.lydsy.com/JudgeOnline/problem.php?id=4763 就是 ...

  3. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. pillow的用法

    这是原图 from PIL import Image im=Image.open('C:/Users/history/Desktop/微信图片_20190408110611.jpg') r,g,b=i ...

  2. Java Properties 类读配置文件保持顺序

    前几天,公司项目中有一个需求是读取配置文件的,而且最好能够保证加载到内存中的顺序能够和配置文件中的顺序一致,但是,如果使用 jdk 中提供的 Properties 类的话,读取配置文件后,加载到内存中 ...

  3. SEO总结

    学习了这么久了seo,对学过的知识进行一下总结. 服务器和域名 首先的一个就是对服务器和域名的选择,服务器最好能是独立的,因为如果不是独立服务器很容易被别人放在服务器上的网站所影响,然后就是域名,需要 ...

  4. 第四节:IO、序列化和反序列化、加密解密技术

    一. IO读写 这里主要包括文件的读.写.移动.复制.删除.文件夹的创建.文件夹的删除等常规操作. 注意:这里需要特别注意,对于普通的控制台程序和Web程序,将"相对路径"转换成& ...

  5. vue 开发微信小程序

    介绍 mpvue (github 地址请参见)是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了 Vue.js的 runtime 和 compiler 实 ...

  6. [物理学与PDEs]第1章习题9 磁偶极矩的极限矢势

    设在发现为 ${\bf n}$ 的平面上, 有一电流强度为 $I$ 的环形电流, 其方向与 ${\bf n}$ 成右手系. 又设该环形电流所围的面积为 $S_0$, 则 $$\bex {\bf m}= ...

  7. .Net IOC框架入门之三 Autofac

    一.简介   Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个 目的 1.依赖注入的目的是为了解耦. 2.不依赖于具体类,而依赖抽象类或者接口,这叫依赖倒置. 3.控制反转即 ...

  8. 再说C模块的编写(2)

    [前言] 在<再说C模块的编写(1)>中主要总结了Lua调用C函数时,对数组和字符串的操作,而这篇文章将重点总结如何在C函数中保存状态. 什么叫做在C函数中保存状态?比如你现在使用Lua调 ...

  9. 1.arm的linux系统搭建

    从裸板到系统 一般是CPU内部有启动代码,如nuvoton的nuc900系列的芯片内部就有ibr程序,来控制启动过程,在usb启动时负责加载usb驱动,这样在pc端就可以识别到usb设备了,然后通过t ...

  10. 【Java】JDK/JVM相关工具

    1.JDK自带工具 1)常见的用法参见:https://cloud.tencent.com/developer/article/1379487 2)HSDB,即Hotspot debugger,位置在 ...