P4879 ycz的妹子

思路

让你干啥你就干啥呗
查询第x个妹子就get一下再修改
这里稳一点就维护了三个东西,也许两个也可以

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#define ls rt<<1
#define rs rt<<1|1
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn = 5e5 + 7;
int read() {
    int x = 0, f = 1; char s = getchar();
    for (; s < '0' || s > '9'; s = getchar()) if (s == '-') f = -1;
    for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
    return x * f;
}
int n,m;
int a[maxn];
struct node {
    int l,r,size,gs;
    ll sum,ans;
}e[maxn<<2];
void pushup(int rt) {
    e[rt].gs=e[ls].gs+e[rs].gs;
    e[rt].ans=e[ls].ans+e[rs].ans;
    e[rt].sum=e[ls].sum+e[rs].sum;
}
void build(int l,int r,int rt) {
    e[rt].l=l,e[rt].r=r,e[rt].size=r-l+1;
    if(l==r) {
        if(l<=n) {
            e[rt].gs=1;
            e[rt].ans=e[rt].sum=a[l];
        }
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,ls);
    build(mid+1,r,rs);
    pushup(rt);
}
void modify_1(int L,int k,int rt) { // The Lth city plus k .
    if(e[rt].l==e[rt].r) {
        e[rt].sum+=k;
        if(e[rt].gs) e[rt].ans+=k;
        return;
    }
    int mid=(e[rt].l+e[rt].r)>>1;
    if(L<=mid) modify_1(L,k,ls);
    else modify_1(L,k,rs);
    pushup(rt);
}
void modify_2(int L,int k,int rt) { // The Lth sister fell in love with him.
    if(e[rt].l==e[rt].r) {
        e[rt].gs=k;
        e[rt].ans=e[rt].sum=0;
        return;
    }
    int mid=(e[rt].l+e[rt].r)>>1;
    if(L<=mid) modify_2(L,k,ls);
    else modify_2(L,k,rs);
    pushup(rt); 
}
int get(int k,int rt) {
    if(e[rt].l==e[rt].r)
        return e[rt].l;
    if(k <= e[ls].gs) return get(k,ls);
    else return get(k-e[ls].gs,rs);
}
int main() {
    n=read(),m=read();
    FOR(i,1,n) a[i]=read();
    build(1,5e5,1);
    FOR(i,1,m) {
        char s;
        scanf("%s",&s);
        if(s=='Q') {
            printf("%lld\n",e[1].ans);
        } else if(s=='C') {
            int x=read(),y=read();
            modify_1(x,-y,1);
        } else if(s=='D') {
            int x=read();
            modify_2(get(x,1),0,1);
        } else if(s=='I') {
            int x=read(),y=read();
            modify_2(x,1,1);
            modify_1(x,y,1);
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/dsrdsr/p/9878124.html

# P4879 ycz妹子 ## 题目背景 ycz 有很多很多的妹子ycz:瞎说) ## 题目描述 机房神犇 ycz 有 $n$ 个青梅竹马,她们分别住在 $1~n$ 号城市中。小时候的她们美丽可爱,但是由于女大十八变,有些妹子的颜值发生了变化,但是十分重感情的 ycz 神犇不忍心抛弃她们,于是记录下来了她们颜值变化的值,我们用 $C, x, y$ 表示第 $x$ 个城市的妹子的颜值下降了 $y$ 。长大之后的 ycz 非常有魅力,有许多妹子ycz 迷得神魂颠倒,我们用$I, x, y$ 表示第 $x$ 个城市有一个妹子喜欢上了 ycz ,她的颜值为 $y$ ( $y$ 有可能是负数,但是 ycz 来者不拒)。但在中途有一些妹子ycz 吵架了,于是就分手了,我们用 $D, x$ 表示**第 $x$ 个妹子**和 ycz 分手了。 最近神犇 ycz 要去全国各地找他的妹子们,为了方便计算,我们珂以把 ycz妹子所在的城市当作是一条直线,并且挨在一起。神犇 ycz 由于忙于和他的妹子们联系此时已经很累了,于是交给你一个这样的任务:他想知道他在某个时间去找他的所有妹子们珂以获得多大的愉悦度,这个愉悦度为他找的妹子的颜值数,你要做的就是求出这个愉悦度之和(注意长大后妹子们的颜值可能为负数/滑稽)。 注意:每个城市只允许有一个妹子,也就是说后来喜欢上 ycz妹子会赶走之前这个城市喜欢 ycz妹子~~(一城不容二女)~~。 UPD: 青梅竹马都是喜欢 ycz 的。 分手的第 $x$ 个妹子不是第 $x$ 城市的妹子,是指从前往后数第 $x$ 个有妹子的城市的妹子。 青梅竹马长大后就是妹子。 修改的值 $y$ 不为负数,但是颜值减去之后可能为负数。 ## 输入格式 ycz 有 $5 \times 10^5$ 座城市,开始时,前 $n$ 座城市各有一个妹子,第 $i$ 座城市妹子初始的颜值为 $a_i$。 有 $m$ 次以下四种操作。 - `C x y` 第 $x$ 座城市的妹子颜值减少 $y$ - `I x y` 第 $x$ 座城市出现了一个颜值为 $y$ 的妹子,如果在此之前,第 $x$ 座城市已经有妹子,则之前的妹子被驱赶。 - `D x` 第 $x$ 个有妹子的城市 中的妹子ycz 分手 - `Q` ycz 想知道他所有妹子的颜值总和是多少 ## 输出格式 对于每一个$Q$输出一个整数 ## 输入输出样例 #1 ### 输入 #1 ``` 5 10 1 2 3 4 5 Q C 3 2 Q I 6 6 Q D 4 Q C 5 2 I 7 9 Q ``` ### 输出 #1 ``` 15 13 19 15 22 ``` ## 说明/提示 **样例解释:** 妹子颜值变化如下,删除的就没写在下面了。 ``` 1 2 1 4 5 1 2 1 4 5 6 1 2 1 5 6 1 2 1 3 6 1 2 1 3 6 9 ``` 对于 30% 的数据,$1 \le n,m \le 10$ 对于 70% 的数据,$1 \le n,m \le 1000$ 对于 100% 的数据,$1 \le n,m \le 100000,|a_i|,|y| \le 10^9$
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值