BZOJ3757 : 苹果树
树上莫队,有几个坑:
a可能等于b
数据范围是100000
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #define N 100010
- #define K 17
- using namespace std;
- inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
- struct P{int l,r,z,a,b,id;}Q[N];
- int lim,pos[N<<1],l,r,c[N],g[N],v[N<<1],nxt[N<<1],ed,n,m,i,j,x,y,z,loc[N<<1],dfn,st[N],en[N],d[N],f[N][18],ans[N],cnt[N],sum;bool vis[N];char ch;
- inline bool cmp(P a,P b){return pos[a.l]<pos[b.l]||pos[a.l]==pos[b.l]&&a.r<b.r;}
- inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
- void dfs(int x){
- for(int i=vis[loc[st[x]=++dfn]=x]=1;i<=K;i++)f[x][i]=f[f[x][i-1]][i-1];
- for(int i=g[x];i;i=nxt[i])if(!vis[v[i]])d[v[i]]=d[f[v[i]][0]=x]+1,dfs(v[i]);
- loc[en[x]=++dfn]=x;
- }
- inline int lca(int x,int y){
- if(x==y)return x;
- if(d[x]<d[y])swap(x,y);
- for(int i=K;~i;i--)if(d[f[x][i]]>=d[y])x=f[x][i];
- if(x==y)return x;
- for(int i=K;~i;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
- return f[x][0];
- }
- inline void deal(int x){
- if(!vis[x]){if(!(--cnt[c[x]]))sum--;}else if(!(cnt[c[x]]++))sum++;
- vis[x]^=1;
- }
- int main(){
- for(read(n),read(m),i=1;i<=n;i++)read(c[i]);
- for(i=1;i<=n;i++){
- read(x),read(y);
- if(x*y)add(x,y),add(y,x);
- }
- for(dfs(d[1]=1),lim=(int)sqrt(n*2+0.5),i=1;i<=dfn;i++)pos[i]=(i-1)/lim+1;
- for(i=1;i<=m;i++){
- read(x),read(y),read(Q[i].a),read(Q[i].b);Q[i].id=i;
- if(st[x]>st[y])swap(x,y);
- z=lca(x,y);
- if(z==x)Q[i].l=st[x],Q[i].r=st[y];else Q[i].l=en[x],Q[i].r=st[y],Q[i].z=z;
- }
- for(sort(Q+1,Q+m+1,cmp),i=1,l=1,r=0;i<=m;i++){
- if(r<Q[i].r){for(r++;r<=Q[i].r;r++)deal(loc[r]);r--;}
- if(r>Q[i].r)for(;r>Q[i].r;r--)deal(loc[r]);
- if(l<Q[i].l)for(;l<Q[i].l;l++)deal(loc[l]);
- else if(l>Q[i].l){for(l--;l>=Q[i].l;l--)deal(loc[l]);l++;}
- if(Q[i].z)deal(Q[i].z);
- ans[Q[i].id]=sum-(Q[i].a!=Q[i].b&&cnt[Q[i].a]&&cnt[Q[i].b]);
- if(Q[i].z)deal(Q[i].z);
- }
- for(i=1;i<=m;i++)printf("%d\n",ans[i]);
- return 0;
- }
BZOJ3757 : 苹果树的更多相关文章
- [BZOJ3757]苹果树(树上莫队)
树上莫队共有三种写法: 1.按DFS序列分块,和普通莫队类似.常数大,不会被卡. 2.按块状树的方式分块.常数小,会被菊花图卡到O(n). 3.按[BZOJ1086]王室联邦的方式分块.常数小,不会被 ...
- BZOJ3757: 苹果树【树上莫队】
Description 神犇家门口种了一棵苹果树.苹果树作为一棵树,当然是呈树状结构,每根树枝连接两个苹果,每个苹果都可以沿着一条由树枝构成的路径连到树根,而且这样的路径只存在一条.由于这棵苹果树 ...
- 2018.09.16 bzoj3757: 苹果树(树上莫队)
传送门 一道树上莫队. 先用跟bzoj1086一样的方法给树分块. 分完之后就可以莫队了. 但是两个询问之间如何转移呢? 感觉很难受啊. 我们定义S(u,v)" role="pre ...
- 【树上莫队】bzoj3757 苹果树
学习这位神犇的:http://blog.csdn.net/jiangyuze831/article/details/41476865 注意: ①排序时第一关键字是左端点所在块编号(块状树),第二关键字 ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- To Do List
妈呀...发现不发博文公布自己要学的东西压力少太多了.......... 然后就会变得颓废..................... 求大家监督QAQ....To Do List是近3天左右目标,3天 ...
- 树上莫队 wowow
构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块. int dfs(int x){ ; dfn[x]=++ind; ;i<=;i++) if (bin[i]<=deep[x]) f ...
- OI刷题录——hahalidaxin
16-3-25 —— bzoj 2049 [Sdoi2008]Cave 洞穴勘测:LCT入门 bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊:LCT Tsinsen A1303. t ...
- 【BZOJ-3757】苹果树 块状树 + 树上莫队
3757: 苹果树 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1305 Solved: 503[Submit][Status][Discuss] ...
随机推荐
- Unity3d LineRenderer画线
原地址:http://www.cnblogs.com/88999660/archive/2013/01/21/2869498.html 1. 画多条线 画多条线需要在场景中放置多个GameObjec ...
- git pull --rebase
git reset --hard orgin/master $ git push bit 1.8-subchannels To git@bitbucket.org:cms.git ! [rejecte ...
- [codeforces 509]C. Sums of Digits
[codeforces 509]C. Sums of Digits 试题描述 Vasya had a strictly increasing sequence of positive integers ...
- php用soap创建webservice
php提供了一个专门用于soap操作的扩展库,使用该扩展库后 可以直接在php中进行soap操作.下面将介绍soap的基本操作. 一.soap扩展的使用方法 php的soap扩展库通过soap协议实现 ...
- 台大《机器学习基石》课程感受和总结---Part 2 (转)
转自:http://blog.sina.com.cn/s/blog_641289eb0101e2ld.html Part 2总结一下一个粗略的建模过程: 首先,弄清楚问题是什么,能不能用机器学习的思路 ...
- myeclipse2014破解过程
之前装的是10,后来没事试试装了2014,然后再破解2014后发现2010的证书就失效了,之前在网上也没找到方法,这段时间也没管,今天又自己想办法试了试,发现成功了!下边是我在网上找的破解方法的破解步 ...
- ZJOI Day 2 游记
---恢复内容开始--- 去ZJOI Day 2打了一会酱油...各种神犇大爷都来屠,南外的小朋友也来屠我们了真是感动...没有看到毛爷爷真是可惜.. Day[-1] 早上还在上课,吃完中饭立马跑去找 ...
- 基于cocoStudio的UIListView的可以左右滑动翻页的ListView
//WidgetSlideListView.h class WidgetEaseInListView : public cocos2d::gui::UIListView { public: stati ...
- Linux的文件管理
绝对路径和相对路径: 绝对路径: /home/tony/Desktop 相对路径:Desktop 或者./Desktop不可写成/Desktop(这是绝对路径的写法) 其中.代表本层目录,..代表上层 ...
- codeforces 471C.MUH and House of Cards 解题报告
题目链接:http://codeforces.com/problemset/problem/471/C 题目意思:有 n 张卡,问能做成多少种不同楼层(floor)的 house,注意这 n 张卡都要 ...