太神辣 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)的更多相关文章

  1. 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) 平衡树维护笛卡尔树+扫描线

    [BZOJ2658][Zjoi2012]小蓝的好友(mrx) Description 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的 ...

  2. 【BZOJ2658】[Zjoi2012]小蓝的好友(mrx) (扫描线,平衡树,模拟)

    题面 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小蓝确定了旅游路线后,小蓝的好友也不会浪费这个难得 ...

  3. @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ...

  4. BZOJ2658 ZJOI2012 小蓝的好友(treap)

    显然转化为求不包含关键点的矩形个数.考虑暴力,枚举矩形下边界,求出该行每个位置对应的最低障碍点高度,对其建笛卡尔树,答案即为Σhi*(slson+1)*(srson+1),即考虑跨过该位置的矩形个数. ...

  5. 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告

    P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...

  6. [ZJOI2012]小蓝的好友

    https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...

  7. BZOJ 2658 小蓝的好友

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2658 题意:给出一个n*m的格子.某些格子中有障碍.求包含至少一个障碍的矩形有多少 ...

  8. P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】

    正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 \(r*c\)的网格上有\(n\)个标记点,然后求有多少个矩形包含至少一个标记点. \(1\le ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. ubuntu 14.04 修改PS1提示符

    默认情况下,Ubuntu终端会输出完整路径,在路径名很长的时候,提示方式很不友好,通过以下步骤修改PS1变量的设置,可以让终端输出相对路径.类似于红帽系统的风格.修改思路:将w修改为W显示绝对路径,并 ...

  2. SPFA_YZOI 1662: Easy sssp

    题目描述 输入数据给出一个有N(2  < =  N  < =  1,000)个节点,M(M  < =  100,000)条边的带权有向图.  要求你写一个程序,  判断这个有向图中是 ...

  3. 有效解决js中添加border后动画bug问题

    做了个demo发现如果一个div不加border属性,用对象的offsetWidth属性来控制width没问题,但是如果一旦加了border属性,问题就来了. 其实offsetWidth属性获取的的是 ...

  4. mysql5.7.14安装与配置

    参考文章链接: http://jingyan.baidu.com/article/afd8f4de9006d934e286e9fd.html http://www.cnblogs.com/wenthi ...

  5. Struts面试笔记

    Struts2面试题1.struts2工作流程Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心控制器 ...

  6. [Linux]Ubuntu下如何将普通用户提升到root权限

    转至:http://jingyan.baidu.com/album/6181c3e0780131152ef153ff.html?picindex=0&qq-pf-to=pcqq.c2c  在u ...

  7. Mac Pro的HDMI接口与WI-FI可能存在冲突的解决方法

    当我将Mac Pro通过HDMI->DVI转接头接上一台显示器时,正在使用的WI-FI网络立马不能使用,重新连接网络也不行,但断开HDMI连接后,WI-FI立马恢复正常. 在网上查,在apple ...

  8. "Cannot convert value '0000-00-00' from column 2 to TIMESTAMP"mysql时间转换bug

    今天在项目中遇到这样的一个bug,Cannot convert value '0000-00-00' from column 2 to TIMESTAMP 仔细一查,经过http://blog.csd ...

  9. JSON取代XML?--JSON入门指南

    定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C# ...

  10. 关于mysql授权账号权限时的空密码问题

    -root ~]$ mysql -uroot -p Enter password:ERROR 1045 (28000): Access denied for user ‘root’@'localhos ...