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);
    }


  • 相关阅读:
    websocket使用nginx作为反向代理
    curl模拟http发送get或post接口测试
    linux tail -f messages查看控制台失败
    shell中使用>/dev/null 2>&1 丢弃信息
    mysql备份与还原
    计算机中RAM和ROM
    *C语言有关指针的变量声明中的几个易错点
    五种存储变量补充~作用域和存储时期
    typedef和#define的简单比较
    fopen()函数参数
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7774405.html
Copyright © 2011-2022 走看看