bzoj2658: [Zjoi2012]小蓝的好友(mrx)
太神辣 treap的随机键值竟然能派上用场。。
要用不旋转的treap来进行维护区间信息
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream> using namespace std; template<typename Q> Q &read(Q &x) {
static char c, f;
for(f = ; c = getchar(), !isdigit(c); ) if(c == '-') f = ;
for(x = ; isdigit(c); c = getchar()) x = x * + c - '';
if(f) x = -x; return x;
}
template<typename Q> Q read() {
static Q x; read(x); return x;
} typedef long long LL;
const int N = + ; LL S(LL x) {
return x * (x + ) >> ;
} struct Node *null, *pis;
struct Node {
int sz, h, tag;
LL ans;
Node *ch[]; Node() {}
Node(int h) : h(h) {
sz = , ans = tag = ;
ch[] = ch[] = null;
} void add(int d) {
if(this == null) return;
h += d, tag += d;
} void maintain() {
sz = ch[]->sz + ch[]->sz + ;
ans = ;
for(int c = ; c < ; c++) {
ans += ch[c]->ans + S(ch[c]->sz) * (ch[c]->h - h);
}
} void down() {
ch[]->add(tag);
ch[]->add(tag);
tag = ;
} void *operator new(size_t) {
return pis++;
}
}pool[N]; Node *merge(Node *l, Node *r) {
if(l == null) return r;
if(r == null) return l;
if(l->h < r->h) {
l->down();
l->ch[] = merge(l->ch[], r);
return l->maintain(), l;
}else {
r->down();
r->ch[] = merge(l, r->ch[]);
return r->maintain(), r;
}
} typedef pair<Node *, Node *> pnn;
pnn split(Node *o, int k) {
if(o == null) return pnn(null, null);
pnn res; o->down();
if(o->ch[]->sz >= k) {
res = split(o->ch[], k);
o->ch[] = res.second;
res.second = o;
}else {
res = split(o->ch[], k - o->ch[]->sz - );
o->ch[] = res.first;
res.first = o;
}
return o->maintain(), res;
} pair<int, int> p[ + ]; int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif int r, c, n;
scanf("%d%d%d", &r, &c, &n);
for(int i = ; i < n; i++) {
scanf("%d%d", &p[i].first, &p[i].second);
}
sort(p, p + n); pis = pool, null = new Node();
null->sz = ;
Node *root = null;
for(int i = ; i <= c; i++) {
root = merge(root, new Node());
} LL ans = S(r) * S(c);
for(int i = , j = ; i <= r; i++) {
root->add();
while(j < n && p[j].first == i) {
int x = p[j++].second;
pnn r1 = split(root, x - );
pnn r2 = split(r1.second, );
r2.first->h = ;
root = merge(merge(r1.first, r2.first), r2.second);
}
ans -= root->ans + S(root->sz) * root->h;
}
cout << ans << endl; return ;
}
fhq treap
谁说一定要用fhq treap?
用普通的treap就好了 而且常数小!
注意建树最好$O(n)$建一下,每次insert有可能退化成$O(n^2)$的。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream> using namespace std; template<typename Q> Q &read(Q &x) {
static char c, f;
for(f = ; c = getchar(), !isdigit(c); ) if(c == '-') f = ;
for(x = ; isdigit(c); c = getchar()) x = x * + c - '';
if(f) x = -x; return x;
}
template<typename Q> Q read() {
static Q x; read(x); return x;
} typedef long long LL;
const int N = + ; LL S(LL x) {
return x * (x + ) >> ;
} struct Node *null, *pis, *bin[N];
int top;
struct Node {
int sz, v, h, tag;
LL ans;
Node *ch[]; Node() {}
Node(int v, int h) : v(v), h(h) {
sz = , ans = tag = ;
ch[] = ch[] = null;
} void add(int d) {
if(this == null) return;
h += d, tag += d;
} void maintain() {
sz = ch[]->sz + ch[]->sz + ;
ans = ;
for(int c = ; c < ; c++) {
ans += ch[c]->ans + S(ch[c]->sz) * (ch[c]->h - h);
}
} void down() {
ch[]->add(tag);
ch[]->add(tag);
tag = ;
} void *operator new(size_t) {
return top ? bin[--top] : pis++;
} void operator delete(void *p) {
bin[top++] = (Node *) p;
} int cmp(int x) const {
if(x == v) return -;
return x < v ? : ;
}
}pool[N]; void rotate(Node *&o, int d) {
Node *t = o->ch[d];
o->ch[d] = t->ch[d ^ ];
t->ch[d ^ ] = o;
o->maintain();
(o = t)->maintain();
} void modify(Node *&o, int x, int w) {
o->down();
int d = o->cmp(x);
if(d == -) return o->h = w, o->maintain(), void();
modify(o->ch[d], x, w);
if(o->ch[d]->h < o->h) rotate(o, d);
else o->maintain();
} pair<int, int> p[ + ]; void build(Node *&o, int l, int r) {
if(l > r) return;
int mid = (l + r) >> ;
o = new Node(mid, );
build(o->ch[], l, mid - );
build(o->ch[], mid + , r);
o->maintain();
} int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif int r, c, n;
scanf("%d%d%d", &r, &c, &n);
for(int i = ; i < n; i++) {
read(p[i].first), read(p[i].second);
}
sort(p, p + n); pis = pool, null = new Node(, );
null->sz = ;
Node *root;
build(root, , c); LL ans = S(r) * S(c);
for(int i = , j = ; i <= r; i++) {
root->add();
while(j < n && p[j].first == i) {
modify(root, p[j++].second, );
}
ans -= root->ans + S(root->sz) * root->h;
}
cout << ans << endl; return ;
}
普通treap
bzoj2658: [Zjoi2012]小蓝的好友(mrx)的更多相关文章
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线
[BZOJ2658][Zjoi2012]小蓝的好友(mrx) Description 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的 ...
- 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)
题面 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得 ...
- @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)
目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ...
- BZOJ2658 ZJOI2012 小蓝的好友(treap)
显然转化为求不包含关键点的矩形个数.考虑暴力,枚举矩形下边界,求出该行每个位置对应的最低障碍点高度,对其建笛卡尔树,答案即为Σhi*(slson+1)*(srson+1),即考虑跨过该位置的矩形个数. ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- [ZJOI2012]小蓝的好友
https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...
- BZOJ 2658 小蓝的好友
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2658 题意:给出一个n*m的格子.某些格子中有障碍.求包含至少一个障碍的矩形有多少 ...
- P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】
正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- 引入的iframe是跨域的, 如何控制其高度
前提是你有编辑这个跨域的iframe的权限!! 1. main-domain.html (main display HTML) <!DOCTYPE html> <html> & ...
- C#后台程序与HTML页面中JS方法互调
此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...
- JS中的 this
JS中的 this 变化多端,似乎难以捉摸,但实际上对 this 的解读,还是有一定规律的. 分析this,该如何下手呢?下面有一个函数 function show(){ alert(this); } ...
- TreeList
1.获取当前被选中的节点数据 string tmp = treeL.FocusedNode.GetDisplayText(this.treeListColumnIndex); 2.是否允许编辑 tre ...
- 《JavaScript高级程序设计 第3版》-学习笔记-3
P84-P137页, 这一章看的真久,这个月事太多了.有些内容在代码注释里没提出来了 1.JS强大的数组类型,元素类型任意,提供了非常多的操作数组的方法和属性 /* 数组类型 */ //stack v ...
- PHP的类自动加载机制
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来. 这个在小规模开发的时候,没什么大问题.但在大型的开发项目中, ...
- seajs配合spm应用之四弹出框
前面描述了 seajs的弹出遮罩层, 还没讲到弹出框, 这里接着把那几个例子介绍完. 目前已经有的工作是, 点击toggle按钮,可以弹出一个背投一样的暗灰色遮罩层, 主要的作用就是遮住当前页面上所有 ...
- 【技术贴】解决myeclipse SVN 提交代码 commit:remains in tree-c
[技术贴]解决myeclipse SVN 提交代码 commit:remains in tree-conflict错误的解决办法 错误是:Aborting commit: xxxxx' remains ...
- QT内置的ICON资源
QT内置的ICON资源保存在QStyle类里. 可以通过成员函数 QStyle::standardIcon 来获取. 保存的icon有: enum QStyle::StandardPixmap Thi ...
- 修改uCOS_II以实现“优先级+时间片”联合调度
本文在uCOS II上增加时间片任务调度的的原理: 对设置为同优先级的任务使用时间片调度,不同优先级任务仍然使用uCOS II的优先级调度策略.在同优先级任务的时间片调度中,所有任务暂时时间片长度固定 ...