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 ;
}
/*
*/

Codeforces Round #489 (Div. 2) E - Nastya and King-Shamans的更多相关文章

  1. Codeforces Round #489 (Div. 2) E. Nastya and King-Shamans(线段树)

    题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) , 现在会进行 \(m\) 次操作 , 每次操作会修改某个 \(a_i\) 的值 , 在每次操作完后你需要判断是否存在一个位置 \(i ...

  2. Codeforces Round #546 (Div. 2) C. Nastya Is Transposing Matrices

    C. Nastya Is Transposing Matrices time limit per test 1 second memory limit per test 256 megabytes i ...

  3. Codeforces Round #489 (Div. 2)

    A. Nastya and an Array time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. 【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D

    失踪人口突然回归……orz.题解还是有必要写的,虽然估计只有自己(?自己也不一定看得懂)看得懂. 题目链接:http://codeforces.com/contest/992/problem/D 题目 ...

  5. Codeforces Round #546 (Div. 2) B. Nastya Is Playing Computer Games

    链接:https://codeforces.com/contest/1136/problem/B 题意: 有n个井盖,每个井盖上有一个小石头. 给出n和k,k表示刚开始在第k个井盖上方. 有三种操作, ...

  6. Codeforces Round #546 (Div. 2) A. Nastya Is Reading a Book

    链接:https://codeforces.com/contest/1136/problem/A 题意: 给n个区间,每个区间范围不超过100,n不超过100. 给一个位置k,1-(k-1)是遍历过的 ...

  7. Codeforces Round #489 (Div. 2) B、C

    B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...

  8. [Codeforces]Codeforces Round #489 (Div. 2)

    Nastya and an Array 输出有几种不同的数字 #pragma comment(linker, "/STACK:102400000,102400000") #ifnd ...

  9. Codeforces Round #546 (Div. 2)-D - Nastya Is Buying Lunch

    这道题,神仙贪心题... 题意就是我给出数的顺序,并给出多个交换,每个只能用于相邻交换,问最后一个元素,最多能往前交换多少步. 我们考虑这样一个问题,如果一个这数和a[n]发生交换,那么这个数作为后面 ...

随机推荐

  1. Qt ------ 设置透明度

    void setWindowOpacity(qreal level);   //设置所有控件的不透明度 setAttribute(Qt::WA_TranslucentBackground);   // ...

  2. ubuntu环境下添加中文输入法

    1.下载软件包 打开终端,输入命令 sudo apt-get install fcitx-table-wbpy 2.打开 system settings-> language support-& ...

  3. NOIP模拟1

    期望得分:100+100+100=300 实际得分:94+96+97=287 T1  #6090. 「Codeforces Round #418」尘封思绪 #include<cstdio> ...

  4. sql分页demo

    ALTER proc [dbo].[ProcGetUserInfoPageInfoByUserName] ), @PageIndex int, @PageSize int as Begin selec ...

  5. Shiro实战教程(一)

    Shiro完整架构图 Shiro认证过程 Shiro授权的内部处理机制 Shiro 支持三种方式的授权 1.编程式:通过写if/else 授权代码块完成: Subject subject = Secu ...

  6. jQuery.Event的一些用法

    直接写用法 //创建一个事件 var event = $.Event("事件类型",["定义的事件参数最终将出现在e1中"]); //绑定一个处理器 $(obj ...

  7. 16级第二周寒假作业H题

    快速幂(三) TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 计算( AB ...

  8. HTML表单属性与全局属性

    1.全局属性

  9. linux的curl用法【转】

    每分钟访问云签到任务执行页面.顺便记录了下curl的用法.以下内容摘自阮一峰博客. 一.查看网页源码 直接在curl命令后加上网址,就可以看到网页源码.我们以网址www.sina.com为例(选择该网 ...

  10. RAID总结

    RAID-0: 这种模式若使用相同型号容量的磁盘来组成效果最佳.这种模式RAID会先将磁盘切出等量的区块chunk,当文件要存入RAID时先按照chunk的大小切割好,再依次存放到各个磁盘中去,由于磁 ...