有毒

第一开始一直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. 通过nginx访问linux目录

    http { ...... autoindex on; autoindex_exact_size off; autoindex_localtime on; server { listen 80; .. ...

  2. python格式化输出的几种方式

    第一种  字符串拼接  就不写了 下面的是 第二 第三 第四种 name = input("name:") age = int(input("age:")) p ...

  3. Django的admin视图的使用

    要现在admin.py文件中将你要视图化操作的类进行注册: from django.contrib import admin from api import models # Register you ...

  4. BOM:浏览器对象模型之浏览器剖析入门

    BOM简介 BOM与DOM的关系 BOM对象包含的内容 重新认识浏览器 一.分裂的BOM和被收服的DOM BOM定义:是browser object model的缩写,简称浏览器对象模型. 主要处理浏 ...

  5. C# this扩展方法

    本文导读:扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀. 扩展方法当然不能破坏面向对象封装的概念,所以 ...

  6. Java反射定义、获取Class三种方法

    反射机制的定义: 在运行状态时(动态的),对于任意一个类,都能够得到这个类的所有属性和方法.  对于任意一个对象,都能够调用它的任意属性和方法. Class类是反射机制的起源,我们得到Class类对象 ...

  7. CF1139E Maximize Mex

    题目地址:CF1139E Maximize Mex 这其实是一个二分图匹配匈牙利算法的巧妙运用 考虑倒序回答 则由原来的删除改为添加 把 potential 值作为左部,则一共有编号为 \(0~m\) ...

  8. 【转】mac环境下Android 反编译

    一.需要的工具 apktool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件. dex2jar:将反编译后的classes.dex文件转化为.jar文件. jd ...

  9. 使用 ThreeSixty 创建可拖动的 360 度全景图片预览效果

    ThreeSixty 是生成可拖动的360度预览图像序列的 jQuery 插件.只需要在你的 HTML 页面包引入最新的 jQuery 和 threesixty.js 文件就可以使用了,支持键盘上的箭 ...

  10. 1、在Centos上安装Grafana

    1.如果你想将老版本的Grafana升级为新版本的Grafana,可以阅读链接中的文档指南: http://docs.grafana.org/installation/upgrading/ 2.使用y ...