Description

机房神犇yczycz有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\)不为负数,但是颜值减去之后可能为负数

Input

第一行两个正整数\(n\)和\(m\) \((1\leq n\leq 100000)\)

第二行为\(n\)个整数\(a_i\),表示小时候\(ycz\)的青梅竹马的颜值\((1\leq a_i<=10^9)\)

接下来\(m\)行,每行为一条信息,每条信息可能是下面的一种:

\(C\, x\, y\)表示第\(x\)个城市的妹子的颜值下降了\(y\)

\(I\, x\, y\)表示在第\(x\)个城市有一个颜值为\(y\)的妹子迷上了\(ycz\)

\(D\, x\)表示第\(x\)个妹子和\(ycz\)分手了

\(Q\)表示\(ycz\)现在想知道如果现在去找他所有的妹子们珂以获得多大的愉悦度

说明:妹子们居住的城市编号最大为\(5\times 10^5\)

Output

对于每一个\(Q\)输出一个整数

别看题面这么长,一个裸的线段树.

支持操作,单点修改&&单点查询.

难点在于如何分手

直接\(while\)去找这个妹子实在左边还是右边就好了.qwq。

貌似不是很难,记得开$long \ long $就好

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define int long long
#define R register
#define N 500008 using namespace std; inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
} int n,m,new_n;
int res[N];
struct cod{int sum,num,l,r;}tr[N<<2]; #define ls o<<1
#define rs o<<1|1
inline void up(int o)
{
tr[o].sum=tr[ls].sum+tr[rs].sum;
tr[o].num=tr[ls].num+tr[rs].num;
} void build(int o,int l,int r)
{
tr[o].l=l,tr[o].r=r;
if(l==r)
{
tr[o].sum=res[l];
tr[o].num= (l<=n ? 1:0);
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
up(o);
} void change(int o,int l,int r,int pos,int del,int flg)
{
if(l==r)
{
tr[o].sum+=del;
tr[o].num=flg;
return ;
}
int mid=(l+r)>>1;
if(pos<=mid)change(ls,l,mid,pos,del,flg);
else change(rs,mid+1,r,pos,del,flg);
up(o);
} int query(int o,int l,int r,int x,int y)
{
if(x<=l and y>=r)return tr[o].sum;
int mid=(l+r)>>1,res=0;
if(x<=mid)res+=query(ls,l,mid,x,y);
if(y>mid)res+=query(rs,mid+1,r,x,y);
return res;
} int pos; int t_query(int o,int k)
{
while(2333)
{
if(tr[o].l==tr[o].r)
{
pos=tr[o].l;
return tr[o].sum;
}
if(tr[ls].num>=k)o=ls;
else
{
k-=tr[ls].num;
o=rs;
}
}
} char opt[7];
signed main()
{
in(n),in(m);
for(R int i=1;i<=n;i++)in(res[i]);
new_n=N;
build(1,1,new_n);
for(R int i=1,x,y;i<=m;i++)
{
scanf("%s",opt+1);
if(opt[1]=='C')
{
in(x),in(y);
change(1,1,new_n,x,-y,1);
}
if(opt[1]=='I')
{
in(x),in(y);
int now=query(1,1,new_n,x,x);
change(1,1,new_n,x,y-now,1);
}
if(opt[1]=='D')
{
in(x);
int now=t_query(1,x);
change(1,1,new_n,pos,-now,0);
}
if(opt[1]=='Q')
printf("%lld\n",tr[1].sum);
}
}

线段树【p4879】ycz的妹子的更多相关文章

  1. P4879 ycz的妹子

    思路 让你干啥你就干啥呗 查询第x个妹子就get一下再修改 这里稳一点就维护了三个东西,也许两个也可以 代码 #include <iostream> #include <cstdio ...

  2. 牛客小白月赛16 小石的妹子 二分 or 线段树

    牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...

  3. 【题解】 bzoj3693: 圆桌会议 (线段树+霍尔定理)

    bzoj3693 Solution: 显然我们可以把人和位置抽象成点,就成了一个二分图,然后就可以用霍尔定理判断是否能有解 一开始我随便YY了一个\(check\)的方法:就是每次向后一组,我们就把那 ...

  4. 玲珑oj 1117 线段树+离线+离散化,laz大法

    1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异 ...

  5. ACdream 1101 线段树

    题目链接 瑶瑶想要玩滑梯 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) Submi ...

  6. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  7. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  8. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  9. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

随机推荐

  1. [洛谷P4940]Portal2

    题目大意:维护两个栈,几个操作: $PUSH\;x\;num:$把$num$压入栈$x$ $POP\;x:$弹出栈$x$栈顶元素 $ADD\;x:$取出两个栈栈顶,把相加值压入栈$x$ $SUB\;x ...

  2. 强大的JQuery数组封装使用

    JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...

  3. POJ 3179 Corral the Cows

    Corral the Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1352   Accepted: 565 De ...

  4. Array.slice(start,end)的用法

    start在start>=0,假设start=0,表示从数组的第一个元素开始截取,start=2,表示从数组的第二个元素开始截取,依次类推. 在start<0时,start=-1表示从倒数 ...

  5. lwIP配置文件opt.h和lwipopts.h

    如何去配置lwip,使它去适合不同大小的脚,这就是lwIP的配置问题.尤其是内存的配置,配置多了浪费,配置少了跑不了或者不稳定(会出现的一大堆莫名奇妙的问题,什么打开网页的速度很慢啊?什么丢包啊,什么 ...

  6. 【UVALive4685-Succession】树形DP

    http://acm.hust.edu.cn/vjudge/problem/14338 题意:给定一棵树,每个点有一个值,让你选择k个点,并且这k个点是连在一起的(从任意一个点出发,可以遍历完所有选择 ...

  7. 校内训练0609 problem c

    [题目大意] 给一棵树,求有多少条路径满足总和-最大值 是P的倍数 n<=10^5, P<=10^7 [题解] 一看就是点分治嘛 不考虑子树合并,考虑poj1741的做法,每次考虑经过重心 ...

  8. 通过 CLI 搭建 ghost

    参考: ghost 官网 系统架构说明 架构 架构说明 本实践将 web 接入, nodejs 服务, 数据库分离, 适合生产环境场景. nginx 接入请求, 反向代理后端 nodejs 服务 no ...

  9. HDU 1162 Eddy's picture (最小生成树 普里姆 )

    题目链接 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to be ...

  10. NYOJ 284 坦克大战 (广搜)

    题目链接 描述 Many of us had played the game "Battle city" in our childhood, and some people (li ...