zoukankan      html  css  js  c++  java
  • loj2182 「SDOI2015」寻宝游戏

    参考这里

    #include <iostream>
    #include <cstdio>
    #include <set>
    using namespace std;
    typedef long long ll;
    int n, m, ise[100005], fa[100005][19], dep[100005], uu, vv, ww, hea[100005], cnt;
    int faq, nfd[100005];
    ll dis[100005], ans;
    struct Edge{
    	int too, nxt, val;
    }edge[200005];
    struct Node{
    	int idx, dfn;
    	bool operator<(const Node &x)const{
    		return dfn<x.dfn;
    	}
    };
    set<Node> qwq;
    void add_edge(int fro, int too, int val){
    	edge[++cnt].nxt = hea[fro];
    	edge[cnt].too = too;
    	edge[cnt].val = val;
    	hea[fro] = cnt;
    }
    void dfs(int x, int f, ll d){
    	nfd[x] = ++faq;
    	dis[x] = d;
    	fa[x][0] = f;
    	dep[x] = dep[f] + 1;
    	for(int i=hea[x]; i; i=edge[i].nxt){
    		int t=edge[i].too;
    		if(t!=f)	dfs(t, x, d+edge[i].val);
    	}
    }
    int queryPre(int x){
    	set<Node>::iterator i=qwq.lower_bound((Node){x, nfd[x]});
    	if(i==qwq.begin())	i = qwq.end();
    	return (*(--i)).idx;
    }
    int queryNxt(int x){
    	set<Node>::iterator i=qwq.lower_bound((Node){x, nfd[x]});
    	if((++i)==qwq.end())	i = qwq.begin();
    	return (*i).idx;
    }
    int lca(int x, int y){
    	if(dep[x]<dep[y])	swap(x, y);
    	for(int i=16; i>=0; i--)
    		if(dep[fa[x][i]]>=dep[y])
    			x = fa[x][i];
    	if(x==y)	return x;
    	for(int i=16; i>=0; i--)
    		if(fa[x][i]!=fa[y][i]){
    			x = fa[x][i];
    			y = fa[y][i];
    		}
    	return fa[x][0];
    }
    ll qdis(int x, int y){
    	return dis[x]+dis[y]-2*dis[lca(x, y)];
    }
    ll query(int x){
    	int pre, nxt, fla;
    	if(!ise[x]){
    		fla = 1;
    		qwq.insert((Node){x, nfd[x]});
    		pre = queryPre(x);
    		nxt = queryNxt(x);
    	}
    	else{
    		fla = -1;
    		pre = queryPre(x);
    		nxt = queryNxt(x);
    		qwq.erase((Node){x, nfd[x]});
    	}
    	ise[x] ^= 1;
    	if(qwq.size()<=1)	ans = 0;
    	else	ans += fla * (qdis(pre, x)+qdis(x, nxt)-qdis(pre, nxt));
    	return ans;
    }
    int main(){
    	cin>>n>>m;
    	for(int i=1; i<n; i++){
    		scanf("%d %d %d", &uu, &vv, &ww);
    		add_edge(uu, vv, ww);
    		add_edge(vv, uu, ww);
    	}
    	dfs(1, 0, 0);
    	for(int i=1; i<=16; i++)
    		for(int j=1; j<=n; j++)
    			fa[j][i] = fa[fa[j][i-1]][i-1];
    	while(m--){
    		scanf("%d", &uu);
    		printf("%lld
    ", query(uu));
    	}
    	return 0;
    }
    
  • 相关阅读:
    HDU 4778 内存搜索&amp;如压力
    cocos2dx-2.x CCFileUtils文件管理分析(2)
    开源 自由 java CMS
    1.网络工具:ifconfig,ping,netstate,Redhat命令和图形化设置ip,finger,nslookup
    什么是PV,UV。
    Python爬虫框架Scrapy获得定向打击批量招聘信息
    采用ToolRunner执行Hadoop基本面分析程序
    编辑时snapping的添加
    利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
    由图层判断数据源类型
  • 原文地址:https://www.cnblogs.com/poorpool/p/8746806.html
Copyright © 2011-2022 走看看