CF992E Nastya and King-Shamans

题意翻译

给定一个序列 \(a_i\),记其前缀和序列为 \(s_i\),有 \(q\) 个询问,每次单点修改,询问是否存在一个 \(i\) 满足 \(a_i=s_{i-1}\),有多解输出任意一个,无解输出 \(-1\)。

输入输出格式

输入格式:

The first line contains two integers \(n\) and \(q\)

The second line contains n n integers \(a_{1},...,a_{n}\),where \(a_{i}\)is the magic power of the \(i\)-th shaman.

After that \(q\) lines follow, the \(i\) -th of them contains two integers \(p_{i}\) and \(x_{i}\)that mean that the new power of the \(p_{i}\).

输出格式:

Print \(q\) lines, the \(i\) -th of them should contain \(-1\) , if after the \(i\) -th change there are no shaman-kings, and otherwise a single integer \(j\) , where \(j\) is an index of some king-shaman after the \(i\) -th change.

If there are multiple king-shamans after each change, print the index of any of them.

数据范围

\(1 \le n,q \le 10^5,0 \le a_i \le 10^9,1 \le p_i \le n,0 \le x_i \le 10^9\)


注意一下数据范围,发现都是正整数。

所以前缀和按位置是不降的。

考虑一个暴力,找到每个\(a_i \ge s_{i-1}\)的位置,然后检查它是否合法。

考虑这样的一个位置最多有多少个,发现不超过\(log 10^9\),所以这个暴力复杂度是对的。

至于实现,可以线段树维护\(a_i-s_{i-1}\)的最大值,支持区间加全局查询就行了。


Code:

#include <cstdio>
#define ll long long
#define ls id<<1
#define rs id<<1|1
const int N=2e5+10;
ll max(ll x,ll y){return x>y?x:y;}
ll mx[N<<2],a[N],f[N],tag[N<<2],x;
int n,q;
void updata(int id){mx[id]=max(mx[ls],mx[rs]);}
void build(int id,int l,int r)
{
if(l==r)
{
mx[id]=a[l]-f[l-1];
return;
}
int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
updata(id);
}
void pushdown(int id)
{
if(tag[id])
{
tag[ls]+=tag[id],tag[rs]+=tag[id];
mx[ls]+=tag[id],mx[rs]+=tag[id];
tag[id]=0;
}
}
void change1(int id,int l,int r,int p,ll d)
{
if(l==r)
{
mx[id]+=d;
return;
}
pushdown(id);
int mid=l+r>>1;
if(p<=mid) change1(ls,l,mid,p,d);
else change1(rs,mid+1,r,p,d);
updata(id);
}
void change0(int id,int L,int R,int l,int r,ll d)
{
if(l>r) return;
if(l==L&&r==R)
{
tag[id]+=d,mx[id]+=d;
return;
}
pushdown(id);
int Mid=L+R>>1;
if(r<=Mid) change0(ls,L,Mid,l,r,d);
else if(l>Mid) change0(rs,Mid+1,R,l,r,d);
else change0(ls,L,Mid,l,Mid,d),change0(rs,Mid+1,R,Mid+1,r,d);
}
int query(int id,int l,int r)
{
if(l==r) return mx[id]==0?l:-1;
if(mx[id]<0) return -1;
pushdown(id);
int mid=l+r>>1;
int la=query(ls,l,mid);
return ~la?la:query(rs,mid+1,r);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%lld",a+i),f[i]=f[i-1]+a[i];
build(1,1,n);
for(int p,i=1;i<=q;i++)
{
scanf("%d%lld",&p,&x);
change0(1,1,n,p+1,n,a[p]-x);
change1(1,1,n,p,x-a[p]);
a[p]=x;
printf("%d\n",query(1,1,n));
}
return 0;
}

2018.10.9

CF992E Nastya and King-Shamans 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. P3366 最小生成树【模板+Kruscal讲解】

    此题数组大小非常重要 算法过程: 现将全部边按照权值(由小到大)排序. 按顺序(同上)考虑每条边,只要这条边和之前已选择的边不构成圈,就保留这条边,否则放弃这条边. 具体算法 成功选择(n-1)条边后 ...

  2. Go单元测试与基准测试

    Go单元测试 Go单元测试框架,遵循规则整理如下: 1.文件命名规则: 含有单元测试代码的go文件必须以_test.go结尾,Go语言测试工具只认符合这个规则的文件 单元测试文件名_test.go前面 ...

  3. Java高并发之同步异步

    1.概念理解: 2.同步的解决方案: 1).基于代码 synchronized 关键字 修饰普通方法:作用于当前实例加锁,进入同步代码前要获得当前实例的锁. 修饰静态方法:作用于当前类对象加锁,进入同 ...

  4. React路由-进阶篇

    路由进阶 1.多级路由,和之前的思想一样,在子路由里面继续写Route,继续挂载组件,就可以实现多级路由 比如这样:class Food extends Component{ render() { r ...

  5. 《Redis设计与实现》- 复制

    在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡灯需求.Redis提供了复制功能,实现了相同数据多个副本,复制功能作是高可用Redis的基础,深入理解复制 ...

  6. C语言数组篇(二)指针数组和数组指针

    数组指针 和 指针数组         这两个名词可以说是经常搞混了         数组指针--> 数组的指针       就是前面讲的 指向数组a的指针p;         指针数组--&g ...

  7. Choosing Capital for Treeland CodeForces - 219D (树形DP)

    传送门 The country Treeland consists of n cities, some pairs of them are connected with unidirectional  ...

  8. Poweroj:来自学长的善意:ZQ的杀龙之旅(状压BFS)

    传送门:https://www.oj.swust.edu.cn/problem/show/2794 来自学长的善意:ZQ的杀龙之旅 Time Limit: 15000 MS Memory Limit: ...

  9. 笔记-mysql-管理及基础操作

    笔记-mysql使用-管理及基础操作 1.      简介 mysql是一个免费的关系型数据库,不过好像被oracle收购了.... 希望它继续免费. 1.1.    相关术语 数据库,表,列,行,冗 ...

  10. 一个比较良好的flask项目结构

    一个比较良好的flask项目结构 project/ app/                    # 整个程序的包目录 static/                 # 静态资源文件 js/    ...