【HDOJ】5296 Annoying problem
LCA+RMQ。挺不错的一道题目。
思路是如何通过LCA维护费用。当加入新的点u是,费用增量为
dis[u]-dis[lca(u, lower_u)] - dis[lca(u, greater_u)] + dis[lca(lower_u, greater_u)]。
若beg[u]大于当前最大值或小于最小值,lower_u=min of current, greater_u = max of current。
/* 5296 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct {
int v, w, nxt;
} edge_t; const int maxn = 1e5+;
const int maxv = maxn;
const int maxe = maxv * ;
int head[maxv];
edge_t E[maxe];
int dis[maxn], deep[maxn];
bool visit[maxn];
int beg[maxn];
int V[maxn<<], D[maxn<<];
int dp[][maxn<<];
int l, top;
sti st;
sti::iterator iter; void init() {
st.clr();
memset(visit, false, sizeof(visit));
memset(head, -, sizeof(head));
l = top = ;
} void addEdge(int u, int v, int w) {
E[l].v = v;
E[l].w = w;
E[l].nxt = head[u];
head[u] = l++; E[l].v = u;
E[l].w = w;
E[l].nxt = head[v];
head[v] = l++;
} void dfs(int u, int fa, int d, int w) {
dis[u] = w;
V[++top] = u;
D[top] = d;
beg[u] = top; int v, k; for (k=head[u]; k!=-; k=E[k].nxt) {
v = E[k].v;
if (v == fa)
continue;
dfs(v, u, d+, w+E[k].w);
V[++top] = u;
D[top] = d;
}
} void init_RMQ(int n) {
int i, j; for (i=; i<=n; ++i)
dp[][i] = i;
for (j=; (<<j)<=n; ++j)
for (i=; i+(<<j)-<=n; ++i)
if (D[dp[j-][i]] < D[dp[j-][i+(<<(j-))]])
dp[j][i] = dp[j-][i];
else
dp[j][i] = dp[j-][i+(<<(j-))];
} int RMQ(int l, int r) {
if (l > r)
swap(l, r); int k = ; while (<<(k+) <= r-l+)
++k; if (D[dp[k][l]] < D[dp[k][r-(<<k)+]])
return V[dp[k][l]];
else
return V[dp[k][r-(<<k)+]];
} int calc(int u) {
if (st.empty())
return ; int x, y; iter = st.upper_bound(beg[u]);
if (iter == st.end() || iter==st.begin()) {
y = *st.rbegin();
x = *st.begin();
} else {
y = *iter;
--iter;
x = *iter;
} int ret = ; ret = dis[u] - dis[RMQ(x, beg[u])] - dis[RMQ(beg[u], y)] + dis[RMQ(x, y)];
return ret;
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t;
int n, q;
int u, v, w;
int op;
int ans; scanf("%d", &t);
rep(tt, , t+) {
scanf("%d %d", &n, &q);
init();
rep(i, , n) {
scanf("%d %d %d", &u, &v, &w);
addEdge(u, v, w);
}
dfs(, , , );
init_RMQ(top);
printf("Case #%d:\n", tt);
ans = ;
while (q--) {
scanf("%d %d", &op, &u);
if (op == ) {
if (!visit[u]) {
visit[u] = true;
ans += calc(u);
st.insert(beg[u]);
}
} else {
if (visit[u]) {
visit[u] = false;
st.erase(beg[u]);
ans -= calc(u);
}
}
printf("%d\n", ans);
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
数据发生器。
from random import randint, shuffle
import shutil
import string def GenDataIn():
with open("data.in", "w") as fout:
t = 10
bound = 10**3
fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(20, 30)
q = randint(20, 30)
fout.write("%d %d\n" % (n, q))
ust = [1]
vst = range(1, n+1)
ust.append(1)
vst.remove(1)
un = 1
vn = n - 1
for i in xrange(1, n):
uidx = randint(0, un-1)
u = ust[uidx]
vidx = randint(0, vn-1)
v = vst[vidx]
ust.append(v)
vst.remove(v)
un += 1
vn -= 1
w = randint(1, 100)
fout.write("%d %d %d\n" % (u, v, w))
L = []
for i in xrange(q):
op = randint(1, 2)
x = randint(1, n)
fout.write("%d %d\n" % (op, x)) def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()
【HDOJ】5296 Annoying problem的更多相关文章
- 【HDOJ】1022 Train Problem I
栈和队列训练题目. #include <stdio.h> #include <string.h> #define MAXNUM 1005 char in[MAXNUM]; ch ...
- 【HDOJ】3549 Flow Problem
网络流基础题目,Edmonds_Karp可解. /* 3549 */ #include <iostream> #include <string> #include <ma ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
- 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...
- 【BZOJ1000】A+B Problem ★BZOJ1000题达成★
[BZOJ1000]A+B Problem Description 输入两个数字,输出它们之和 Input 一行两个数字A,B(0<=A,B<100) Output 输出这两个数字之和 S ...
- 【题解】CF45G Prime Problem
[题解]CF45G Prime Problem 哥德巴赫板子题? \(\frac{n(n+1)}{2}\)若是质数,则不需要分了. 上式 若是奇数,那么拆成2和另一个数. 上式 若是偶数吗,直接\(O ...
- 【BZOJ3218】a + b Problem 可持久化线段树优化建图
[BZOJ3218]a + b Problem 题解:思路很简单,直接最小割.S->i,容量为Bi:i->T,容量为Wi:所有符合条件的j->new,容量inf:new->i, ...
- 【题解】P4137 Rmq Problem(莫队)
[题解]P4137 Rmq Problem(莫队) 其实这道题根本就不用离散化! 因为显然有\(mex\)值是\(\le 2\times 10^5\)的,所以对于大于\(2\times 10^5\)的 ...
- HDOJ 5296 Annoying problem LCA+数据结构
dfs一遍得到每一个节点的dfs序,对于要插入的节点x分两种情况考虑: 1,假设x能够在集合中的某些点之间,找到左边和右边距离x近期的两个点,即DFS序小于x的DFS序最大点,和大于x的DFS序最小的 ...
随机推荐
- JavaScript异步获取数据解析
<script type="text/javascript"> var xhr=false; function createXhr() { var x ...
- discuz管理中心无法登陆
检查下配置文件,当前管理是不是创始人. 如是,那试下修改数据库,在数据表出错时也会这样,还有一个也同时试下 \config\config_global.php 文件 $_config['admincp ...
- 【转】分享10VPN
以下介绍的vpn,都是有免费流量赠送的免费vpn,完全不免费的不在之列. 免费vpn因为用的人比较多,所以高峰时段可能会有点慢,但是人少时,还是比较顺畅的.对于偶尔浏览外网,看看新闻的同学来说,免费v ...
- [Testing] 測試電子原文書
測試電子原文書 http://files.cnblogs.com/vincentmylee/SoftwareTesting2ndEdition.7z
- 装tortoiseSVN时遇到的坑
今天给新电脑配置开发环境,线上SVN地址申请权限以后,在本地装了tortoiseSVN,可是安装了以后死活打不开.明明浏览器里可以打开SVN地址,但是tortoiseSVN的浏览器里却打不开,摆弄了很 ...
- container_of宏定义分析---linux内核
问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of宏定义在[include/linux/kernel.h]中:/*_** container_of - cast a ...
- PyQt4学习记录之事件和信号
事件是任何 GUI程序中很重要的部分.所有 Python GUI 应用都是事件驱动的.一个应用对其生命期产生的不同的事件类型做出反应.事件是主要由应用的用户产生.但是,也可以通过其他方法产生,比如,网 ...
- C++程序员笔试复习概要(一)
第8章 类和对象的创建 [内容提要] 类和对象 构造函数和析构函数 对象数组与对象指针 静态成员 友元 静态函数 虚函数 [重点与难点] 8.1 类和对象 8.1.1 类的定义 类实质上是用户 ...
- 十四、mysql 分区之 HASH && KEY
.hash分区 PS::个人觉得HASH分区很好很强大,简单确分布极其均匀 创建实例: CREATE TABLE HASH_EMP ( tid int, tname ) ) PARTITION ; 将 ...
- ubuntu find方法
通用格式:find pathname -options [-print -exec -ok]例子:find / -name filename 再根目录里面搜索文件名为filename的文件find / ...