Annoying problem

Problem Description
Coco has a tree, whose nodes are conveniently labeled by 1,2,…,n, which has n-1 edge,each edge has a weight. An existing set S is initially empty.
Now there are two kinds of operation:

1 x: If the node x is not in the set S, add node x to the set S
2 x: If the node x is in the set S,delete node x from the set S

Now there is a annoying problem: In order to select a set of edges from tree after each operation which makes any two nodes in set S connected. What is the minimum of the sum of the selected edges’ weight ?

 
Input
one integer number T is described in the first line represents the group number of testcases.( T<=10 ) 
For each test:
The first line has 2 integer number n,q(0<n,q<=100000) describe the number of nodes and the number of operations.
The following n-1 lines each line has 3 integer number u,v,w describe that between node u and node v has an edge weight w.(1<=u,v<=n,1<=w<=100)
The following q lines each line has 2 integer number x,y describe one operation.(x=1 or 2,1<=y<=n)

 
Output
Each testcase outputs a line of "Case #x:" , x starts from 1.
The next q line represents the answer to each operation.

 
Sample Input
1
6 5
1 2 2
1 5 2
5 6 2
2 4 2
2 3 2
1 5
1 3
1 4
1 2
2 5
 
Sample Output
Case #1:
0
6
8
8
4
 
Author
FZUACM
 

题意:

给出一棵树,每个边都有一个权值,现在有一个空的集合,两种操作,

1 x吧x节点放到集合中(如果还没放入)

2 x把x节点从集合中拿出来(已放入)。

每次操作后输出最小的边权和,保证这些边可以将这些点连起来。

题解:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include<vector>
#include<set>
using namespace std;
const int N = 1e5+, M = , mod = , inf = 0x3f3f3f3f;
typedef long long ll;
//不同为1,相同为0
int in[N],dis[N],head[N],t,vis[N],fa[N][],deep[N],cas=,ff[N],cur,v[N];
vector<pair<int ,int > >G[N];
set<int >s;
struct edge{int to,next,v;}e[N*];
void add(int u,int v,int val) {e[t].to = v;e[t].next = head[u];e[t].v = val; head[u]=t++;}
void dfs(int x,int f) {
in[x] = cur;
ff[cur] = x;
cur++;
for(int i=;i<G[x].size();i++) {
if(G[x][i].first!=f) {
dis[G[x][i].first] = dis[x]+G[x][i].second;
dfs(G[x][i].first,x);
}
}
}
void dfs1(int x) {
vis[x] =;
for(int i=;i<=;i++) {
if(deep[x] < (<<i)) break;
fa[x][i] = fa[fa[x][i-]][i-];
}
for(int i=head[x];i;i=e[i].next) {
if(vis[e[i].to]) continue;
deep[e[i].to] = deep[x]+;
fa[e[i].to][] = x;
dfs1(e[i].to);
}
}
int lca(int x,int y) {
if(deep[x] < deep[y]) swap(x,y);
int t = deep[x] - deep[y];
for(int i=;i<=;i++)
if(t&(<<i)) x = fa[x][i];
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i]) {
x = fa[x][i];
y = fa[y][i];
}
if(x==y) return x;
return fa[x][];
}
int solve(int u){
if (s.empty())
return ;
int x, y;
set<int>::iterator it = s.lower_bound(u), itx = it;
itx--;
if (it == s.end() || it == s.begin()) {
it = s.begin();
itx = s.end();
itx--;
}
y = (*it);
x = (*itx);
y = ff[y];
x =ff[x];
u=ff[u];
//cout<<u<<" "<<x<<" "<<y<<endl;
return dis[u]-dis[lca(u,x)]-dis[lca(u,y)]+dis[lca(x,y)];
}
void init() {
int n,m;
for(int i=;i<N;i++) G[i].clear();s.clear();
memset(head,,sizeof(head));
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
memset(v,,sizeof(v));
memset(deep,,sizeof(deep));
memset(ff,,sizeof(ff));
memset(fa,,sizeof(fa));
memset(in,,sizeof(in));
cur=;t=;
scanf("%d%d",&n,&m);
for(int i=;i<=n-;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
add(a,b,c);
add(b,a,c);
}
dfs(,);dfs1();int ans=;
printf("Case #%d:\n",cas++);
for(int i=;i<=m;i++) {
int a,b;
scanf("%d%d",&a,&b);
b=in[b];
if(a==) {
if(!v[b]){
v[b]=;
if(s.size()==){
s.insert(b);
}
else{
ans+=solve(b);
s.insert(b);
}
}
}
else {
if(v[b]){
v[b]=;
s.erase(b);
if(s.size()!=){
ans-=solve(b);
}
}
}
printf("%d\n",ans);
}
}
int main() {int T;
scanf("%d",&T);
while(T--) {
init();
}
return ;
}

