这可能是全场最长的一份代码

问的其实是对于关键点的斯坦纳树大小

考虑补集转化,不合法的点就是它的子树中没有关键点的点和斯坦纳树根的祖先

树根不难求,关键点中dfs序最大最小点的LCA就是了

问题在前者

假如我们把子树中的点拿出来排序,这个点不合法的条件就是存在ax,ax+1满足ax<=l-1且r+1<=ax+1,有个很妙的性质就是这个合法的x只有1个

考虑启发式合并把这个顺序搞出来,可以证明点数是nlogn级别的,因为每次合并均摊加入logn个点,合并n次。数列相邻的两项成为一个点,插入要用到一棵splay来维护一下。。。

把这些点放到二维平面二维数点即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int _=1e2;
const int maxn=1e5+_;
const int maxQ=5e5+_;
const int mbit=;
const int fbin=(<<)+_;
int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();
return x*f;
}
void write(int x)
{
if(x>=)write(x/);
putchar(x%+'');
}
int n,Q;
struct node
{
int x,y,next;
}a[*maxn];int len,last[maxn],d[maxn];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} //--------------------------------------------def------------------------------------------------------- namespace TREE
{
namespace Segtree
{
struct segtree{int mx,mn;segtree(){mn=(<<);}}tr[*fbin];
void update(int now)
{
int lc=(now<<),rc=(now<<|);
tr[now].mx=max(tr[lc].mx,tr[rc].mx);
tr[now].mn=min(tr[lc].mn,tr[rc].mn);
}
void pushdown(int now)
{
int lc=(now<<),rc=(now<<|);
tr[lc].mx=max(tr[now].mx,tr[lc].mx);
tr[rc].mn=min(tr[now].mn,tr[rc].mn);
}
void change(int now,int ql,int qr,int p,int k)
{
if(ql==qr)
{
tr[now].mx=max(tr[now].mx,k);
tr[now].mn=min(tr[now].mn,k);
return ;
}
int lc=(now<<),rc=(now<<|),mid=(ql+qr)/;
pushdown(now);
if(p<=mid)change(lc,ql,mid,p,k);
else change(rc,mid+,qr,p,k);
update(now);
}
int getmax(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r)return tr[now].mx;
int lc=(now<<),rc=(now<<|),mid=(ql+qr)/;
pushdown(now);
if(r<=mid) return getmax(lc,ql,mid,l,r);
else if(mid+<=l)return getmax(rc,mid+,qr,l,r);
else return max(getmax(lc,ql,mid,l,mid),getmax(rc,mid+,qr,mid+,r));
}
int getmin(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r)return tr[now].mn;
int lc=(now<<),rc=(now<<|),mid=(ql+qr)/;
pushdown(now);
if(r<=mid) return getmin(lc,ql,mid,l,r);
else if(mid+<=l)return getmin(rc,mid+,qr,l,r);
else return min(getmin(lc,ql,mid,l,mid),getmin(rc,mid+,qr,mid+,r));
}
}
//~~~~~~~~~~~~~~getnum~~~~~~~~~~~~~~~~~ int z,pos[maxn];
int dep[maxn],fa[mbit][maxn];
void dfs(int x,int fr)
{
pos[++z]=x;
Segtree::change(,,n,d[x],z);
for(int i=;(<<i)<=dep[x];i++)fa[i][x]=fa[i-][fa[i-][x]];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fa[][x])
{
fa[][y]=x;
dep[y]=dep[x]+;
dfs(y,x);
}
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=(<<i))x=fa[i][x];
if(x==y)return x;
for(int i=;i>=;i--)
if(dep[x]>=(<<i)&&fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int getnum(int l,int r)
{
return dep[LCA(pos[Segtree::getmax(,,n,l,r)],pos[Segtree::getmin(,,n,l,r)])];
}
//~~~~~~~~~~~~~~~make~~~~~~~~~~~~~~~~~ int ls[maxn],id[maxn];
bool cmp(int x,int y){return d[x]<d[y];}
int getl(int l){return lower_bound(ls+,ls+n+,l)-ls;}
int getr(int r){return upper_bound(ls+,ls+n+,r)-ls-;}
void LSH()
{
for(int i=;i<=n;i++)ls[i]=d[i],id[i]=i;
sort(ls+,ls+n+);
sort(id+,id+n+,cmp);
for(int i=;i<=n;i++)d[id[i]]=i;
}
//~~~~~~~~~~~~~~~~LSH~~~~~~~~~~~~~~~~ void main(){LSH();dfs(,);}
} //-------------------------------------------------------------------------------------------- namespace COUNT
{
namespace Chair
{
struct chairmantree
{
int lc,rc,c;
}tr[*maxn];int trlen,rt[maxn];
int insert(int x,int ql,int qr,int p,int c)
{
if(x==)x=++trlen;
tr[x].c+=c;
if(ql==qr)return x;
int mid=(ql+qr)/;
if(p<=mid)tr[x].lc=insert(tr[x].lc,ql,mid,p,c);
else tr[x].rc=insert(tr[x].rc,mid+,qr,p,c);
return x;
}
int merge(int x,int y)
{
if(x==||y==)return x+y;
tr[x].c+=tr[y].c;
tr[x].lc=merge(tr[x].lc,tr[y].lc);
tr[x].rc=merge(tr[x].rc,tr[y].rc);
return x;
}
int getsum(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r){return tr[now].c;}
int lc=tr[now].lc,rc=tr[now].rc,mid=(ql+qr)/;
if(r<=mid) return getsum(lc,ql,mid,l,r);
else if(mid+<=l)return getsum(rc,mid+,qr,l,r);
else return getsum(lc,ql,mid,l,mid)+getsum(rc,mid+,qr,mid+,r);
} void newid(int &x,int &y){x++,y=n+-y+;}
void paint(int x,int y,int c)
{
newid(x,y);
rt[x]=insert(rt[x],,n+,y,c);
}
int getnum(int x,int y)
{
newid(x,y);
return getsum(rt[x],,n+,,y);
}
void pre()
{
for(int i=;i<=n+;i++)
rt[i]=merge(rt[i],rt[i-]);
}
}
namespace Splay
{
struct splay
{
int f,son[];
int q,x,c,lazy;
}tr[*maxn];int trlen,rt[maxn],tot[maxn],id[**maxn],idtp;
void init(){for(int i=;i<*maxn;i++)id[i]=i;idtp=*maxn;}
void tap(int w){tr[rt[w]].c++,tr[rt[w]].lazy++;}
void rotate(int x,int w)
{
int f=tr[x].f,ff=tr[f].f;
int R,r; R=f,r=tr[x].son[w];
tr[R].son[-w]=r;
if(r!=)tr[r].f=R; R=ff,r=x;
if(tr[ff].son[]==f)tr[R].son[]=r;
else tr[R].son[]=r;
tr[r].f=R; R=x,r=f;
tr[R].son[w]=r;
tr[r].f=R;
}
void pushdown(int now)
{
int lc=tr[now].son[],rc=tr[now].son[];
tr[lc].c+=tr[now].lazy,tr[lc].lazy+=tr[now].lazy;
tr[rc].c+=tr[now].lazy,tr[rc].lazy+=tr[now].lazy;
tr[now].lazy=;
}
int tt,tmp[maxn];
void splay(int x,int F,int w)
{
int i=x; tt=;
while(i!=F)
tmp[++tt]=i,i=tr[i].f;
while(tt>)
{
if(tr[tmp[tt]].lazy!=)pushdown(tmp[tt]);
tt--;
} while(tr[x].f!=F)
{
int f=tr[x].f,ff=tr[f].f;
if(ff==F)
{
if(tr[f].son[]==x)rotate(x,);
else rotate(x,);
}
else
{
if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(f,),rotate(x,);
else if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(f,),rotate(x,);
else if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(x,),rotate(x,);
else if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(x,),rotate(x,);
}
}
if(F==)rt[w]=x;
}
//~~~~~~~~~~~~~~~~~~~~in~~~~~~~~~~~~~~~~~~~~~~ int findip(int w,int d)
{
int x=rt[w];
while()
{
pushdown(x);
int lc=tr[x].son[],rc=tr[x].son[];
if(d<tr[x].x)
{
if(lc==)return x;
x=lc;
}
else
{
if(rc==)return x;
x=rc;
}
}
}
int findqq(int x,int w)
{
splay(x,,w);
x=tr[x].son[];
while(tr[x].son[]!=)x=tr[x].son[];
return x;
}
int findhj(int x,int w)
{
splay(x,,w);
x=tr[x].son[];
while(tr[x].son[]!=)x=tr[x].son[];
return x;
}
//~~~~~~~~~~~~~~~~~~~find~~~~~~~~~~~~~~~~~~~~~~ void add(int x)
{
trlen++; if(trlen==**maxn)trlen=;
tr[id[trlen]].x=x;
tr[id[trlen]].c=,tr[id[trlen]].lazy=;
}
void insert(int w,int d)
{
tot[w]++;add(d);
if(rt[w]==)rt[w]=id[trlen];
else if(tot[w]==)
{
tr[rt[w]].son[]=id[trlen];
tr[id[trlen]].f=rt[w];
tr[id[trlen]].q=;
}
else
{
int p=findip(w,d);
if(d<tr[p].x)tr[p].son[]=id[trlen];
else tr[p].son[]=id[trlen];
tr[id[trlen]].f=p; tr[id[trlen]].q=tr[findqq(id[trlen],w)].x;
int h=findhj(id[trlen],w);splay(h,,w);
if(tr[h].c!=)Chair::paint(tr[h].q,tr[h].x,tr[h].c),tr[h].c=;
tr[h].q=tr[id[trlen]].x;
}
}
//~~~~~~~~~~~~~~~~~base~~~~~~~~~~~~~~~~~~~~~~~~ void dfs(int w,int x)
{
if(tr[x].c!=&&tr[x].x!=)Chair::paint(tr[x].q,tr[x].x,tr[x].c);
if(tr[x].x!=&&tr[x].x!=n+)
{
insert(w,tr[x].x);
id[idtp++]=x;
if(idtp==**maxn)idtp=;
}
pushdown(x);
if(tr[x].son[]!=)dfs(w,tr[x].son[]);
if(tr[x].son[]!=)dfs(w,tr[x].son[]);
}
void merge(int x,int y)
{
if(tot[x]<tot[y])swap(rt[x],rt[y]),swap(tot[x],tot[y]);
dfs(x,rt[y]);
}
void dfs2(int x)
{
if(tr[x].c!=&&tr[x].x!=)Chair::paint(tr[x].q,tr[x].x,tr[x].c);
pushdown(x);
if(tr[x].son[]!=)dfs2(tr[x].son[]);
if(tr[x].son[]!=)dfs2(tr[x].son[]);
}
void divi(){dfs2(rt[]);}
} void dfs(int x,int fr)
{
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)dfs(a[k].y,x);
Splay::insert(x,);
Splay::insert(x,n+);
Splay::insert(x,d[x]);
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)Splay::merge(x,a[k].y);
Splay::tap(x);
}
void main()
{
Splay::init();dfs(,);
Splay::divi();
Chair::pre();
}
} //-------------------------------------------------------------------------------------------- namespace QUERY
{
void main()
{
int l,r;
while(Q--)
{
l=read(),r=read();
l=TREE::getl(l);
r=TREE::getr(r);
if(l>r)puts("");
else write(n- (TREE::getnum(l,r)) - (COUNT::Chair::getnum(l-,r+)) ),putchar('\n');
}
}
} //-------------------------------------------------------------------------------------------- int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int x,y;
n=read(),Q=read();
for(int i=;i<=n;i++)d[i]=read();
for(int i=;i<n;i++)
{
x=read(),y=read();
ins(x,y),ins(y,x);
}
TREE::main();
COUNT::main();
QUERY::main(); return ;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int _=1e2;
const int maxn=1e5+_;
const int maxQ=5e5+_;
const int mbit=;
const int fbin=(<<)+_;
int read()
{
int x=,f=; char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();
return x*f;
}
void write(int x)
{
if(x>=)write(x/);
putchar(x%+'');
}
int n,Q;
struct node
{
int x,y,next;
}a[*maxn];int len,last[maxn],d[maxn];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} //--------------------------------------------def------------------------------------------------------- namespace TREE
{
namespace Segtree
{
struct segtree{int mx,mn;segtree(){mn=(<<);}}tr[*fbin];
void update(int now)
{
int lc=(now<<),rc=(now<<|);
tr[now].mx=max(tr[lc].mx,tr[rc].mx);
tr[now].mn=min(tr[lc].mn,tr[rc].mn);
}
void pushdown(int now)
{
int lc=(now<<),rc=(now<<|);
tr[lc].mx=max(tr[now].mx,tr[lc].mx);
tr[rc].mn=min(tr[now].mn,tr[rc].mn);
}
void change(int now,int ql,int qr,int p,int k)
{
if(ql==qr)
{
tr[now].mx=max(tr[now].mx,k);
tr[now].mn=min(tr[now].mn,k);
return ;
}
int lc=(now<<),rc=(now<<|),mid=(ql+qr)/;
pushdown(now);
if(p<=mid)change(lc,ql,mid,p,k);
else change(rc,mid+,qr,p,k);
update(now);
}
int getmax(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r)return tr[now].mx;
int lc=(now<<),rc=(now<<|),mid=(ql+qr)/;
pushdown(now);
if(r<=mid) return getmax(lc,ql,mid,l,r);
else if(mid+<=l)return getmax(rc,mid+,qr,l,r);
else return max(getmax(lc,ql,mid,l,mid),getmax(rc,mid+,qr,mid+,r));
}
int getmin(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r)return tr[now].mn;
int lc=(now<<),rc=(now<<|),mid=(ql+qr)/;
pushdown(now);
if(r<=mid) return getmin(lc,ql,mid,l,r);
else if(mid+<=l)return getmin(rc,mid+,qr,l,r);
else return min(getmin(lc,ql,mid,l,mid),getmin(rc,mid+,qr,mid+,r));
}
}
//~~~~~~~~~~~~~~getnum~~~~~~~~~~~~~~~~~ int z,pos[maxn];
int dep[maxn],fa[mbit][maxn];
void dfs(int x,int fr)
{
pos[++z]=x;
Segtree::change(,,n,d[x],z);
for(int i=;(<<i)<=dep[x];i++)fa[i][x]=fa[i-][fa[i-][x]];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fa[][x])
{
fa[][y]=x;
dep[y]=dep[x]+;
dfs(y,x);
}
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;i--)
if(dep[x]-dep[y]>=(<<i))x=fa[i][x];
if(x==y)return x;
for(int i=;i>=;i--)
if(dep[x]>=(<<i)&&fa[i][x]!=fa[i][y])x=fa[i][x],y=fa[i][y];
return fa[][x];
}
int getnum(int l,int r)
{
return dep[LCA(pos[Segtree::getmax(,,n,l,r)],pos[Segtree::getmin(,,n,l,r)])];
}
//~~~~~~~~~~~~~~~make~~~~~~~~~~~~~~~~~ int ls[maxn],id[maxn];
bool cmp(int x,int y){return d[x]<d[y];}
int getl(int l){return lower_bound(ls+,ls+n+,l)-ls;}
int getr(int r){return upper_bound(ls+,ls+n+,r)-ls-;}
void LSH()
{
for(int i=;i<=n;i++)ls[i]=d[i],id[i]=i;
sort(ls+,ls+n+);
sort(id+,id+n+,cmp);
for(int i=;i<=n;i++)d[id[i]]=i;
}
//~~~~~~~~~~~~~~~~LSH~~~~~~~~~~~~~~~~ void main(){LSH();dfs(,);}
} //-------------------------------------------------------------------------------------------- namespace COUNT
{
namespace Chair
{
struct chairmantree
{
int lc,rc,c;
}tr[*maxn];int trlen,rt[maxn];
int insert(int x,int ql,int qr,int p,int c)
{
if(x==)x=++trlen;
tr[x].c+=c;
if(ql==qr)return x;
int mid=(ql+qr)/;
if(p<=mid)tr[x].lc=insert(tr[x].lc,ql,mid,p,c);
else tr[x].rc=insert(tr[x].rc,mid+,qr,p,c);
return x;
}
int merge(int x,int y)
{
if(x==||y==)return x+y;
tr[x].c+=tr[y].c;
tr[x].lc=merge(tr[x].lc,tr[y].lc);
tr[x].rc=merge(tr[x].rc,tr[y].rc);
return x;
}
int getsum(int now,int ql,int qr,int l,int r)
{
if(ql==l&&qr==r){return tr[now].c;}
int lc=tr[now].lc,rc=tr[now].rc,mid=(ql+qr)/;
if(r<=mid) return getsum(lc,ql,mid,l,r);
else if(mid+<=l)return getsum(rc,mid+,qr,l,r);
else return getsum(lc,ql,mid,l,mid)+getsum(rc,mid+,qr,mid+,r);
} void newid(int &x,int &y){x++,y=n+-y+;}
void paint(int x,int y,int c)
{
newid(x,y);
rt[x]=insert(rt[x],,n+,y,c);
}
int getnum(int x,int y)
{
newid(x,y);
return getsum(rt[x],,n+,,y);
}
void pre()
{
for(int i=;i<=n+;i++)
rt[i]=merge(rt[i],rt[i-]);
}
}
namespace Splay
{
struct splay
{
int f,son[];
int q,x,c,lazy;
}tr[*maxn];int trlen,rt[maxn],tot[maxn],id[**maxn],idtp;
void init(){for(int i=;i<*maxn;i++)id[i]=i;idtp=*maxn;}
void tap(int w){tr[rt[w]].c++,tr[rt[w]].lazy++;}
void rotate(int x,int w)
{
int f=tr[x].f,ff=tr[f].f;
int R,r; R=f,r=tr[x].son[w];
tr[R].son[-w]=r;
if(r!=)tr[r].f=R; R=ff,r=x;
if(tr[ff].son[]==f)tr[R].son[]=r;
else tr[R].son[]=r;
tr[r].f=R; R=x,r=f;
tr[R].son[w]=r;
tr[r].f=R;
}
void pushdown(int now)
{
int lc=tr[now].son[],rc=tr[now].son[];
tr[lc].c+=tr[now].lazy,tr[lc].lazy+=tr[now].lazy;
tr[rc].c+=tr[now].lazy,tr[rc].lazy+=tr[now].lazy;
tr[now].lazy=;
}
int tt,tmp[maxn];
void splay(int x,int F,int w)
{
int i=x; tt=;
while(i!=F)
tmp[++tt]=i,i=tr[i].f;
while(tt>)
{
if(tr[tmp[tt]].lazy!=)pushdown(tmp[tt]);
tt--;
} while(tr[x].f!=F)
{
int f=tr[x].f,ff=tr[f].f;
if(ff==F)
{
if(tr[f].son[]==x)rotate(x,);
else rotate(x,);
}
else
{
if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(f,),rotate(x,);
else if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(f,),rotate(x,);
else if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(x,),rotate(x,);
else if(tr[ff].son[]==f&&tr[f].son[]==x)rotate(x,),rotate(x,);
}
}
if(F==)rt[w]=x;
}
//~~~~~~~~~~~~~~~~~~~~in~~~~~~~~~~~~~~~~~~~~~~ int findip(int w,int d)
{
int x=rt[w];
while()
{
pushdown(x);
int lc=tr[x].son[],rc=tr[x].son[];
if(d<tr[x].x)
{
if(lc==)return x;
x=lc;
}
else
{
if(rc==)return x;
x=rc;
}
}
}
int findqq(int x,int w)
{
splay(x,,w);
x=tr[x].son[];
while(tr[x].son[]!=)x=tr[x].son[];
return x;
}
int findhj(int x,int w)
{
splay(x,,w);
x=tr[x].son[];
while(tr[x].son[]!=)x=tr[x].son[];
return x;
}
//~~~~~~~~~~~~~~~~~~~find~~~~~~~~~~~~~~~~~~~~~~ void add(int x)
{
trlen++; if(trlen==**maxn)trlen=;
tr[id[trlen]].x=x;
tr[id[trlen]].c=,tr[id[trlen]].lazy=;
}
void insert(int w,int d)
{
tot[w]++;add(d);
if(rt[w]==)rt[w]=id[trlen];
else if(tot[w]==)
{
tr[rt[w]].son[]=id[trlen];
tr[id[trlen]].f=rt[w];
tr[id[trlen]].q=;
}
else
{
int p=findip(w,d);
if(d<tr[p].x)tr[p].son[]=id[trlen];
else tr[p].son[]=id[trlen];
tr[id[trlen]].f=p; tr[id[trlen]].q=tr[findqq(id[trlen],w)].x;
int h=findhj(id[trlen],w);splay(h,,w);
if(tr[h].c!=)Chair::paint(tr[h].q,tr[h].x,tr[h].c),tr[h].c=;
tr[h].q=tr[id[trlen]].x;
}
}
//~~~~~~~~~~~~~~~~~base~~~~~~~~~~~~~~~~~~~~~~~~ void dfs(int w,int x)
{
if(tr[x].c!=&&tr[x].x!=)Chair::paint(tr[x].q,tr[x].x,tr[x].c);
if(tr[x].x!=&&tr[x].x!=n+)
{
insert(w,tr[x].x);
id[idtp++]=x;
if(idtp==**maxn)idtp=;
}
pushdown(x);
if(tr[x].son[]!=)dfs(w,tr[x].son[]);
if(tr[x].son[]!=)dfs(w,tr[x].son[]);
}
void merge(int x,int y)
{
if(tot[x]<tot[y])swap(rt[x],rt[y]),swap(tot[x],tot[y]);
dfs(x,rt[y]);
}
void dfs2(int x)
{
if(tr[x].c!=&&tr[x].x!=)Chair::paint(tr[x].q,tr[x].x,tr[x].c);
pushdown(x);
if(tr[x].son[]!=)dfs2(tr[x].son[]);
if(tr[x].son[]!=)dfs2(tr[x].son[]);
}
void divi(){dfs2(rt[]);}
} void dfs(int x,int fr)
{
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)dfs(a[k].y,x);
Splay::insert(x,);
Splay::insert(x,n+);
Splay::insert(x,d[x]);
for(int k=last[x];k;k=a[k].next)
if(a[k].y!=fr)Splay::merge(x,a[k].y);
Splay::tap(x);
}
void main()
{
Splay::init();dfs(,);
Splay::divi();
Chair::pre();
}
} //-------------------------------------------------------------------------------------------- namespace QUERY
{
void main()
{
int l,r;
while(Q--)
{
l=read(),r=read();
l=TREE::getl(l);
r=TREE::getr(r);
if(l>r)puts("");
else write(n- (TREE::getnum(l,r)) - (COUNT::Chair::getnum(l-,r+)) ),putchar('\n');
}
}
} //-------------------------------------------------------------------------------------------- int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int x,y;
n=read(),Q=read();
for(int i=;i<=n;i++)d[i]=read();
for(int i=;i<n;i++)
{
x=read(),y=read();
ins(x,y),ins(y,x);
}
TREE::main();
COUNT::main();
QUERY::main(); return ;
}

