线段树【p4879】ycz的妹子
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的妹子的更多相关文章
- P4879 ycz的妹子
思路 让你干啥你就干啥呗 查询第x个妹子就get一下再修改 这里稳一点就维护了三个东西,也许两个也可以 代码 #include <iostream> #include <cstdio ...
- 牛客小白月赛16 小石的妹子 二分 or 线段树
牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...
- 【题解】 bzoj3693: 圆桌会议 (线段树+霍尔定理)
bzoj3693 Solution: 显然我们可以把人和位置抽象成点,就成了一个二分图,然后就可以用霍尔定理判断是否能有解 一开始我随便YY了一个\(check\)的方法:就是每次向后一组,我们就把那 ...
- 玲珑oj 1117 线段树+离线+离散化,laz大法
1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异 ...
- ACdream 1101 线段树
题目链接 瑶瑶想要玩滑梯 Time Limit: 10000/5000MS (Java/Others)Memory Limit: 512000/256000KB (Java/Others) Submi ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
随机推荐
- Java 如何正确停止一个线程
自己在做实验性小项目的时候,发现自己遇到一个问题:如何控制线程的"死亡"? 首先,如何开启一个线程呢? 最简单的代码: public class Main { public sta ...
- [Leetcode] Path Sum II路径和
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 12.25模拟赛T2
https://www.luogu.org/blog/a23333/post-xing-xuan-mu-ni-sai-path-ji-wang-zui-duan-lu 如果设f[i]表示从i到n的期望 ...
- 如何加快JavaScript的加载与执行
JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 浏览器在碰到一个引入外部JS 文件的<script>标签时会停下所有工作 ...
- composer应用
ubentu安装 进入自己的项目根目录cd/path/to/my/project 下载composer curl -s http://getcomposer.org/installer 把这个文件移到 ...
- 我之理解---计时器setTimeout 和clearTimeout
今天在写个图片切换的问题 有动画滞后的问题,才动手去查setTimeout 和clearTimeout.之前写的图片播放器也有类似的问题,有自动start按钮 和stop按钮, 其他都正常,问题出在每 ...
- Struts2 利用拦截器 interceptor 控制登陆和访问权限
最近学习了Struts2的登录和权限控制用到的是拦截器,需要在struts.xml中配置,每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultSta ...
- IDEA新建时选项没有java class问题
解决办法: 点击你的project F4打开project stucture 点击左边的module 点击右边的source后添加src就可以了 添加的src就是源码可以放置的地址
- 2017年上海金马五校程序设计竞赛:Problem K : Treasure Map (蛇形填数)
Description There is a robot, its task is to bury treasures in order on a N × M grids map, and each ...
- (六)kernel中文件的读写操作可以使用vfs_read()和vfs_write
需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...