题意及思路:https://www.cnblogs.com/TinyWong/p/10400682.html

代码:

#include <bits/stdc++.h>
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
#define LL long long
#define db long double
#define INF 1e15;
using namespace std;
const int maxn = 200010;
LL t[maxn * 2];
LL add[maxn * 2];
map<LL, int> mp;
int m;
db ans, v;
struct OP{
LL id, x, y, z;
};
OP op[maxn];
set<int> s;
set<int>::iterator it, it1, it2;
struct SegmentTree {
LL sum, lsum, Set;
int l, r;
bool flag;
};
SegmentTree tr[maxn * 4];
void pushup(int o) {
tr[o].sum = tr[ls(o)].sum + tr[rs(o)].sum;
tr[o].lsum = min(tr[ls(o)].lsum, tr[ls(o)].sum + tr[rs(o)].lsum);
}
void maintain(int o, LL val) {
tr[o].sum = val * (t[tr[o].r + 1] - t[tr[o].l]);
tr[o].lsum = min(0ll, tr[o].sum);
tr[o].Set = val;
tr[o].flag = 1;
}
void pushdown(int o) {
if(tr[o].flag) {
maintain(ls(o), tr[o].Set);
maintain(rs(o), tr[o].Set);
tr[o].flag = 0;
}
}
void build(int o, int l, int r) {
tr[o].l = l, tr[o].r = r;
if(l == r) {
tr[o].flag = 0;
tr[o].sum = 0;
tr[o].lsum = 0;
return;
}
int mid = (l + r) >> 1;
build(ls(o), l, mid);
build(rs(o), mid + 1, r);
pushup(o);
}
void update(int o, int l, int r, int ql, int qr, LL val) {
if(l >= ql && r <= qr) {
maintain(o, val);
return;
}
pushdown(o);
int mid = (l + r) >> 1;
if(ql <= mid) update(ls(o), l, mid, ql, qr, val);
if(qr > mid) update(rs(o), mid + 1, r, ql, qr, val);
pushup(o);
}
void query(int o, int l, int r, int ql, int qr) {
if(ql > qr) return;
if(l == r) {
if(tr[o].lsum + v > 0) {
v += tr[o].sum;
return;
}
db tmp = v / (-((db)tr[o].Set));
if(tmp <= 0 || (tmp + t[l] > t[qr + 1])) {
v += tr[o].sum;
return;
}
ans = tmp + (db)t[l];
return;
}
pushdown(o);
int mid = (l + r) >> 1;
if(l >= ql && r <= qr) {
if(tr[o].lsum + v > 0) {
v += tr[o].sum;
return;
}
if(v + tr[ls(o)].lsum <= 0) {
query(ls(o), l, mid, ql, qr);
if(ans != -1) return;
}
v += tr[ls(o)].sum;
if(v + tr[rs(o)].lsum <= 0) {
query(rs(o), mid + 1, r, ql, qr);
if(ans != -1) return;
}
v += tr[rs(o)].sum;
return;
}
if(ql <= mid) query(ls(o), l, mid, ql, qr);
if(ans != -1) return;
if(qr > mid) query(rs(o), mid + 1, r, ql, qr);
}
int main() {
int n;
scanf("%d", &n);
int cnt = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld", &op[i].id);
if(op[i].id == 1) {
scanf("%lld%lld", &op[i].x, &op[i].y);
t[++cnt] = op[i].x;
} else if(op[i].id == 2) {
scanf("%lld", &op[i].x);
t[++cnt] = op[i].x;
} else {
scanf("%lld%lld%lld", &op[i].x, &op[i].y, &op[i].z);
t[++cnt] = op[i].x;
t[++cnt] = op[i].y;
}
}
sort(t + 1, t + 1 + cnt);
m = unique(t + 1, t + 1 + cnt) - (t + 1);
for (int i = 1; i <= m; i++) {
mp[t[i]] = i;
}
t[m + 1] = 1e9 + 1;
t[0] = 0;
build(1, 1, m);
s.insert(m + 1);
s.insert(0);
for (int i = 1; i <= n; i++) {
if(op[i].id == 1) {
s.insert(mp[op[i].x]);
it = s.lower_bound(mp[op[i].x]);
it++;
update(1, 1, m, mp[op[i].x], (*it) - 1, op[i].y);
add[mp[op[i].x]] = op[i].y;
} else if(op[i].id == 2) {
it = s.lower_bound(mp[op[i].x]);
it1 = it, it2 = it;
it1--, it2++;
int num;
if((*it1) == 0) {
num = 1;
} else {
num = (*it1);
}
update(1, 1, m, num, (*it2) - 1, add[num]);
add[*it] = 0;
s.erase(it);
} else {
ans = -1;
v = op[i].z;
if(v == 0) {
printf("%d\n", op[i].x);
continue;
}
it = s.lower_bound(mp[op[i].x]);
query(1, 1, m, *it, mp[op[i].y] - 1);
printf("%.10Lf\n", ans);
}
}
}

  

