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. P4752 Divided Prime

    P4752 Divided Prime 题目描述 给定一个数字 AA ,这个 AA 由 a_1,a_2,\cdots,a_Na 1 ​ ,a 2 ​ ,⋯,a N ​ 相乘得到. 给定一个数字 BB ...

  2. (转) 使用vivado创建工程 2

    Build the hardware platform and export to SDK A basic ARM hardware platform is now configured. The c ...

  3. OpenCV---轮廓发现

    推文:OpenCV-Python教程(11.轮廓检测) 轮廓发现 是基于图像边缘提取的基础,寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓的发现 相关API findContours 发现轮 ...

  4. LightOJ 1096 - nth Term 矩阵快速幂

    http://www.lightoj.com/volume_showproblem.php?problem=1096 题意:\(f(n)  = a * f(n-1) + b * f(n-3) + c, ...

  5. MongoDB常用方法

    一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...

  6. OWL库(叙词表构建本体OWL库)程序说明文档

    本体程序(叙词表转化OWL)及相关数据 程序已有资源:

  7. laravel artisan 工具心得

    介绍一些非常好用的命令: 1.创建一个Eloquent模型:顺便创建一个对应的数据库表 php artisan make:model --migration Models/Admin/test 2.将 ...

  8. 【洛谷P2015】二叉苹果树

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...

  9. CSS实现箭头效果

    有时候网页中使用箭头以增强效果,一般的做法是使用图片,今天我们使用CSSCSS来实现“箭头效果”,使用CSS我们必须兼容所有浏览器(IE6.7.8.9.10.+),Chrome,Firefox,Ope ...

  10. NEO发行资产Token

    NEO注册发行全局资产(Token 和 Share)功能已经在neo-gui里面集成,发行非常方便, 高级-注册资产 注册Token消耗GAS感人 4990 Gas 点击调用,获取交易ID为资产ID ...