题意及思路: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. 前端之css样式02

    一.float属性 block元素通常被现实为独立的一块,独占一行,多个block元素会各自新起一行,默认block元素宽度自动填满其父元素宽度.block元素可以设置width.height.mar ...

  2. [QT][转载]Qt:使用C++还是QML

    From: http://blog.csdn.net/rl529014/article/details/51378734 本质上,Qt 是一个C++类库.在引入 QML 以前,所有的开发都是基于 C+ ...

  3. 【MFC】VC界面绘制双缓存

    VC界面绘制双缓存 转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/11/20/2255811.html 1.闪屏的问题在GDI的绘图 ...

  4. linux之管道

    1. 进程间通信概述 进程是一个独立的资源分配单元,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源.进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要 ...

  5. jstl中的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者 ...

  6. 快速沃尔什变换FWT

    快速沃尔什变换\(FWT\) 是一种可以快速完成集合卷积的算法. 什么是集合卷积啊? 集合卷积就是在集合运算下的卷积.比如一般而言我们算的卷积都是\(C_i=\sum_{j+k=i}A_j*B_k\) ...

  7. test20181219 连续段的期望

    题意 连续段的期望 [问题描述] 小N最近学习了位运算,她发现2个数xor之后数的大小可能变大也可能变小,and之后都不会变大,or之后不会变小.于是她想算出以下的期望值:现在有 N个数排成一排,如果 ...

  8. openfaas k8s 集成

    备注 k8s 1.6 以下版本与k8s 1.6 以上版本会有一些简单的区别 1. 克隆k8s  部署文档   https://github.com/openfaas/faas-netes   2. 创 ...

  9. as3随机数

    for(var i:int = 0;i<100;i++){    trace(Math.floor(Math.random()*3)); } Math.floor(Math.random()*3 ...

  10. 自定义标签库_tag

    1)最简单的标签库 1,继承Tag接口,重写doEndTag()方法,返回类型不同后面流程不一样 想要jsp的内容必须重写了setPageContent()方法 再JspWriter out = pa ...