loj 2955 「NOIP2018」保卫王国 - 树链剖分 - 动态规划
题目传送门
想抄一个短一点ddp板子。然后照着Jode抄,莫名其妙多了90行和1.3k。
Code
/**
* loj
* Problem#2955
* Accepted
* Time: 2653ms
* Memory: 25616k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int N = 1e5 + 5; #define ll long long template <typename T>
T smin(T a, T b) {
return min(a, b);
}
template <typename T, typename ...Q>
T smin(T a, const Q &...args) {
return min(a, smin(args...));
} const ll llf = 1e12; typedef class Data {
public:
ll a[2][2]; Data() { }
Data(ll x) {
a[0][0] = llf, a[0][1] = 0;
a[1][0] = x, a[1][1] = x;
}
Data(ll x, ll y, ll z, ll w) {
a[0][0] = x, a[0][1] = y;
a[1][0] = z, a[1][1] = w;
} Data get() {
ll g = min(a[0][0], a[0][1]);
ll f = min(a[1][0], a[1][1]);
g = min(g, f);
return Data(f, f, g, g);
}
ll* operator [] (int p) {
return a[p];
}
friend Data operator * (Data a, Data b) {
Data rt;
rt[0][0] = min(a[0][0] + b[0][0], a[0][1] + b[1][0]);
rt[0][1] = min(a[0][0] + b[0][1], a[0][1] + b[1][1]);
rt[1][0] = min(a[1][0] + b[0][0], a[1][1] + b[1][0]);
rt[1][1] = min(a[1][0] + b[0][1], a[1][1] + b[1][1]);
return rt;
}
friend Data operator + (Data a, Data b) {
Data rt;
rt[0][0] = a[0][0] + b[0][0];
rt[0][1] = a[0][1] + b[0][1];
rt[1][0] = a[1][0] + b[1][0];
rt[1][1] = a[1][1] + b[1][1];
return rt;
}
friend Data operator - (Data a, Data b) {
Data rt;
rt[0][0] = a[0][0] - b[0][0];
rt[0][1] = a[0][1] - b[0][1];
rt[1][0] = a[1][0] - b[1][0];
rt[1][1] = a[1][1] - b[1][1];
return rt;
}
ll get_ans() {
ll rt = smin(a[0][0], a[0][1], a[1][0], a[1][1]);
return (rt >= llf) ? (-1) : (rt);
}
} Data; typedef class SegTreeNode {
public:
Data d;
SegTreeNode *fa;
SegTreeNode *l, *r; void push_up() {
d = l->d * r->d;
}
} SegTreeNode; typedef class Chain {
public:
SegTreeNode *st;
int len, top; Chain() { }
Chain(int top); void update(int, Data, Data);
} Chain; SegTreeNode pool[N << 1];
SegTreeNode *_top = pool; int S[N];
Data dat[N]; int tp;
Chain *ch[N];
SegTreeNode *tr[N]; void build(SegTreeNode*& p, int l, int r) {
p = _top++;
if (l == r) {
p->d = dat[S[l]];
tr[S[l]] = p;
return;
}
int mid = (l + r) >> 1;
build(p->l, l, mid);
build(p->r, mid + 1, r);
p->push_up();
p->l->fa = p;
p->r->fa = p;
} Chain::Chain(int top) : st(_top), len(tp), top(top) {
reverse(S + 1, S + tp + 1);
build(st, 1, len);
for (int i = 1; i <= len; i++) {
ch[S[i]] = this;
}
if (top) {
dat[top] = dat[top] + st->d.get();
}
} void Chain::update(int x, Data old_d, Data new_d) {
Data nold_d = st->d.get();
tr[x]->d = tr[x]->d - old_d + new_d;
for (SegTreeNode *p = tr[x]->fa; p; p = p->fa)
p->push_up();
if (top) {
ch[top]->update(top, nold_d, st->d.get());
}
} int n, m;
int p[N];
int sz[N], zson[N];
vector<int> G[N]; void dfs1(int p, int fa) {
int mx = 0, &id = zson[p];
sz[p] = 1;
for (auto e : G[p]) {
if (e ^ fa) {
dfs1(e, p);
sz[p] += sz[e];
if (mx < sz[e]) {
mx = sz[e];
id = e;
}
}
}
} void dfs2(int p, int fa) {
if (zson[p]) {
for (auto e : G[p]) {
if ((e ^ fa) && (e ^ zson[p])) {
dfs2(e, p);
new Chain(p);
}
}
dfs2(zson[p], p);
} else {
tp = 0;
}
S[++tp] = p;
} int main() {
freopen("defense.in", "r", stdin);
freopen("defense.out", "w", stdout);
scanf("%d%d%*s", &n, &m);
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
dat[i] = x;
p[i] = x;
}
for (int i = 1, u, v; i < n; i++) {
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1, 0);
dfs2(1, 0);
new Chain(0);
int a, x, b, y;
while (m--) {
scanf("%d%d%d%d", &a, &x, &b, &y);
Data olda = p[a], oldb = p[b];
Data na = Data(llf * (1 - x)), nb = Data(llf * (1 - y));
ch[a]->update(a, olda, na);
ch[b]->update(b, oldb, nb);
ll ans = ch[1]->st->d.get_ans() + olda[1][0] * x + oldb[1][0] * y;
ch[a]->update(a, na, olda);
ch[b]->update(b, nb, oldb);
printf("%lld\n", ans);
}
return 0;
}
loj 2955 「NOIP2018」保卫王国 - 树链剖分 - 动态规划的更多相关文章
- 「NOIP2018」保卫王国
「NOIP2018保卫王国」 题目描述 有一棵 \(n\) 个点, 点有点权 \(a_i\),\(m\) 组询问, 每次求钦点两个节点必须选或者必须不选后的树上最小点覆盖. \(1 \leq n, m ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- 「WC2010」重建计划(长链剖分/点分治)
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...
- LOJ 2551 「JSOI2018」列队——主席树+二分
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...
- LOJ 2555 「CTSC2018」混合果汁——主席树
题目:https://loj.ac/problem/2555 二分答案,在可以选的果汁中,从价格最小的开始选. 按价格排序,每次可以选的就是一个前缀.对序列建主席树,以价格为角标,维护体积和.体积*价 ...
- loj#2049. 「HNOI2016」网络(set 树剖 暴力)
题意 题目链接 Sol 下面的代码是\(O(nlog^3n)\)的暴力. 因为从一个点向上只会跳\(logn\)次,所以可以暴力的把未经过的处理出来然后每个点开个multiset维护最大值 #incl ...
- LOJ #2005. 「SDOI2017」相关分析 线段树维护回归直线方程
题目描述 \(Frank\) 对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. \(Frank\) 不仅喜欢观测,还喜欢分析观测到的 ...
- LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)
题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...
- loj#2665. 「NOI2013」树的计数
目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...
随机推荐
- thymeleaf入门
controller层添加实体 html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> ...
- Mongodb的常用语句
模糊查询 regex(".*?\\"+questionContent+".*") String questionContent = "需求" ...
- 基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 实验目的 - 学习ESP8266模块(ESP-01) ...
- 解决 IDEA 无法找到 java.util.Date 的问题
原文首发于 studyidea.cn点击查看更多技巧 问题 最近在项目中频繁使用到 java.util.Date,但是使用 IDEA 提示查找 Date 类,却无法找到 java.util.Date. ...
- 图片服务器FastDFS的安装及使用
FastDFS介绍 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS ...
- python——Tkinter图形化界面及threading多线程
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...
- Jenkins持续集成的应用--基础
1.测试工程师为什么要掌握持续集成 一个程序员如果想发布一个产品,他需要编码.编译.测试,发布的过程.对于一个企业来说,如果也想发布一个产品的话,同样的也是需要上述的过程,区别在于企业要发布的产品的需 ...
- 8 Best DDoS Attack Tools (Free DDoS Tool Of The Year 2019)
#1) HULK Description: HULK stands for HTTP Unbearable Load King. It is a DoS attack tool for the web ...
- 考研辅助app的诞生!
背景: 去年下半年由于种种因素驱动下,准备去考研,在之前同事的推荐下,参加了考研培训班,培训班发了纸质书籍和线上视频观看账号,由于线上视频需要全程联网才能观看,突发奇想,要是我把这些视频下载下来,没网 ...
- Spring Boot实战之定制自己的starter
本文首发于个人网站,原文地址:http://www.javaadu.online/?p=535,如需转载,请注明出处 在学习Spring Boot的过程中,接触最多的就是starter.可以认为sta ...