HDU 5296 Annoying problem dfs序 lca set的更多相关文章

  1. HDU 5296 Annoying problem dfs序 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Description Coco has a tree, w ...

  2. HDU 5296 Annoying problem (LCA,变形)

    题意: 给一棵n个节点的树,再给q个操作,初始集合S为空,每个操作要在一个集合S中删除或增加某些点,输出每次操作后:要使得集合中任意两点互可达所耗最小需要多少权值.(记住只能利用原来给的树边.给的树边 ...

  3. HDU 5296 Annoying problem LCA+树状数组

    题解链接 Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  4. HDU 5296 Annoying problem

    Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem

    Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  6. hdu_5293_Tree chain problem(DFS序+树形DP+LCA)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5293 被这题打蹦了,看着题解写的,很是爆炸,确实想不到,我用的DFS序+LCA+树形DP,当然也可以写 ...

  7. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

  8. HDOJ 5296 Annoying problem LCA+数据结构

    dfs一遍得到每一个节点的dfs序,对于要插入的节点x分两种情况考虑: 1,假设x能够在集合中的某些点之间,找到左边和右边距离x近期的两个点,即DFS序小于x的DFS序最大点,和大于x的DFS序最小的 ...

  9. HDU 3966 dfs序+LCA+树状数组

    题目意思很明白: 给你一棵有n个节点的树,对树有下列操作: I c1 c2 k 意思是把从c1节点到c2节点路径上的点权值加上k D c1 c2 k 意思是把从c1节点到c2节点路径上的点权值减去k ...

随机推荐

  1. .net mvc Model 验证总结

    ASP.NET MVC4中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完毕的. 我们要做的仅仅是给Model类的各属性 ...

  2. 在单机上安装多个oracle实例

    1   在 hp unix上安装 oracle 10g ,这个不解释,直接安装好. 创建组oinstall,dba,用户oracle  [root@node1 ~]# groupadd oinstal ...

  3. HTML、CSS和JS中注释类型的总结

    添加必要的注释,是一个优秀的程序员必须具备的好习惯,可以大大提高代码的可维护性.可读性. 1.HTML注释 <!--注释的内容--> 注释的地方(根据个人习惯可能有所不同): 结束标签的后 ...

  4. 队列(FIFO)详解

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  5. POJ 2388 基数排序

    这题可以直接nth_element过去 比如这样子 //By SiriusRen #include <cstdio> #include <algorithm> using na ...

  6. 【转】在IIS上部署你的ASP.NET Core项目

    概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kest ...

  7. Route学习笔记

    前言 UrlRoutingModule.class:这块的代码关联了上一篇中路由部分的一个详细说明 一:Route的讲解 1. 路由模板匹配 添加路由: MapRoute 剔除的路由:IgnoreRo ...

  8. WCF之操作重载

    服务契约的方法重载,会在装载宿主时,抛出异常. 解决是在操作契约上Name设置为不同值,但是生成的代理会把Name的名称作为方法的名称,不过我们可以手动的修改代理类,使得方法名与服务声明的名称一样. ...

  9. 洛谷P4012 深海机器人问题(费用流)

    题目描述 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生 ...

  10. BroadcastReceiver register 广播的动态注册方式

    1.动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听. 下面是具体的例子: BroadcastTest.java package com.czz.test; import and ...