spoj COT && COT2
来源:互联网 发布:php 处理图片 编辑:程序博客网 时间:2024/05/16 12:34
COT
树上主席树….
#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<cstdlib>#include<cstdio>#include<cmath>#include<ctime>#define s(i) T[i].s#define N 100005using namespace std;int n,m,siz,tot,x,y,z,k;int root[N],d[N],g[N][19],a[N],b[N],id[N],num[N];int first[N],next[N*2],to[N*2];struct node{int lc,rc,s;}T[N*40];void inser(int x,int y){ next[++siz]=first[x]; first[x]=siz; to[siz]=y;}int lca(int x,int y){ if (d[x]<d[y]) swap(x,y); for (int i=17;~i;i--) if (d[g[x][i]]>=d[y]) x=g[x][i]; if (x==y) return x; for (int i=17;~i;i--) if (g[x][i]^g[y][i]) x=g[x][i],y=g[y][i]; return g[x][0];}void add(int v,int l,int r,int x){ T[v].s++; if (l==r) return; int mid=l+r>>1; if (x<=mid) { T[++tot]=T[T[v].lc]; add(T[v].lc=tot,l,mid,x); } else { T[++tot]=T[T[v].rc]; add(T[v].rc=tot,mid+1,r,x); }}void dfs(int x){ T[root[x]=++tot]=T[root[g[x][0]]]; add(root[x],1,n,b[x]); for (int i=first[x];i;i=next[i]) if ((y=to[i])^g[x][0]) { g[y][0]=x,d[y]=d[x]+1; for (int k=0;g[y][k];k++) g[y][k+1]=g[g[y][k]][k]; dfs(y); }}int query(int vv1,int vv2,int v1,int v2,int l,int r,int k){ if (l==r) return l; int mid=l+r>>1,x=s(T[v1].lc)+s(T[v2].lc)-s(T[vv1].lc)-s(T[vv2].lc); if (x>=k) return query(T[vv1].lc,T[vv2].lc,T[v1].lc,T[v2].lc,l,mid,k); return query(T[vv1].rc,T[vv2].rc,T[v1].rc,T[v2].rc,mid+1,r,k-x);}bool cmp(const int &x,const int &y){ return a[x]<a[y];}void lsh(){ for (int i=1;i<=n;i++) id[i]=i; sort(id+1,id+n+1,cmp); b[id[1]]=1;num[1]=a[id[1]]; for (int i=2;i<=n;i++) if (a[id[i]]^a[id[i-1]]) num[b[id[i]]=b[id[i-1]]+1]=a[id[i]]; else b[id[i]]=b[id[i-1]];}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]); lsh(); for (int i=1;i<n;i++) { scanf("%d%d",&x,&y); inser(x,y),inser(y,x); } dfs(d[1]=1); while (m--) { scanf("%d%d%d",&x,&y,&k);z=lca(x,y); printf("%d\n",num[query(root[g[z][0]],root[z],root[x],root[y],1,n,k)]); } return 0;}
COT2
树上莫队,不带修改QAQ
//我sb数组又没有开够TAT
#include<iostream>#include<algorithm>#include<cstdlib>#include<cstdio>#include<ctime>#include<cmath>#include<cstring>#include<string>#include<map>#define N 80005#define LL long longusing namespace std;int n,m,siz,tot,cnt,top,S,Ans,x,y;int first[N],next[N],to[N];int g[N][17],d[N],size[N],a[N],vis[N],s[N],id[N],st[N],h[N],num[N],ans[100005];struct ques{int x,y,id;}q[100005];map <int,int> mp;void inser(int x,int y){ next[++siz]=first[x]; first[x]=siz; to[siz]=y;}int lca(int x,int y){ if (d[x]<d[y]) swap(x,y); for (int i=15;~i;i--) if (d[g[x][i]]>=d[y]) x=g[x][i]; if (x==y) return x; for (int i=15;~i;i--) if (g[x][i]^g[y][i]) x=g[x][i],y=g[y][i]; return g[x][0];}void update(int x){ if (vis[x]&&!(--s[a[x]])) Ans--; if (!vis[x]&&!(s[a[x]]++)) Ans++; vis[x]^=1; }void modify(int x,int y){ int z=lca(x,y); for (;x^z;x=g[x][0]) update(x); for (;y^z;y=g[y][0]) update(y);}void dfs(int x){ st[++top]=x; num[x]=++cnt; for (int y,i=first[x];i;i=next[i]) { if ((y=to[i])==g[x][0]) continue; g[y][0]=x,d[y]=d[x]+1; for (int k=0;g[y][k];k++) g[y][k+1]=g[g[y][k]][k]; dfs(y); if (size[x]+size[y]>=S) { size[x]=0,tot++; while (st[top]^x) id[st[top--]]=tot; } else size[x]+=size[y]; } size[x]++;}void DFS(int x,int c){ id[x]?c=id[x]:id[x]=c; for (int i=first[x];i;i=next[i]) if (to[i]^g[x][0]) DFS(to[i],c);}bool cmp(const ques &a,const ques &b){ return id[a.x]<id[b.x]||id[a.x]==id[b.x]&&num[a.y]<num[b.y];}void lsh(){ for (int i=1;i<=n;i++) h[i]=a[i]; sort(h+1,h+n+1); mp[h[1]]=tot=1; for (int i=2;i<=n;i++) if (h[i]^h[i-1]) mp[h[i]]=++tot; for (int i=1;i<=n;i++) a[i]=mp[a[i]]; tot=0;}int main(){ scanf("%d%d",&n,&m);S=sqrt(n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); lsh(); for (int i=1;i<n;i++) { scanf("%d%d",&x,&y); inser(x,y),inser(y,x); } dfs(d[1]=1),DFS(1,0),x=y=1; for (int i=1;i<=m;i++) { scanf("%d%d",&q[i].x,&q[i].y),q[i].id=i; if (id[q[i].x]>id[q[i].y]) swap(q[i].x,q[i].y); } sort(q+1,q+m+1,cmp); for (int i=1;i<=m;i++) { modify(q[i].x,x),x=q[i].x; modify(q[i].y,y),y=q[i].y; int z=lca(x,y); update(z); ans[q[i].id]=Ans; update(z); } for (int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0;}
0 0
- spoj COT && COT2
- SPOJ COT2
- COT (spoj)
- spoj COT
- [spoj COT
- [BZOJ2588][Spoj 10628]COT
- 文章标题 SPOJ-COT
- spoj cot2 树上莫队
- SPOJ COT2(树上莫队)
- SPOJ COT (主席树 LCA)
- 【SPOJ】Count on a Tree Ⅱ (COT2)
- SPOJ COT2 Count on a tree II
- COT2
- spoj cot Count on a tree
- SPOJ COT 10628 Count on a tree
- SPOJ-COT-Count on a tree
- SPOJ COT Count on a tree
- SPOJ COT2 树上的莫队算法,树上区间查询
- Oracle 创建数据库及导入数据
- 大型网站架构系列:缓存在分布式系统中的应用(二)
- Hibernate hql查询
- 适配器模式
- 自己编写的 matlab 线性索引转换下标 函数
- spoj COT && COT2
- 转发 源框架GPUImag
- 餐巾计划问题(最小费用流)
- Spring 中的 Bean 配置
- python爬虫设计刷博客访问量(刷访问量,赞,爬取图片)
- 前端问题更新汇总
- 文件提取小工具
- Java的构造器和隐式参数和显式参数
- Android Studio教程(三)之AS的设置