首页 > 其他分享 >CF992E 题解

CF992E 题解

时间:2023-08-13 19:23:34浏览次数:54  
标签:tmp 满足条件 cur Lg int 题解 CF992E

CF992E 题解

传送门 更好的阅读体验


简化题意:单点修改,设序列的前缀和序列是 $s_i$,查询是否存在一个 $i$ 满足 $a_i=s_{i-1}$。

思路:


观察满足条件的数的个数。在不考虑 $0$ 的情况下,如果一个 $a_i$ 满足条件,那么对于一个比他小的满足条件的数 $a_j$,一定会有 $a_j=s_{j-1}$,而 $s_{j-1}+a_j=s_j\leqslant s_{i-1}=a_i$,这就说明 $2\times a_j\leqslant a_i$,因此满足条件的数至多有 $O(\log V)$ 个。如果考虑 $0$,那么任意一个在全零前缀里的数都满足条件,随便选一个就可以了。
因此,我们就可以暴力来找可能满足条件的数,即不断地找区间内最大的满足 $s_{i-1}\leqslant a_i$ 的 $i$ ,常规做法是线段树上二分。而在本题中这个区间是一段前缀,可以直接在树状数组上二分,非常好写。
复杂度 $O(n\log n\log V)$。
const int N=200501;
int n,Q;
int a[N],Lg;
ll c[N];
inline void add(int x,int y){for(;x<=n;x+=x&(-x))c[x]+=y;}
inline pair<int,int> query(int x){
    int k=0;
    ll sum=0;
    for(int i=Lg;~i;i--){
        int cur=k|(1<<i);
        if(cur<=n&&sum+c[cur]<=x)sum+=c[cur],k=cur;
    }
    return make_pair(k,sum);
}
inline int query(){
    if(a[1]==0)return 1;
    int cur=2e9;
    do{
        cur>>=1;
        pair<int,int> tmp=query(cur);
        if(tmp.second==a[tmp.first+1]){
            return tmp.first+1;
        }
    }while(cur);
    return -1;
}
int main(){
    n=read(),Q=read();
    Lg=log2(n);
    for(int i=1;i<=n;i++)a[i]=read(),add(i,a[i]);
    while(Q--){
        int p=read(),x=read();
        add(p,x-a[p]);
        a[p]=x;
        write(query());putchar('\n');
    }
    return 0;
}

 

标签:tmp,满足条件,cur,Lg,int,题解,CF992E
From: https://www.cnblogs.com/Xttttr/p/17627033.html

相关文章

  • AtCoder Beginner Contest 314 A - Ex题解
    AtCoderBeginnerContest314A-3.14嗯,你可以用string存小数点后的...B-Roulette对于每一个金额,用个vector存pair<>存一个人赌了多少,以及是哪一个人。C-RotateColoredSubsequence每种数用个双向链表记下来。D-LOWER我们观察到,对于2,3操作,只有最后一次有用,且......
  • 杂题题解
    UOJ21缩进优化题目链接记\(M=\max(a_i)\)从反面考虑,考虑\(x\)让答案减小的量。即为$\sum_{i=1}^n\lfloor\frac{a_i}{x}\rfloor\times(x-1)=(x-1)\sum_{i=1}^n\lfloor\frac{a_i}{x}\rfloor$。只需要快速计算$S=\sum_{i=1}^n\lfloor\frac{a_i}{x}\rfloor$。可以......
  • ABC 314 F 题解
    原题传送门题意有n支队伍进行比赛,起初,第i支队伍只有选手i一个人。总共要进行n-1场比赛,每次给出p和q,意为让p所在的队伍与q所在的队伍进行比赛(数据保证此时p和q不在同一支队伍),设p所在的队伍有\(siz_p\)个人,q所在的队伍有\(siz_q\)个人,则此次比赛中p......
  • 【KMP】border 题解
    题目描述输入输出样例输入abaabaa样例输出17样例解释:f[2][a]=1f[3][a]=1f[4][a]=1f[4][b]=2f[5][a]=1f[5][b]=2f[6][a]=3f[7][a]=4f[7][b]=2以上为>0的f[][],求和=17数据范围限制这一篇同上一篇,都是从以前博客搬过来的,所以真的是......
  • 猴子拆房 题解
    题目描述输入输出样例输入【样例输入1】22345【样例输入2】3242513【样例输入3】6353417174241样例输出【样例输出1】3【样例输出2】0【样例输出3】10数据范围限制提示这个是我的,是我的QWQ,我没有转载,只是把以前的博客搬运......
  • 「题解注释」P7518 [省选联考 2021 A/B 卷] 宝石
    联合省选2021宝石题解-hezlik的博客-洛谷博客(luogu.com.cn)耗时:一晚上+半个上午代码注释:#include<bits/stdc++.h>usingnamespacestd;constintN=500000,C=21;intRi(){intx=0,y=1;charc=getchar();for(;c<'0'||c>'9';c=getchar())if......
  • CF452C 题解
    洛谷链接&CF链接题目简述有\(m\timesn\)张牌,有\(n\)个种类,每个种类有\(m\)张,现在抽一张放回,再抽一张,求这张牌与第一张抽出的牌种类相同的概率。思路本题是一道结论题,我们来推一下公式。首先需要特判一个点:只有\(1\)张牌,即\(n=m=1\),那么两次抽都会是这张牌,所......
  • acwing 116.飞行员兄弟 (算法竞赛进阶指南 p48 t1 ) 题解
    原题链接https://www.acwing.com/problem/content/description/118/题目描述“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个4х4的矩阵,您可以......
  • IDEA/Android Studio的gradle控制台输出中文乱码问题解决
    原文地址:IDEA/AndroidStudio的gradle控制台输出中文乱码问题解决-Stars-One的杂货小窝在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变成乱码了..本篇就介绍下解决方法乱码效果如下图所示步骤我是window系统,不知道其他系统会不会出现这个问题乱......
  • Codeforces Round 874 G题解
    做不动那么多题了,来个GG就是问你一棵树能切成多少个大小为3的链,想了半天,想过dp啥的,但是后来发现这个贪心就好了,可以证明贪心找不到的,其他方法也找不到好久没复健了,这是第一次,感觉以后要多做题才可以#include<bits/stdc++.h>usingnamespacestd;constexprintlimit=(4e......