E - Nastya and King-Shamans

题目大意:有n个数,每一次操作更改一个数,每次操作之后问你是否有一个数等于其前面所有数的和。

思路:好题,想了很久没想出来,看了题解,主要思想就是满足条件的数会成倍增长,如我们知道了

1 - i 里面没有满足条件的数, 那么我们找一个最小的 j 满足 a[ j ] >= sum(1, i),j就可能成为一个答案,

我们check一下,如果可以就是这个点,如果不行那么 不可能前缀就从 1 - i 变成了 1 - j, 这个过程最多

执行log(max(a[ i ])) 次, 因为前缀和每次操作至少×2,这样我们用线段树维护区间和,区间最大值就好了。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int> using namespace std; const int N = 2e5 + ;
const int M = 1e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +; LL mx[N << ], sum[N << ];
int n, q; void update(int pos, int v, int l, int r, int rt) {
if(l == r) {
sum[rt] = v;
mx[rt] = v;
return;
}
int mid = l + r >> ;
if(pos <= mid) update(pos, v, l, mid, rt << );
else update(pos, v, mid + , r, rt << | );
sum[rt] = sum[rt << ] + sum[rt << | ];
mx[rt] = max(mx[rt << ], mx[rt << | ]);
} LL getSum(int L,int R, int l, int r, int rt) {
if(l >= L && r <= R) return sum[rt];
int mid = l + r >> ;
LL ans = ;
if(L <= mid) ans += getSum(L, R, l, mid, rt << );
if(R > mid) ans += getSum(L, R, mid + , r, rt << | );
return ans;
} void getMxId(int L, int R, LL v, int l, int r, int rt, LL &ret, LL &id) {
if(mx[rt] < v || id != -) return;
if(l == r) {
id = l;
ret = mx[rt];
return;
}
int mid = l + r >> ;
if(L <= mid) getMxId(L, R, v, l, mid, rt << , ret ,id);
if(R > mid) getMxId(L, R, v, mid + , r, rt << | , ret, id);
} int cal() {
if(getSum(, , , n, ) == ) return ;
int now = ;
while(now < n) {
LL sum = getSum(, now, , n, ), ret = -, id = -;
getMxId(now + , n, sum, , n, , ret, id);
if(id == -) return -;
sum = getSum(, id - , , n, );
if(sum == ret) return id;
now = id;
}
return -;
} int main() {
scanf("%d%d", &n, &q);
for(int i = ; i <= n; i++) {
int x; scanf("%d", &x);
update(i, x, , n, );
}
while(q--) {
int pos, v; scanf("%d%d", &pos, &v);
update(pos, v, , n, );
printf("%d\n", cal());
}
return ;
}
/*
*/

最新文章

  1. C++小常识笔记
  2. Java设计模式6:策略模式
  3. 6-03使用SQL语句一次型向表中插入多行数据
  4. AngularJs记录学习04
  5. Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)
  6. 探索Gallery和ImageSwitcher布局
  7. thinkphp无法加载控制器:Admin
  8. Docker学习笔记 - Docker容器与外部网络的连接
  9. 3.11formdata的使用
  10. SpringMVC Controller 返回值几种类型
  11. 浅谈深度优先和广度优先(scrapy-redis)
  12. ege demo
  13. Foundation-NSRunLoop
  14. Mac 安装 Ruby, Rails 运行环境
  15. js中实现对checkbox选中和取消
  16. 安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)
  17. Linux less/more命令详解
  18. ie上画圆饼图
  19. kubernetes 入门学习
  20. XAF-如何调整按钮的显示顺序

热门文章

  1. angular 使用rxjs 监听同级兄弟组件数据变化
  2. python自学笔记(一)
  3. [大数据可视化]-saiku的源码打包运行/二次开发构建
  4. ASP.NET 使用ajaxupload.js插件出现上传较大文件失败的解决方法
  5. [转]hadoop2.x常用端口
  6. 介绍 JSON (转)
  7. JVM调优总结(4):分代垃圾回收
  8. form表单token错误
  9. 天梯赛 L2-006 树的遍历 (二叉树)
  10. 一键切图 PS 动作 【收藏】