uva 12003 Array Transformer (线段树套平衡树)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3154
题意是,要求求出区间中小于某个值的数有多少个,然后利用这个个数来更新某个点的值。
直接树套树解决问题,不过这题时间卡的比较紧。留心观察可以发现,询问的数目其实是比较小的,可是总的个数多大30W。如果是O(n*logn*logn)的复杂度建树就会超时,估计这里就是卡这一个了。其余的都不难,不过就是开始的时候没有看出可以卡时间卡这么紧,没有建树的经验,所以直接暴力插点,一直TLE。中间的时候sbt又写错了,为了debug个RE又搞了半天。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <set>
#include <cctype>
#include <cmath> using namespace std; #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define root 1, n, 1 const int N = ;
typedef long long LL; struct Node {
Node *c[];
int ky, sz;
void init(int k = ) {
ky = k;
sz = ;
c[] = c[] = NULL;
}
} node[N * ];
int ttnd; void init() { ttnd = ;} struct Treap {
Node *RT;
void init() { RT = NULL;}
int size() { return RT->sz;}
void make(int *arr, int l, int r, Node *&rt) {
if (l > r) return ;
if (l == r) {
rt = node + ttnd++;
rt->init(arr[l]);
return ;
}
int m = l + r >> ;
rt = node + ttnd++;
rt->init(arr[m]);
make(arr, l, m - , rt->c[]);
make(arr, m + , r, rt->c[]);
rt->sz = (rt->c[] ? rt->c[]->sz : ) + (rt->c[] ? rt->c[]->sz : ) + ;
}
void make(int *arr, int l, int r) {
init();
make(arr, l, r, RT);
}
void rotate(Node *&rt, bool l) {
bool r = !l;
Node *p = rt->c[l];
rt->c[l] = p->c[r];
p->c[r] = rt;
p->sz = rt->sz;
rt->sz = (rt->c[] ? rt->c[]->sz : ) + (rt->c[] ? rt->c[]->sz : ) + ;
rt = p;
}
void maintain(Node *&rt, bool r) {
if (!rt || !rt->c[r]) return ;
bool l = !r;
int ls = rt->c[l] ? rt->c[l]->sz : ;
if (rt->c[r]->c[r] && rt->c[r]->c[r]->sz > ls) {
rotate(rt, r);
} else if (rt->c[r]->c[l] && rt->c[r]->c[l]->sz > ls) {
rotate(rt->c[r], l), rotate(rt, r);
} else return ;
maintain(rt->c[], false);
maintain(rt->c[], true);
maintain(rt, false);
maintain(rt, true);
}
void insert(Node *&rt, Node *x) {
if (!rt) {
rt = x;
return ;
}
rt->sz++;
if (x->ky < rt->ky) insert(rt->c[], x);
else insert(rt->c[], x);
maintain(rt, x->ky >= rt->ky);
}
void insert(int k) {
Node *tmp = node + ttnd++;
tmp->init(k);
insert(RT, tmp);
}
void erase(Node *&rt, int k) {
if (!rt) return ;
rt->sz--;
if (k < rt->ky) erase(rt->c[], k);
else if (k > rt->ky) erase(rt->c[], k);
else {
if (!rt->c[] && !rt->c[]) rt = NULL;
else if (!rt->c[]) rt = rt->c[];
else if (!rt->c[]) rt = rt->c[];
else {
Node *t = rt->c[];
while (t->c[]) t = t->c[];
rt->ky = t->ky;
erase(rt->c[], t->ky);
}
}
if (rt) rt->sz = (rt->c[] ? rt->c[]->sz : ) + (rt->c[] ? rt->c[]->sz : ) + ;
}
void pre(Node *x) {
if (!x) return ;
cout << x << ' ' << x->c[] << ' ' << x->c[] << ' ' << x->ky << ' ' << x->sz << endl;
pre(x->c[]);
pre(x->c[]);
}
void erase(int k) { erase(RT, k);}
int find(Node *rt, int k) {
if (!rt) return ;
int ret = ;
if (k > rt->ky) ret = (rt->c[] ? rt->c[]->sz : ) + find(rt->c[], k) + ;
else ret = find(rt->c[], k);
return ret;
}
int lower_bound(int k) { return find(RT, k);}
} trp[N << ]; int pos[N], rec[N], ori[N];
void build(int l, int r, int rt) {
if (l == r) {
trp[rt].make(rec, l, r);
pos[l] = rt;
return ;
}
int m = l + r >> ;
build(lson);
build(rson);
sort(rec + l, rec + r + );
trp[rt].make(rec, l, r);
} void insert(int p, int x, int d) {
if (p <= ) return ;
trp[p].erase(d);
trp[p].insert(x);
insert(p >> , x, d);
} int query(int L, int R, int x, int l, int r, int rt) {
if (L <= l && r <= R) return trp[rt].lower_bound(x);
int m = l + r >> , ret = ;
if (L <= m) ret += query(L, R, x, lson);
if (m < R) ret += query(L, R, x, rson);
return ret;
} void scan(int &x) {
char ch;
while (!isdigit(ch = getchar())) ;
x = ch - '';
while (isdigit(ch = getchar())) x = x * + ch - '';
} int main() {
//freopen("in", "r", stdin);
int n, m, u;
while (~scanf("%d%d%d", &n, &m, &u)) {
init();
for (int i = ; i <= n; i++) {
scan(rec[i]);
ori[i] = rec[i];
}
build(root);
int L, R, v, p;
while (m--) {
scan(L), scan(R), scan(v), scan(p);
int k = query(L, R, v, root);
k = (LL) u * k / (R - L + );
insert(pos[p], k, ori[p]);
ori[p] = k;
}
for (int i = ; i <= n; i++) printf("%d\n", ori[i]);
}
return ;
}
——written by Lyon
uva 12003 Array Transformer (线段树套平衡树)的更多相关文章
- bzoj 2120 线段树套平衡树
先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- CF 19D - Points 线段树套平衡树
题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...
- BZOJ3196二逼平衡树——线段树套平衡树(treap)
此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...
- P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)
P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
- P3380 【模板】二逼平衡树(树套树) 线段树套平衡树
\(\color{#0066ff}{ 题目描述 }\) 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上 ...
- 树套树Day1线段树套平衡树bzoj3196
您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...
随机推荐
- 学习JDK1.8集合源码之--LinkedHashMap
1. LinkedHashMap简介 LinkedHashMap继承自HashMap,实现了Map接口. LinkedHashMap是HashMap的一种有序实现(多态,HashMap的有序态),可以 ...
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 不就是个最大匹配么. 结果WA得不行. 看TJ后发现题面上说了一旦没回答出一道题就结束 ...
- git 报错:没有权限 remote: error: unable to unlink old 'README.md' (Permission denied)
解决:
- ecshop二次开发之电子票
前台效果展示: 2. 3. 后台展示效果: 代码实现: 一. 添加菜单项:路径admin\includes\inc_menu.PHP $modules['18_ticket_m ...
- 【SDOI2017】套路总结
1 第一题是裸的反演: \[\begin{align} Ans&=\prod_{i=1}^n\prod_{j=1}^ma[(i,j)]\\ &=\prod_{d=1}^na[d]^{f ...
- font-family:黑体;导致css定义全部不起作用
css文件里font-family: "黑体";这句会导致后面的css定义全部不起作用了. 只要把font-family: "黑体"; 改成 font-fami ...
- Docker.[2].安装Docker.
Docker.[2].安装Docker. 学习Docker的时候,也是搜索了好多资料,捣鼓那些理论的东西.什么是镜像?什么是容器 ?特点?用途?.... 巴拉巴拉一大堆. 我这里不再讲述理论,只记录代 ...
- JQuery--动画队列以及清空队列.stop()方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 掀开SQL的神秘面纱,将优化进行到底
掀开SQL的神秘面纱,将优化进行到底 有这样一条奇怪的SQL,返回结果不足10行,逻辑读达到1.2w,存在索引却走多次全表扫描,如何揭开它神秘的面纱拯救系统性能,答案在这里,你不可错过! 本文来自上周 ...