题意及思路: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. OpenCV-Python cv2.imdecode()和cv2.imencode() 图片解码和编码

    cv2.imdecode()函数从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像. cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值 ...

  2. 使用Kali Linux执行中间人攻击(演示)

    中间人攻击也叫Man-In-The-Middle-Attack. 我假设你已经知道中间人攻击的基本概念,引用一段wikipedia: 中间人攻击(Man-in-the-middle attack,缩写 ...

  3. Python基本特殊方法之__new__

    __new__()和不可变对象 __new__方法的一个用途是初始化不可变对象,__new()__方法中允许创建未初始化的对象,这允许我们在__init__()方法被调用之前先设置对象的属性 例:为f ...

  4. bisect模块用于插入

    参考链接: chttp://www.cnblogs.com/skydesign/archive/2011/09/02/2163592.html水

  5. 【android】Socket简单用法

    Socket通常也称做”套接字“,用于描述IP地址和端口,废话不多说,它就是网络通信过程中端点的抽象表示.值得一提的是,Java在包java.net中提供了两个类Socket和ServerSocket ...

  6. 相对路径和绝对路径的区别,java获取项目访问路径的方法

    相对路径和绝对路径的区别 在HTML里只要涉及文件的地方(如超级链接.图片等)就会涉及绝对路径与相对路径的概念. .绝对路径 绝对路径是指文件在硬盘上真正存在的路径.例如“bg.jpg”这个图片是存放 ...

  7. android中状态栏透明

    设置 Acitivity 所在 window 的属性 @Override protected void onCreate(Bundle savedInstanceState) { super.onCr ...

  8. php end()

    end()的用法

  9. 工具软件集合 Adobe AE PS Pr CC 2018 2019 破解教程

    来源https://mp.weixin.qq.com/s/zeq1sTmaPsKt7Bsok0Ldrg(若链接失效,请关注软件安装管家公众号) 相关链接 Office 2019破解教程 Adobe 2 ...

  10. Oracle 索引扫描的几种情况

    index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行i ...