牛客练习赛42 E.热爆了的更多相关文章

  1. 牛客练习赛42 C 出题的诀窍 (贡献,卡常)

    牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...

  2. 牛客练习赛42(A,B)

    A:链接:https://ac.nowcoder.com/acm/contest/393/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 6 ...

  3. 牛客练习赛42 C 出题的诀窍

    题目链接:https://ac.nowcoder.com/acm/contest/393/C 这个题就是对于每个数算贡献,如果有相同的数,只计算先出现的数的贡献 对于数x,若它在前i行的数目分别为a1 ...

  4. 牛客练习赛42 C 反着计算贡献

    https://ac.nowcoder.com/acm/contest/393/C 题意 给你一个矩阵, 每次从每行挑选一个数,组成一个排列,排列的和为不重复数字之和,求所有排列的和(n,m<= ...

  5. 牛客练习赛42 出题的诀窍(数学+hash)

    出题的诀窍 题目链接:https://ac.nowcoder.com/acm/contest/393/C 题解: 由于他是在每一行选取一个元素,然后纵向来比较,这里行的顺序是不会影响的,所以我们将每一 ...

  6. 牛客练习赛42 A 字符串

    题目描述 给定两个等长的由小写字母构成的串 A,BA,B,其中 |A|=|B|=n|A|=|B|=n. 现在你需要求出一个子区间 [l,r][l,r] 使得 LCP(A[l,r],B[l,r])×LC ...

  7. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  8. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  9. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

