【HNOI2016模拟4.13】a
2016-04-20 19:40
288 查看
Description
给出一棵n个节点的树,每个节点ai的范围在1~m,和q次询问,每次询问x到y的路径中小于/等于/大于k的数的个数。强制在线。n,q<=300000,m<=150000
Solution
裸题,用来练模板。有两种做法,一种是主席树用lca直接搞。
一种是链剖开m棵线段树暴力搞。
这里打的是第一种。
Code
#include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define rep(i,a) for(int i=last[a];i;i=next[i]) #define N 270000 using namespace std; struct note{int sum,l,r;}tr[N*30]; int n,m,q,l,tot,root ,a ,d ,f [20],ansl,ans,ansr,x,y,z; int t[N*2],next[N*2],last ; void add(int x,int y) { t[++l]=y;next[l]=last[x];last[x]=l; } void insert(int &v,int l,int r,int x) { tr[++tot]=tr[v];tr[tot].sum++;v=tot; if (l==r) return; int m=(l+r)/2; if (x<=m) insert(tr[v].l,l,m,x); else insert(tr[v].r,m+1,r,x); } void dfs(int x,int y) { root[x]=root[y];f[x][0]=y;d[x]=d[y]+1; insert(root[x],1,m,a[x]); rep(i,x) if (t[i]!=y) dfs(t[i],x); } int lca(int x,int y) { if (d[x]<d[y]) swap(x,y); fd(j,19,0) if (d[f[x][j]]>d[y]) x=f[x][j]; if (d[x]!=d[y]) x=f[x][0]; fd(j,19,0) if (f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j]; if (x!=y) return f[x][0];else return x; } int find(int v,int l,int r,int x,int y) { if (!v) return 0; if (l==x&&r==y) return tr[v].sum; int m=(l+r)/2; if (y<=m) return find(tr[v].l,l,m,x,y); else if (x>m) return find(tr[v].r,m+1,r,x,y); else return find(tr[v].l,l,m,x,m)+find(tr[v].r,m+1,r,m+1,y); } int query(int x,int y,int l,int r) { if (l>r) return 0; int z=lca(x,y); return find(root[x],1,m,l,r)+find(root[y],1,m,l,r)- find(root[z],1,m,l,r)-find(root[f[z][0]],1,m,l,r); } int main() { scanf("%d%d%d",&n,&m,&q); fo(i,1,n) scanf("%d",&a[i]); fo(i,1,n-1) scanf("%d%d",&x,&y),add(x,y),add(y,x); dfs(1,0); fo(j,1,19) fo(i,1,n) f[i][j]=f[f[i][j-1]][j-1]; for(;q;q--) { scanf("%d%d%d",&x,&y,&z);int lastans=ansl^ans^ansr; x^=lastans;y^=lastans;z^=lastans; ansl=query(x,y,1,z-1);ans=query(x,y,z,z);ansr=query(x,y,z+1,m); printf("%d %d %d\n",ansl,ans,ansr); } }
相关文章推荐
- 26. Remove Duplicates from Sorted Array
- Java:如何正确使用Timer
- BZOJ 2751 容易题(easy) 快速幂+快速乘
- Percona Xtrabackup备份mysql (完整备份与增量备份)
- 在没有activity引用的子线程中Toast的方法(观察者模式)
- WOJ 1619
- Linux/Unix环境下的make和makefile
- hibernate总结
- POJ 2663 Tri Tiling
- java毕向东听课笔记19(字符串3)
- 完整版getByClass2016/4/20
- 【Unity】6.4 Transform--移动、旋转和缩放游戏对象
- CentOS minimal安装后出现的各种模块丢失问题汇总
- 就从这里开始吧
- Android Studio在运行的时候提示找不到符号的问题
- notifyDataSetChanged方法
- div居中显示
- IOS学习之——Cell自定义内容视图&自定义辅助视图
- Python——Day3知识点——文件操作
- 【波兰黑科技(持续更新)16.5.6UPD】Small-Space Multiple-Pattern Matching