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 (线段树套平衡树)的更多相关文章

  1. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

  2. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  3. CF 19D - Points 线段树套平衡树

    题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...

  4. BZOJ3196二逼平衡树——线段树套平衡树(treap)

    此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...

  5. P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)

    P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...

  6. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  7. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

  8. P3380 【模板】二逼平衡树(树套树) 线段树套平衡树

    \(\color{#0066ff}{ 题目描述 }\) 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上 ...

  9. 树套树Day1线段树套平衡树bzoj3196

    您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查 ...

随机推荐

  1. 从Java到C++——union的使用方法

    版权声明:本文为博主原创文章,未经博主同意不得用于不论什么商业用途,转载请注明出处. https://blog.csdn.net/luoweifu/article/details/33342965 你 ...

  2. day36 06-Hibernate抓取策略:set集合上的抓取策略

    你在做查询的时候它可以帮你关联出它的一些相应的关联对象.那么它关联这个对象的时候是在什么时候发送的这些语句以及它是如何把这些数据拿出来的? 知道延迟检索是怎么回事了,而且它也能够产生这个代理对象.当你 ...

  3. js实现使用递归来计算1~任意数字的和

    function getSum(n){ if(n==1){ return 1; } return n+getSum(n-1); } var res = getSum(100); console.log ...

  4. Mysql 5.7.17安装后登录mysql的教程方法

    在运行 ./bin/mysqld Cinitialize 初始化数据库时,会生成随机密码,示例: [Note] A temporary password is generated for root@l ...

  5. Ubuntu上更换163源 - Mars Loo的博客

    转载*请注明原始出处:http://blog.csdn.net/a464057216/article/details/50865895 先备份源/etc/apt/sources.list为source ...

  6. PHP 学习1.2

    1. 流程控制 <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv=& ...

  7. C++学习笔记(1)-构造函数与析构函数

    1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象. 2.若没有提供任何构造函数,那么c++自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而 ...

  8. SQL优化系列(三)- 用最少的索引获得最大的性能提升

    从全局出发优化索引 对于高负载的数据库,如何创建最少的索引,让数据库的整体性能提高呢?例如,对于100 条SQL语句,如何创建最佳的5条索引? SQL自动优化工具SQL Tuning Expert P ...

  9. PLAY2.6-SCALA(十一) 模板常用场景

    1.布局 声明一个views/main.scala.html模板作为主布局模板 @(title: String)(content: Html) <!DOCTYPE html> <ht ...

  10. 想要快速完成一个Python项目,离不开这些开源库

    链接:https://opensource.com/article/18/9/python-libraries-side-projects 在Python / Django世界中有一句话:我们为语言而 ...