随机推荐

  1. 【2018.2.8-】网络流学习笔记(含ISAP!)

    网络流的基础内容就不详细发了,网上到处都是,可自学. 总版点这里 ps:以下有些链接是hihocoder的题目(题面有详细讲解),请确保先登录hihocoder,再点击进入相应题目网页. 最大流 基础 ...

  2. 联合权值(codevs 3728)

    Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...

  3. go1.11新特性,mark一下

    包管理新特性: export GO111MODULE=on #开启modules go mod init # 创建go.mod (我是在项目根目录下输入的命令) ls // 可以看下创建成功 cat ...

  4. 洛谷—— P1605 迷宫

    P1605 迷宫 题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在 ...

  5. pandaboard用wifi时打不开网页

    不可以手动修改/etc/resolv.conf,因为重启会被自动清空(raspberry pi 可以) 修改 resolvconf服务的配置文件: /etc/resolvconf/resolv.con ...

  6. TYVJ P1577 泥泞的道路

    题目链接:http://www.tyvj.cn/p/1577# P1577 泥泞的道路 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 公园中有n个景点,编号 ...

  7. python解析网页中js动态添加的内容

    https://www.cnblogs.com/asmblog/archive/2013/05/07/3063809.html https://www.zhihu.com/question/21471 ...

  8. Spring-boot和Spring-Cloud遇到的问题

    1.spring cloud 使用 feign 启动报错  错误信息 org/springframework/cloud/client/loadbalancer/LoadBalancedRetryFa ...

  9. 生活娱乐 360安全卫士和QQ大战

    360安全卫士指控QQ侵犯用户隐私 [提要]9月26日晚上11点16分,安全软件商360在他们的论坛中发布了最新公告:<360安全卫士发布隐私保护器 专门曝光"窥私"软件&g ...

  10. 生活娱乐 Wifi机器人的制作流程

    思路简单,但是创意无限~~ 动手能力超强 牛人教你做Wifi机器人(图) 一.前言 Wifi机器人(Wifi Robot):其实是一辆能通过互联网,或500米以外的笔记本无线设施来远程控制的遥控汽车. ...