Codeforces Round #489 (Div. 2) 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的更多相关文章
- Codeforces Round #489 (Div. 2) E. Nastya and King-Shamans(线段树)
题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) , 现在会进行 \(m\) 次操作 , 每次操作会修改某个 \(a_i\) 的值 , 在每次操作完后你需要判断是否存在一个位置 \(i ...
- 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 ...
- Codeforces Round #489 (Div. 2)
A. Nastya and an Array time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D
失踪人口突然回归……orz.题解还是有必要写的,虽然估计只有自己(?自己也不一定看得懂)看得懂. 题目链接:http://codeforces.com/contest/992/problem/D 题目 ...
- Codeforces Round #546 (Div. 2) B. Nastya Is Playing Computer Games
链接:https://codeforces.com/contest/1136/problem/B 题意: 有n个井盖,每个井盖上有一个小石头. 给出n和k,k表示刚开始在第k个井盖上方. 有三种操作, ...
- 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)是遍历过的 ...
- Codeforces Round #489 (Div. 2) B、C
B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...
- [Codeforces]Codeforces Round #489 (Div. 2)
Nastya and an Array 输出有几种不同的数字 #pragma comment(linker, "/STACK:102400000,102400000") #ifnd ...
- Codeforces Round #546 (Div. 2)-D - Nastya Is Buying Lunch
这道题,神仙贪心题... 题意就是我给出数的顺序,并给出多个交换,每个只能用于相邻交换,问最后一个元素,最多能往前交换多少步. 我们考虑这样一个问题,如果一个这数和a[n]发生交换,那么这个数作为后面 ...
随机推荐
- 使用 ant 构建的一个例子
在项目根目录下新建一个 build.xml 文件,内容如下: <?xml version="1.0"?> <project name="javatest ...
- [LeetCode] 数学计算模拟类问题:加法,除法和幂,注意越界问题。题 剑指Offer,Pow(x, n) ,Divide Two Integers
引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0 ...
- 覆盖equals时总要覆盖hashCode
本文涉及到的概念 1.为什么重载equals方法时,要重载hashCode函数;没有重载hashCode带来的问题 2.一个对象hashCode的生成规则 1.为什么重载equals方法时 ...
- [acmm week12]染色(容斥定理+组合数+逆元)
1003 染色 Time Limit: 1sec Memory Limit:256MB Description 今天离散数学课学了有关树的知识,god_v是个喜欢画画的人,所以他 ...
- 【vijos】P1190 繁忙的都市
[算法]最小生成树 #include<cstdio> #include<algorithm> using namespace std; ; ]; int fa[maxn],he ...
- 自定义li项目符号
使用background-image属性 先清除ul的默认list-style ul{ list-style:none } li{ background-image:url('./image/symb ...
- python并发编程之threading线程(一)
进程是系统进行资源分配最小单元,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.进程在执行过程中拥有独立的内存单元,而多个线程共享内存等资源. 系列文章 py ...
- (转)USB协议简介
USB协议简介 USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定.协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org). 为了理解协议 ...
- 使用 Xtrabackup 在线对MySQL做主从复制【转】
1. 说明 1.1 xtrabackup mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷.一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldu ...
- linux系统磁盘挂载
1.查看系统磁盘挂载情况 fdisk -l 2.格式化磁盘 mkfs -t ext3 /dev/sdb 3.挂在磁盘 mount /dev/sdb /disk2 4.查看磁盘挂载情况 df -h 5. ...