Codeforces 1109C 线段树的更多相关文章

  1. Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论

    Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...

  2. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 831E) - 线段树 - 树状数组

    Vasily has a deck of cards consisting of n cards. There is an integer on each of the cards, this int ...

  3. Codeforces 938G 线段树分治 线性基 可撤销并查集

    Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...

  4. codeforces 1136E 线段树

    codeforces 1136E: 题意:给你一个长度为n的序列a和长度为n-1的序列k,序列a在任何时候都满足如下性质,a[i+1]>=ai+ki,如果更新后a[i+1]<ai+ki了, ...

  5. Z - New Year Tree CodeForces - 620E 线段树 区间种类 bitset

    Z - New Year Tree CodeForces - 620E 这个题目还没有写,先想想思路,我觉得这个题目应该可以用bitset, 首先这个肯定是用dfs序把这个树转化成线段树,也就是二叉树 ...

  6. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  7. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路

    B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...

  8. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  9. Linear Kingdom Races CodeForces - 115E (线段树优化dp)

    大意: n条赛道, 初始全坏, 修复第$i$条花费$a_i$, m场比赛, 第$i$场比赛需要占用$[l_i,r_i]$的所有赛道, 收益为$w_i$, 求一个比赛方案使得收益最大. 设$dp[i]$ ...

随机推荐

  1. POJ 1265 Area (pick定理)

    题目大意:已知机器人行走步数及每一步的坐标变化量,求机器人所走路径围成的多边形的面积.多边形边上和内部的点的数量. 思路:叉积求面积,pick定理求点. pick定理:面积=内部点数+边上点数/2-1 ...

  2. Windows操作系统及其安全机制

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html Windows操作系统及其安全机制 Windows文件系统 FAT (F ...

  3. 【转】IUSR和IIS_IUSRS

    转自:http://blog.chinaunix.net/uid-20344928-id-3306130.html   概述   在早期的IIS版本中,随着IIS的安装,系统会创建一个IUSR_Mac ...

  4. NSArray倒序输出的方法

    NSMutableArray *array = [NSMutableArray arrayWithObjects:",nil]; NSArray* reversedArray = [[arr ...

  5. 记一次愚蠢的gradle操作

    今晚把工作移植到mac平台,在用gradle命令 exec ./gradlew --parallel --info assembleDebug 打包apk时卡住,gradle一直处于下载状态,过了几分 ...

  6. java里监听相关ActionListene的理解。========此代码是错误的,

    package com.aa; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event. ...

  7. 求小球反弹高度,及落地过程中经过的路程~~~java代码

    总结:这种思想,不是一想就突然出现在脑海里的 package com.c2; //题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半: //再落下,求它在 第10次落地时,共经过多少米?第 ...

  8. python开发函数进阶:递归函数

    一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 #!/usr/bin/env p ...

  9. maven学习1

     1.Maven的约定 src/main/java: 存放项目的java文件. src/main/resources: 存放项目的资源文件,如spring,hibernate的配置文件. src/te ...

  10. 基于angularJs+ui-router+bootstrap风格的表格生成指令

    1 /** 根据参数定制表格 * api接口: * form-model:[item1,item2,item3] * form-properties:[ * {key:'',label:'',thCl ...