HDU 5296 Annoying problem
Annoying problem
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 203 Accepted Submission(s): 60
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 ?
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)
The next q line represents the answer to each operation.
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
Case #1:
0
6
8
8
4
#include <bits/stdc++.h>
using namespace std;
#define prt(k) cerr<<#k" = "<<k<<endl
typedef unsigned long long ll; const int N = 233333;
int n, m, head[N], mm;
struct Edge
{
int to, next, w;
} e[N << 1];
void add(int u, int v, int w = 1)
{
e[mm].to = v;
e[mm].next = head[u];
e[mm].w = w;
head[u] = mm++;
}
int sz[N], dep[N];
int f[N][22]; /// f[i][j] 表示 i 的第 2^j 个祖先
int dfn[N]; ///dfs index
int cur;
int id[N]; /// you dfs xu qiu chu bian hao
int len[N];
void dfs(int u, int fa) /// 点从 1 開始标号
{
f[u][0] = fa;
sz[u] = 1;
dfn[u] = ++cur;
id[cur] = u;
for (int i=head[u]; ~i; i=e[i].next)
{
int v = e[i].to;
int w = e[i].w;
if (v != fa)
{
dep[v] = dep[u] + 1;
len[v] = len[u] + w;
dfs(v, u);
sz[u] += sz[v];
}
}
}
int maxh;
void gao()
{
cur = 0;
dep[0] = -1;
len[1] = dep[1] = 0;
f[1][0] = 1;
dfs(1, 0);f[1][0] = 1;
int j;
for (j=1; (1<<j)<n; j++)
for (int i=1; i<=n; i++)
f[i][j] = f[f[i][j-1]][j-1];
maxh = j - 1;
}
int swim(int x, int k)
{
for (int i=0; i<=maxh; i++)
if (k >> i & 1)
x = f[x][i];
return x;
}
int LCA(int x, int y)
{
if (dep[x] > dep[y]) swap(x, y); ///dep[x] <= dep[y];
y = swim(y, dep[y] - dep[x]);
if (x == y) return y;
for (int i=maxh; i>=0; i--)
{
if (f[x][i] != f[y][i])
x = f[x][i], y = f[y][i];
}
return f[x][0];
}
int Q; set<int> se;
set<int>::iterator it;
int dist(int x, int y)
{
int lca = LCA(x, y);
return len[x] - len[lca] + len[y] - len[lca];
}
int solve(int u)
{
if (se.empty()) return 0;
int x, y;
int t = *se.begin();
it = se.lower_bound( u);
y = *it;
it--;
x = *(it );
int t2 = *se.rbegin();
x = id[x];
y = id[y];
if (t2 < u || t > u)
{
x = id[t]; y = id[t2];
}
u = id[u];
return len[u] - len[LCA(x,u) ] - len[LCA(y,u)] + len[LCA(x,y) ];
}
int main()
{
int re;
cin>>re;
int ca=1;
while (re--)
{
cin>>n>>Q;
mm = 0;
memset(head,-1,sizeof head);
for (int i=0; i<n-1; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
gao();
printf("Case #%d:\n", ca++);
se.clear();
int ans = 0;
while (Q--)
{
int op, u;
scanf("%d%d", &op, &u);
u = dfn[u];
if (op==1)
{
it = se.find(u);
if (it==se.end())
{
ans += solve(u);
se.insert(u);
}
}
else
{
it = se.find(u);
if (it != se.end())
{
se.erase(u);
ans -= solve(u);
}
}
printf("%d\n", ans);
}
}
return 0;
}
HDU 5296 Annoying problem的更多相关文章
- HDU 5296 Annoying problem dfs序 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Description Coco has a tree, w ...
- HDU 5296 Annoying problem LCA+树状数组
题解链接 Annoying problem Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- 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 ...
- HDU 5296 Annoying problem dfs序 lca set
Annoying problem Problem Description Coco has a tree, whose nodes are conveniently labeled by 1,2,…, ...
- HDU 5296 Annoying problem (LCA,变形)
题意: 给一棵n个节点的树,再给q个操作,初始集合S为空,每个操作要在一个集合S中删除或增加某些点,输出每次操作后:要使得集合中任意两点互可达所耗最小需要多少权值.(记住只能利用原来给的树边.给的树边 ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- HDOJ 5296 Annoying problem LCA+数据结构
dfs一遍得到每一个节点的dfs序,对于要插入的节点x分两种情况考虑: 1,假设x能够在集合中的某些点之间,找到左边和右边距离x近期的两个点,即DFS序小于x的DFS序最大点,和大于x的DFS序最小的 ...
- 【HDOJ】5296 Annoying problem
LCA+RMQ.挺不错的一道题目. 思路是如何通过LCA维护费用.当加入新的点u是,费用增量为dis[u]-dis[lca(u, lower_u)] - dis[lca(u, greater_u)] ...
- 2015 Multi-University Training Contest 1 - 1009 Annoying problem
Annoying problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5296 Mean: 给你一个有根树和一个节点集合 ...
随机推荐
- 633. Sum of Square Numbers【Easy】【双指针-是否存在两个数的平方和等于给定目标值】
Given a non-negative integer c, your task is to decide whether there're two integers a and bsuch tha ...
- CF #502
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...
- BZOJ 1700 [Usaco2007 Jan]Problem Solving 解题(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1700 [题目大意] 共有p道题目要做,每个月收入只有n元,用于付钱做题之外的部分都会吃 ...
- 操作系统介绍、python基础
操作系统 什么是操作系统? 操作系统位于计算机硬件与应用软件之间,是一个协调.管理.控制计算机硬件资源与软件资源的控制程序. 2.为何要操作系统 ① .控制硬件 ② .把对硬件的复杂的操作封装成 ...
- nginx和php-fpm的用户权限
启动php-fpm sudo php-fpm -c /etc/php.ini [17-Sep-2018 00:36:59] ERROR: [pool www] please specify user ...
- [Asp.net本质论]重新认识url
引言 之前大部分时间,一直在学c#,打算将asp.net本质论好好学习一下,之前虽然已经看了两边了,总感觉看过,没做笔记等于白看了,一点印象也没.打算将书中的代码,自己实现一下,在敲代码时要一直反思, ...
- c bash 代码遍历文件夹下所有文件
用C代码.bash实现代码遍历文件夹下所有文件 递归方式实现如下: void listdir(char *path) { DIR *ptr_dir; struct dirent *dir_entry; ...
- Jenkins环境初步配置
为研究在kubernetes上的CICD,先在物理环境下安装个JenKins热热身. 安装Jenkins 在官网https://jenkins.io/下载war包,我的是http://mirrors. ...
- mac远程链接 windows
https://bbs.feng.com/read-htm-tid-10516042.html 一.利用电脑系统自带的远程(喜欢懒人版的方法,或者小白用户,可以跳过这个方法看下一个) 1.打开mac, ...
- NetBiosDomainNamesEnabled与SharePoint User Profile Service Application
本文中的内容转自参考资料中的文章. 如果域的NetBios名字跟Fully Qualified Domain Name不同的话, 那么就需要开启UPA的NetBiosDomainNamesEnab ...