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: 给你一个有根树和一个节点集合 ...
随机推荐
- JavaScript 对象创建
tips: JavaScript 除了null和undefined之外,其他变量都可以当做对象使用. JavaScript 的基本数据类型有:number boolean string null u ...
- Sqli-labs less 12
Less-12 本关和less11是类似的,只是在id 的参数的处理上有一定的不同 当输入username:admin" Password: (随便) 报错后的结果为: You have a ...
- Flask实战第49天:cms轮播图管理页面布局
新建cms_banners.html继承cms_base.html {% extends 'cms/cms_base.html' %} {% block title %} 轮播图管理-CMS管理系统 ...
- DP套DP
DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...
- 2017 icpc 南宁网络赛
2000年台湾大专题...英语阅读输入输出专场..我只能说很强势.. M. Frequent Subsets Problem The frequent subset problem is define ...
- [BZOJ 4537][Hnoi 2016]最小公倍数
传送门 并查集+分块 看到题目可以想到暴力做法, 对于每个询问, 将所有a和b小于等于询问值的的边加入图中(用并查集), 如果询问的u和v在一个联通块中, 且该联通块的maxa和maxb均等与询问的a ...
- 【bitset】【推导】hdu5961 传递
<法一>http://blog.csdn.net/u014325920/article/details/53046890 1.判断传递的条件为:若G中有 一条边从a到b且有一条边从b到c ...
- 【dfs序+AC自动机+树状数组】BZOJ2434-[Noi2011]阿狸的打字机
[题目大意] 输入一个字符串,其中:(1)a..z:在字符串末尾添加当前字符(2)P:输出当前字符串(3)B:从当前字符串末尾删去一个字符. 给出m组查询,输出第i个输出的字符串在第j个输出的字符串内 ...
- 事件BOM DOM
1.事件 1.1 事件绑定 # 1.写在html元素中 <button onclick='code'></button> # 2.把事件当作元素对象的方法 btnEle.onc ...
- Problem E: 12306
#include <stdio.h> struct student{ int n; int m;}; int main(void) { int T; int k,g,i,j; ],max; ...