Codeforces 1136E Nastya Hasn't Written a Legend 线段树
vp的时候没码出来。。
我们用set去维护, 每一块区域, 每块区域内的元素与下一个元素的差值刚好为ki,每次加值的时候我们暴力合并,
可以发现我们最多合并O(n)次。 然后写个线段树就没了。
- #include<bits/stdc++.h>
- #define LL long long
- #define fi first
- #define se second
- #define mk make_pair
- #define PLL pair<LL, LL>
- #define PLI pair<LL, int>
- #define PII pair<int, int>
- #define SZ(x) ((int)x.size())
- #define ull unsigned long long
- using namespace std;
- const int N = 1e5 + ;
- const int inf = 0x3f3f3f3f;
- const LL INF = 0x3f3f3f3f3f3f3f3f;
- const int mod = 1e9 + ;
- const double eps = 1e-;
- const double PI = acos(-);
- int n, q, val[N], k[N];
- LL prefix[N];
- set<PII> seg;
- char op[];
- LL a[N << ], add[N << ];
- #define lson l, mid, rt << 1
- #define rson mid + 1, r, rt << 1 | 1
- void push(int rt, int l, int mid, int r) {
- if(add[rt]) {
- a[rt << ] += add[rt] * (mid - l + );
- a[rt << | ] += add[rt] * (r - mid);
- add[rt << ] += add[rt];
- add[rt << | ] += add[rt];
- add[rt] = ;
- }
- }
- void build(int l, int r, int rt) {
- if(l == r) {
- a[rt] = val[l];
- return;
- }
- int mid = l + r >> ;
- build(lson); build(rson);
- a[rt] = a[rt << ] + a[rt << | ];
- }
- void update(int L, int R, LL val, int l, int r, int rt) {
- if(l >= L && r <= R) {
- a[rt] += val * (r - l + );
- add[rt] += val;
- return;
- }
- int mid = l + r >> ;
- push(rt, l, mid, r);
- if(L <= mid) update(L, R, val, lson);
- if(R > mid) update(L, R, val, rson);
- a[rt] = a[rt << ] + a[rt << | ];
- }
- LL query(int L, int R, int l, int r, int rt) {
- if(l >= L && r <= R) return a[rt];
- int mid = l + r >> ;
- push(rt, l, mid, r);
- if(R <= mid) return query(L, R, lson);
- else if(L > mid) return query(L, R, rson);
- else return query(L, R, lson) + query(L, R, rson);
- }
- int main() {
- scanf("%d", &n);
- for(int i = ; i <= n; i++) {
- scanf("%d", &val[i]);
- prefix[i] = prefix[i - ] + val[i];
- }
- for(int i = ; i < n; i++) scanf("%d", &k[i]);
- for(int i = ; i <= n; i++) seg.insert(mk(i, i));
- build(, n, );
- scanf("%d", &q);
- while(q--) {
- scanf("%s", op);
- if(op[] == '+') {
- int x, v; scanf("%d%d", &x, &v);
- auto sg = seg.upper_bound(mk(x, inf)); sg--;
- int L = sg->fi, R = sg->se;
- seg.erase(sg);
- if(L <= x - ) seg.insert(mk(L, x - ));
- update(x, R, v, , n, );
- while(R < n) {
- LL v1 = query(R, R, , n, );
- LL v2 = query(R + , R + , , n, );
- if(v1 + k[R] <= v2) break;
- LL add = v1 + k[R] - v2;
- auto sg = seg.lower_bound(mk(R + , R + ));
- update(sg->fi, sg->se, add, , n, );
- R = sg->se;
- seg.erase(sg);
- }
- seg.insert(mk(x, R));
- } else {
- int L, R; scanf("%d%d", &L, &R);
- printf("%lld\n", query(L, R, , n, ));
- }
- }
- return ;
- }
- /*
- */
Codeforces 1136E Nastya Hasn't Written a Legend 线段树的更多相关文章
- Codeforces 1136E - Nastya Hasn't Written a Legend - [线段树+二分]
题目链接:https://codeforces.com/problemset/problem/1136/E 题意: 给出一个 $a[1 \sim n]$,以及一个 $k[1 \sim (n-1)]$, ...
- Codeforces 1136E Nastya Hasn't Written a Legend (线段树教做人系列)
题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比如a[i]加上x之后, ...
- codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)
题目链接: http://codeforces.com/contest/1136/problem/E 题意: 初始有a数组和k数组 有两种操作,一,求l到r的区间和,二,$a_i\pm x$ 并且会有 ...
- [Codeforces 464E] The Classic Problem(可持久化线段树)
[Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路 ...
- Codeforces Round #244 (Div. 2) B. Prison Transfer 线段树rmq
B. Prison Transfer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/pro ...
- Codeforces Round #603 (Div. 2) E. Editor(线段树)
链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...
- Educational Codeforces Round 6 E. New Year Tree dfs+线段树
题目链接:http://codeforces.com/contest/620/problem/E E. New Year Tree time limit per test 3 seconds memo ...
- codeforces 893F - Physical Education Lessons 动态开点线段树合并
https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...
- Codeforces Round #530 (Div. 2) F (树形dp+线段树)
F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...
随机推荐
- $Django 客户端->wsgi->中间组件->urls->views(model,template) 总结+补充(事物,choices,inclusion_tag)!
1 HTTP协议:(重点) -请求 -请求首行 -GET /index HTTP/1.1 \r\n -请求头部 -key:value------>\r\n分割 _ke ...
- Windows Server 2008 R2 报错事件ID:10之WMI报错
问题描述: Details -Event filter with query "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHE ...
- 增加一台web机注意事项
2017年4月18日 15:23:57 星期二 增加一台web机时, 先不要挂载进lb 1. 需要将此机器的ip加入到其它服务的白名单内: 数据库, 缓存, 第三方接口等 2. 绑定hosts, 点点 ...
- 随机函数rand()和srand()
C++中随机函数rand()和srand()的用法 一.rand() 函数名: rand 功 能: 随机数发生器 用 法: int rand(void); 所在头文件: ...
- 腾讯云CVM之间配置免密钥登录
背景: 1客户A和B俩台主机之间需要实现免密钥登录,已绑定腾讯云申请的密钥对 系统:centos7.3 A:192.168.0.100 B:192.168.0.84 A主机的私钥文件:aaa B主机的 ...
- Android组件化demo实现以及遇坑分享
首先贴出demo的github地址:GitHub - TenzLiu/TenzModuleDemo: android组件化demo 作者:TenzLiu原文链接:https://www.jianshu ...
- Hibernatede 一对多映射配置
Hibernatede 一对多映射配置 以公司和员工为例:公司是一,员工是多 第一步 创建两个实体类,公司和员工 写核心配置文件hibernate.cfg.xml 写映 ...
- chkconfig: command not found
问题描述 Ubuntu 16.04 下安装 Nginx 服务器,在添加 nginx 服务时出现如下信息 # chkconfig --add nginx chkconfig: command not f ...
- numpy:dot与multiply
http://blog.csdn.net/iamzhangzhuping/article/details/52370241
- Netty多人聊天室
在简单聊天室的代码中修改ChatServerHandler类,就可以模拟多人聊天的功能 package com.cppdy.server; import io.netty.channel.Channe ...