Codeforces 1109C 线段树
题意及思路: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 线段树的更多相关文章
- Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论
Bash and a Tough Math Puzzle CodeForces 914D 线段树+gcd数论 题意 给你一段数,然后小明去猜某一区间内的gcd,这里不一定是准确值,如果在这个区间内改变 ...
- 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 ...
- Codeforces 938G 线段树分治 线性基 可撤销并查集
Codeforces 938G Shortest Path Queries 一张连通图,三种操作 1.给x和y之间加上边权为d的边,保证不会产生重边 2.删除x和y之间的边,保证此边之前存在 3.询问 ...
- codeforces 1136E 线段树
codeforces 1136E: 题意:给你一个长度为n的序列a和长度为n-1的序列k,序列a在任何时候都满足如下性质,a[i+1]>=ai+ki,如果更新后a[i+1]<ai+ki了, ...
- Z - New Year Tree CodeForces - 620E 线段树 区间种类 bitset
Z - New Year Tree CodeForces - 620E 这个题目还没有写,先想想思路,我觉得这个题目应该可以用bitset, 首先这个肯定是用dfs序把这个树转化成线段树,也就是二叉树 ...
- D - The Bakery CodeForces - 834D 线段树优化dp···
D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...
- B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...
- CodeForces 343D 线段树维护dfs序
给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...
- Linear Kingdom Races CodeForces - 115E (线段树优化dp)
大意: n条赛道, 初始全坏, 修复第$i$条花费$a_i$, m场比赛, 第$i$场比赛需要占用$[l_i,r_i]$的所有赛道, 收益为$w_i$, 求一个比赛方案使得收益最大. 设$dp[i]$ ...
随机推荐
- windows C++ 全局异常捕捉函数
windows 核心编程中讲过 SEH 结构化异常处理 ::SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); LONG WINAPI M ...
- 【前端】HTML入门笔记
教程 HTML 指的是超文本标记语言 (Hyper Text Markup Language).使用标记标签来描述网页 HTML 提示:使用小写标签\属性\属性参考手册\HTML颜色\HTML颜色名 ...
- [转载] ffmpeg摄像头视频采集-采集步骤概述并采集一帧视频
近期由于工作任务,需要开发一个跨平台视频聊天系统,其中就用到了ffmpeg进行采集与编码,网上找了一大堆的资料,虽然都有一些有用的东西,但实在太碎片化了,这几天一直在整理和实验这些资料,边整理,边做一 ...
- window.top.location
window.top.location的作用 top, 表示是顶层页面, 因为页面之中可能嵌入了 frame 等子页面,top表示最外面一层 Html代码 <html> <hea ...
- 剑指offer-第六章面试中的各项能力(数字在排序数组中出现的次数)
题目:统计一个数字在排序数组中出现的次数. 思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置.两者做减法运算再加1.时间复杂度为O(logn) Java代码: // ...
- LOJ2823 「BalticOI 2014 Day 1」三个朋友
题意 给定一个字符串 S,先将字符串 S 复制一次(变成双倍快乐),得到字符串 T,然后在 T 中插入一个字符,得到字符串 U. 给出字符串 U,重新构造出字符串 S. 所有字符串只包含大写英文字母. ...
- Hadoop体系结构之 Mapreduce
MR框架是由一个单独运行在主节点上的JobTracker和运行在每个集群从节点上的TaskTracker共同组成.主节点负责调度构成一个作业的所有任务,这些任务分布在不同的不同的从节点上.主节点监视它 ...
- Java面试题:栈和队列的实现
面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要 ...
- Terracotta设计原理分析--(部分内容来自官方描述)
因为工作中历史产品采用了terracotta作为分布式缓存线性扩展平台,因此不得不提前对其原理做了相关了解,当然其中很多的设计思想和oracle.memcached的设计相似,但也有自己的亮点,那就是 ...
- 最长的回文串——hdu3068
http://acm.hdu.edu.cn/showproblem.php?pid=3068 abcba 5 aab 2 在一个字符串里寻找一条最长的回文串 比较直接的想法是枚举中心点 然后像两边扩散 ...