zoukankan      html  css  js  c++  java
  • Jzoj3717【NOI2014模拟7.2】火车

    A国有n个城市,城市之间有一些双向道路相连,并且城市两两之间有唯一路径。现在有火车在城市a,需要经过m个城市。火车按照以下规则行驶:每次行驶到还没有经过的城市中在m个城市中最靠前的。现在小A想知道火车经过这m个城市后所经过的道路数量。

    很显然的树剖题目嘛,加上个区间打标记即可,可以用树状数组

    注意数据很坑,dfs爆栈,所以要从最中间开始dfs

    (真的不知道为什么是NOI模拟)

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 500010
    using namespace std;
    struct Edge{ int v,nt; } G[N<<1];
    int h[N],f[N],d[N],top[N],son[N],sz[N];
    int n,m,cnt=0,k,w[N],v[N],tot=0; long long ans=0;
    inline void adj(int x,int y){
    	G[++cnt]=(Edge){y,h[x]}; h[x]=cnt;
    }
    inline int _(int x){ return x&-x; }
    inline void add(int x,int k){ for(;x<=n;x+=_(x)) v[x]+=k; }
    inline int sum(int x,int k=0){ for(;x;x-=_(x)) k+=v[x]; return k; }
    void dfs(int x,int p){
    	f[x]=p; d[x]=d[p]+1; sz[x]=1;
    	for(int v,i=h[x];i;i=G[i].nt)
    		if((v=G[i].v)!=p){
    			dfs(v,x);
    			sz[x]+=sz[v]; 
    			if(sz[v]>sz[son[x]]) son[x]=v;
    		}
    }
    void dijk(int x,int t){
    	top[x]=t; w[x]=++tot;
    	if(son[x]) dijk(son[x],t);
    	for(int v,i=h[x];i;i=G[i].nt)
    		if((v=G[i].v)!=f[x]&&v!=son[x]) dijk(v,v);
    }
    int Lca(int a,int b){
    	for(;;){
    		if(top[a]==top[b]){
    			if(d[a]>d[b]) swap(a,b);
    			add(w[b]+1,-1); add(w[a],1);
    			return a;
    		}
    		if(d[top[a]]>d[top[b]]) swap(a,b);
    		add(w[b]+1,-1); add(w[top[b]],1); b=f[top[b]];
    	}
    }
    int range(int a,int b){
    	if(sum(w[b])) return -1;
    	int c=Lca(a,b);
    	return d[a]+d[b]-2*d[c];
    }
    int main(){
    	freopen("train.in","r",stdin);
    	freopen("train.out","w",stdout);
    	scanf("%d%d%d",&n,&m,&k);
    	for(int a,b,i=1;i<n;++i) { scanf("%d%d",&a,&b); adj(a,b); adj(b,a); }
    	dfs(n>>1,0); dijk(n>>1,n>>1);
    	for(int x,i=0;i<m;++i){
    		scanf("%d",&x);
    		int b=range(k,x);
    		if(b>0){ k=x;ans+=b; }
    	}
    	printf("%lld
    ",ans);
    }


  • 相关阅读:
    Service Name Port Number Transport Protocol tcp udp 端口号16bit
    linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)
    soft deletion Google SRE 保障数据完整性的手段
    Taylor series
    Taylor's theorem
    Moving average
    REQUEST
    Unix file types
    mysqld.sock
    Tunneling protocol
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7774405.html
Copyright © 2011-2022 走看看