3631: [JLOI2014]松鼠的新家|树链剖分
来源:互联网 发布:与喝酒有关的网络红歌 编辑:程序博客网 时间:2024/03/29 12:36
题目大意:小熊每走到一个新的房间就需要吃一个糖,问每个房间至少有几个糖。
题目中说的很不明确的样子。。。。。。
枚举相邻的两个点,把这连接这两个点的链上的点的权值都+1,然后除了起点外其他的点都再-1
可以直接树剖线段树直接标记改,复杂度
也可以直接差分一下最后在dfs一遍,复杂度
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<set>#include<map>#include<iostream>#include<algorithm>#define ll unsigned long long#define N 300022#define mx 1e9using namespace std;int sc(){ int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f;}int head[N],lst[N*2],nxt[N*2];int tag[N*4],ans[N],a[N];int size[N],fa[N],top[N],deep[N],S[N];int n,tot,cnt,TI;void insert(int x,int y){ lst[++tot]=y;nxt[tot]=head[x];head[x]=tot; lst[++tot]=x;nxt[tot]=head[y];head[y]=tot;}void dfs(int x,int f){ for(int i=head[x];i;i=nxt[i]) if(lst[i]!=f) { fa[lst[i]]=x; deep[lst[i]]=deep[x]+1; dfs(lst[i],x); size[x]+=size[lst[i]]; } size[x]++;}void _dfs(int x,int htp){ top[x]=htp;S[x]=++cnt; int k=0; for(int i=head[x];i;i=nxt[i]) if(lst[i]!=fa[x]&&size[lst[i]]>size[k])k=lst[i]; if(!k)return;_dfs(k,htp); for(int i=head[x];i;i=nxt[i]) if(lst[i]!=fa[x]&&lst[i]!=k) _dfs(lst[i],lst[i]);}void push_down(int x){ if(tag[x]) { tag[x<<1]+=tag[x]; tag[x<<1|1]+=tag[x]; tag[x]=0; }}void modify(int x,int L,int R,int l,int r){ if(L==l&&R==r){tag[x]++;return;} push_down(x); int mid=L+R>>1; if(r<=mid)modify(x<<1,L,mid,l,r); else if(l>mid)modify(x<<1|1,mid+1,R,l,r); else modify(x<<1,L,mid,l,mid),modify(x<<1|1,mid+1,R,mid+1,r);}void change(int x,int y){ while(top[x]!=top[y]) { if(deep[top[x]]<deep[top[y]])swap(x,y); modify(1,1,n,S[top[x]],S[x]); x=fa[top[x]]; } if(deep[x]>deep[y])swap(x,y); modify(1,1,n,S[x],S[y]);}int ask(int x,int l,int r,int p){ if(l==p&&r==p)return tag[x]; push_down(x); int mid=l+r>>1; if(p<=mid)return ask(x<<1,l,mid,p); else return ask(x<<1|1,mid+1,r,p);}int main(){ n=sc(); for(int i=1;i<=n;i++)a[i]=sc(); for(int i=1;i<n;i++) { int x=sc(),y=sc(); insert(x,y); } dfs(1,0);_dfs(1,1); for(int i=1;i<n;i++) change(a[i],a[i+1]); for(int i=1;i<=n;i++) { ans[i]=-(i!=a[1]); ans[i]+=ask(1,1,n,S[i]); } for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0;}
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<set>#include<map>#include<iostream>#include<algorithm>#define ll unsigned long long#define N 300022#define mx 1e9using namespace std;int sc(){ int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f;}int head[N],lst[N*2],nxt[N*2];int tag[N*4],ans[N],a[N],v[N];int size[N],fa[N],top[N],deep[N],S[N];int n,tot,cnt,TI;void insert(int x,int y){ lst[++tot]=y;nxt[tot]=head[x];head[x]=tot; lst[++tot]=x;nxt[tot]=head[y];head[y]=tot;}void dfs(int x,int f){ for(int i=head[x];i;i=nxt[i]) if(lst[i]!=f) { fa[lst[i]]=x; deep[lst[i]]=deep[x]+1; dfs(lst[i],x); size[x]+=size[lst[i]]; } size[x]++;}void _dfs(int x,int htp){ top[x]=htp;S[x]=++cnt; int k=0; for(int i=head[x];i;i=nxt[i]) if(lst[i]!=fa[x]&&size[lst[i]]>size[k])k=lst[i]; if(!k)return;_dfs(k,htp); for(int i=head[x];i;i=nxt[i]) if(lst[i]!=fa[x]&&lst[i]!=k) _dfs(lst[i],lst[i]);}int Lca(int x,int y){ while(top[x]!=top[y]) { if(deep[top[x]]<deep[top[y]])swap(x,y); x=fa[top[x]]; } return deep[x]>deep[y]?y:x;}void __dfs(int x,int f){ for(int i=head[x];i;i=nxt[i]) if(lst[i]!=f) { __dfs(lst[i],x); v[x]+=v[lst[i]]; } ans[x]+=v[x];}int main(){ n=sc(); for(int i=1;i<=n;i++)a[i]=sc(); for(int i=1;i<n;i++) { int x=sc(),y=sc(); insert(x,y); } dfs(1,0);_dfs(1,1); for(int i=2;i<=n;i++) { int lca=Lca(a[i],a[i-1]); ans[a[i]]=-1; v[a[i-1]]+=1;v[a[i]]+=1;v[lca]-=1;v[fa[lca]]-=1; } __dfs(1,0); for(int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0;}
0 0
- 3631: [JLOI2014]松鼠的新家|树链剖分
- bzoj 3631: [JLOI2014]松鼠的新家
- 【BZOJ 3631】 [JLOI2014]松鼠的新家
- 3631: [JLOI2014]松鼠的新家
- 3631:[JLOI2014]松鼠的新家
- bzoj 3631: [JLOI2014]松鼠的新家
- bzoj 3631 [JLOI2014]松鼠的新家
- 3631: [JLOI2014]松鼠的新家
- BZOJ 3631 [JLOI2014]松鼠的新家
- bzoj 3631 [JLOI2014]松鼠的新家
- 3631: [JLOI2014]松鼠的新家
- 3631: [JLOI2014]松鼠的新家
- 【BZOJ3631】[JLOI2014]松鼠的新家 树链剖分
- bzoj3631[JLOI2014]松鼠的新家 树链剖分
- BZOJ 3631 JLOI2014 松鼠的新家 树链剖分/LCA
- bzoj 3631: [JLOI2014]松鼠的新家 树链剖分
- 【bzoj 3631】[JLOI2014]松鼠的新家(树链剖分)
- Bzoj 3631: [JLOI2014]松鼠的新家(树链剖分+线段树)
- O2O“最后一公里”难题的五种解法
- 两分钟学会Android平台NDK编程(无须Eclipse和cygwin,可使用命令行打包多个so)
- MFC文件分割小工具
- C++ 何时使用引用参数(一些指导原则)
- oracle 通过父类查找子类 prior
- 3631: [JLOI2014]松鼠的新家|树链剖分
- poj1127
- Cocos2d-x之lambda表达式的使用
- BeanUtils工具包
- TCP的三次握手/四次挥手
- ubuntu/win7 双系统,重新装win7,系统卡在grub终端的问题修复
- 解决thinkphp在不支持pathinfo的nginx上的问题
- 【ZYNQ-7000开发之十四】Vivado HLS和OpenCV_上
- iOS开发之HTTP、TCP/IP、Socket