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. hexo搭建个人博客

    本文讲述如何用`hexo`搭建个人博客,并托管到`github`.不需要租赁服务器,可完成网站博客的搭建. 安装Hexo安装hexo之前,要先下载安装Node.js和Git,百度搜索找到下载即可.[G ...

  2. STL源码分析-hashtable

    http://note.youdao.com/noteshare?id=5c8d2b09c0f72af9a12b0ed2023a338d

  3. grep index.php *

    zb@zb-computer:/usr/local/nginx/conf/vhost$ grep index.php * caomall17.conf: index index.html index. ...

  4. fastjson的@JSONField注解的一点问题

    @JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是 ...

  5. LintCode 373: Partition Array

    LintCode 373: Partition Array 题目描述 分割一个整数数组,使得奇数在前偶数在后. 样例 给定[1, 2, 3, 4],返回[1, 3, 2, 4]. Thu Feb 23 ...

  6. 【BZOJ】1492: [NOI2007]货币兑换Cash

    [题意]初始资金s,有两种金券A和B,第i天,买入时将投入的资金购买比例为rate[i]的两种股票,卖出时将持有的一定比例的两种股票卖出,第i天股票价格为A[i],B[i],求最大获利.n<=1 ...

  7. 洛谷 1.5.1 Number Triangles 数字金字塔

    Description 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 ...

  8. 在Unity中实现屏幕空间阴影(1)

    接着上篇文章,我们实现了SSR效果. 其中的在屏幕空间进行光线追踪的方法是通用的.借此我们再实现一种屏幕空间的效果,即屏幕空间阴影. 文中的图片来自Catlike coding http://catl ...

  9. WebStorm 2016激活

    最近在网上找到一个激活webStorm 的好东西.博主说对jetbrains下的所有产品都是可以用这种方式激活的...如:PhpStorm,IntelliJ JDEA等. 但别的产品我没有试过.对于w ...

  10. Java简单爬虫(一)

    简单的说,爬虫的意思就是根据url访问请求,然后对返回的数据进行提取,获取对自己有用的信息.然后我们可以将这些有用的信息保存到数据库或者保存到文件中.如果我们手工一个一个访问提取非常慢,所以我们需要编 ...