SPOJ QTREE4 lct
这个题已经处于花式tle了,改版后的spoj更慢了。。
tle的话就多交几把。。。
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
using namespace std;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if (c = getchar(), c == EOF) return 0;
while (c != '-' && (c<'0' || c>'9')) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) pt(x / 10);
putchar(x % 10 + '0');
}
typedef long long ll;
typedef pair<int, int> pii;
const int N = 200000 + 10;
const int inf = 1e9;
struct Node *null;
inline int First(multiset<int>&x) {//返回x中最大的数
return *x.rbegin();
}
inline int Second(multiset<int>&x) {//返回x中次大的数
multiset<int>::reverse_iterator it = x.rbegin();
it++; return *it;
}
struct Node {
Node *fa, *ch[2];
int size;
multiset<int>path, chain;
int ls, rs, ms;
int col, len, id;
bool rev;
inline void put() {
printf("%d siz:%d len:%d (%d,%d,%d) son{%d,%d} fa:%d col:%d \n", id, size, len, ls, rs, ms, ch[0]->id, ch[1]->id, fa->id, col);
// cout << "path: ";for (auto i : path)cout << i << " ";puts("");
// cout << "chain:";for (auto i : chain)cout << i << " ";puts("");
}
inline void clear(int _col, int _id) {
fa = ch[0] = ch[1] = null;
rev = 0;
id = _id;
col = _col;
size = len = 0;
ls = rs = ms = -inf;
path.clear(); chain.clear();
chain.insert(-inf); chain.insert(-inf); path.insert(-inf);
}
inline void push_up() {
if (this == null)return;
size = len + ch[0]->size + ch[1]->size;
int _chain = max(col, First(chain));
int L = max(_chain, ch[0]->rs + len);//从(虚边 or 左子树)的白点到this的最远距离
int R = max(_chain, ch[1]->ls);//从(虚边 or 右子树)的白点到this的最远距离
ls = max(ch[0]->ls, ch[0]->size + len + R);
rs = max(ch[1]->rs, ch[1]->size + L); ms = max(ch[0]->rs + len + R, L + ch[1]->ls);
ms = max(ms, max(ch[0]->ms, ch[1]->ms));
ms = max(ms, First(path));
ms = max(ms, First(chain) + Second(chain));
if (col == 0)
ms = max(max(ms, First(chain)), 0);
}
inline void push_down() {
if (rev) {
ch[0]->flip();
ch[1]->flip();
rev = 0;
}
}
inline void setc(Node *p, int d) {
ch[d] = p;
p->fa = this;
}
inline bool d() {
return fa->ch[1] == this;
}
inline bool isroot() {
return fa == null || fa->ch[0] != this && fa->ch[1] != this;
}
inline void flip() {
if (this == null)return;
swap(ch[0], ch[1]);
rev ^= 1;
}
inline void go() {//从链头開始更新到this
if (!isroot())fa->go();
push_down();
}
inline void rot() {
Node *f = fa, *ff = fa->fa;
int c = d(), cc = fa->d();
f->setc(ch[!c], c);
this->setc(f, !c);
if (ff->ch[cc] == f)ff->setc(this, cc);
else this->fa = ff;
f->push_up();
}
inline Node*splay() {
// go();
while (!isroot()) {
if (!fa->isroot())
d() == fa->d() ? fa->rot() : rot();
rot();
}
push_up();
return this;
}
inline Node* access() {//access后this就是到根的一条splay,而且this已经是这个splay的根了
for (Node *p = this, *q = null; p != null; q = p, p = p->fa) {
p->splay();
if (p->ch[1] != null) {
p->chain.insert(p->ch[1]->ls);
p->path.insert(p->ch[1]->ms);
}
if (q != null) {
p->chain.erase(p->chain.find(q->ls));
p->path.erase(p->path.find(q->ms));
}
p->setc(q, 1);
p->push_up();
}
return splay();
}
inline Node* find_root() {
Node *x;
for (x = access(); x->push_down(), x->ch[0] != null; x = x->ch[0]);
return x;
}
void make_root() {
access()->flip();
}
void cut() {//把这个点的子树脱离出去
access();
ch[0]->fa = null;
ch[0] = null;
push_up();
}
void cut(Node *x) {
if (this == x || find_root() != x->find_root())return;
else {
x->make_root();
cut();
}
}
void link(Node *x) {
if (find_root() == x->find_root())return;
else {
make_root(); fa = x;
}
}
};
void debug(Node *x) {
if (x == null)return;
x->put();
debug(x->ch[0]);
debug(x->ch[1]);
}
Node pool[N], *tail;
Node *node[N];
int n, q;
struct Edge {
int to, next, dis;
}edge[N<<1];
int head[N], edgenum;
inline void add(int u, int v, int dis) {
Edge E = { v, head[u], dis };
edge[edgenum] = E;
head[u] = edgenum++;
}
void dfs(int u, int fa) {
for (int i = head[u]; ~i; i = edge[i].next){
int v = edge[i].to; if (v == fa)continue;
node[v]->fa = node[u];
node[v]->len = edge[i].dis;
dfs(v, u);
node[u]->path.insert(node[v]->ms);
node[u]->chain.insert(node[v]->ls);
}
node[u]->push_up();
}
int main() {
while (cin >> n) {
tail = pool;
null = tail++;
null->clear(-inf, 0);
edgenum = 0;
for (int i = 1; i <= n; i++) {
head[i] = -1;
node[i] = tail++;
node[i]->clear(0, i);
}
for (int i = 1, u, v, d; i < n; i++) {
rd(u); rd(v); rd(d);
add(u, v, d); add(v, u, d);
}
dfs(1, 1);
rd(q); char str[5]; int u;
int ans = node[1]->ms;
while (q--) {
scanf("%s", str);
if (str[0] == 'C') {
rd(u);
node[u]->access();
if (node[u]->col == 0)node[u]->col = -inf;
else node[u]->col = 0;
node[u]->push_up();
ans = node[u]->ms;
}
else {
if (ans < 0)puts("They have disappeared.");
else pt(ans), puts("");
}
// for (int i = 1; i <= n; i++)debug(node[i]), puts("");
}
}
return 0;
}
/* */
SPOJ QTREE4 lct的更多相关文章
- SPOJ - OTOCI LCT
OTOCI Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/viewProblem. ...
- SPOJ QTREE3 lct
题目链接 题意: 给定n个点 q个询问 以下n-1行给出树边,点有黑或白色.初始化为白色 以下q行: 询问有2种: 1. 0 x 把x点黑变白,白变黑 2.1 x 询问Path(1,x)路径上第一个黑 ...
- SPOJ QTREE4 SPOJ Query on a tree IV
You are given a tree (an acyclic undirected connected graph) with N nodes, and nodes numbered 1,2,3. ...
- SPOJ QTREE2 lct
题目链接 题意: 给一棵树.有边权 1.询问路径的边权和 2.询问沿着路径的第k个点标. 思路:lct裸题. #include <iostream> #include <fstrea ...
- SPOJ QTREE5 lct
题目链接 对于每一个节点,记录这个节点所在链的信息: ls:(链的上端点)距离链内部近期的白点距离 rs:(链的下端点)距离链内部近期的白点距离 注意以上都是实边 虚边的信息用一个set维护. set ...
- SPOJ QTREE4 - Query on a tree IV 树分治
题意: 给出一棵边带权的树,初始树上所有节点都是白色. 有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为0). 分析: ...
- SPOJ QTREE4 - Query on a tree IV
You are given a tree (an acyclic undirected connected graph) with N nodes, and nodes numbered 1,2,3. ...
- SPOJ QTREE4 Query on a tree IV ——动态点分治
[题目分析] 同bzoj1095 然后WA掉了. 发现有负权边,只好把rmq的方式改掉. 然后T了. 需要进行底(ka)层(chang)优(shu)化. 然后还是T 下午又交就A了. [代码] #in ...
- Query on a tree IV SPOJ - QTREE4
https://vjudge.net/problem/SPOJ-QTREE4 点分就没有一道不卡常的? 卡常记录: 1.把multiset换成手写的带删除堆(套用pq)(作用很大) 2.把带删除堆里面 ...
随机推荐
- Linux的用户和用户组管理
Linux是个多用户多任务的分时操作系统,所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控 ...
- 新手必看:如何快速看懂VC++项目
1.在具备必需的编程基础知识后,试图理解一份完整的代码可以从以下几个方面入手: 1)首先运行以下程序,从外部角度感受一下有哪些功能. 2)了解代码中每个类的功能.看看文档,或者类的注释,那么仅仅 ...
- php的stdClass类
在PHP内核进行模块初始化操作时会自动加载这个函数, 这样,stdClass类的注册操作也就会被执行了.stdClass类是一个没有成员变量也没有成员方法的类. 它的所有的魔术方法,父类.接口等在初始 ...
- (转)iOS开发ARC内存管理技术要点
转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automati ...
- 你必须知道的 34 个简单实用的 Ubuntu 快捷键
ubuntu常用的快捷键: 1. Ctrl + W: 关闭当前 Nautilus 窗口 2. Ctrl+T: 在 Nautilus 打开新的 Tab 3. Ctrl + H: 切换隐藏文件(夹)显 ...
- AU3学习笔记
目录 1. AU3是什么?能做什么? 2. 乱学AU3中的命令(语言相关)? 3. 通过简单示例学习AU3? 4. 正则表达式的学习(对大小写敏感) 5.对于GUI的相关学习 1. AU ...
- 不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】
由微软 ASP.NET 团队|2008 年 8 月 19 日 推特 在本教程中,您将学习在不同版本的 Internet Information Services 中如何使用 ASP.NET MVC 和 ...
- Android创建启动画面[转]
每个Android应用启动之后都会出现一个Splash启动界面,显示产品的LOGO.公司的LOGO或者开发者信息.如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥 ...
- asp-net-web-api 自定义URl插件
http://attributerouting.net/#asp-net-web-api https://github.com/johnpapa/CodeCamper/blob/master/Code ...
- 简单的CSS网页布局--一二列布局
1.一列布局 (一)一列自适应 自适应浏览器,随着浏览器的拉伸而变化,一般宽度采用百分比的写法,很简<!DOCTYPE html> <html> <head lang=& ...