P3586 [POI2015]LOG

维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a。2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作。每次询问独立,即每次询问不会对序列进行修改。

离散化按照权值建立树状数组。

那么对于大于s的值,可以直接减去s,这一部分的贡献为\(c*(query_{geshu}(tot)-query_{geshu}(s-1))\)。

剩下的数,我们只知道他们小于s,但是不知道确切的值所以并不能用上述方法求出贡献。

但是我们知道每个数的大小,那么可以求出每个数的权值*个数之和,这些是可以作为贡献的。

也就是\(query_{quanzhi}(s-1)\)。

注意离散化。

对于离散化,一定注意当前的值要用离散化之后的还是之前的。

之后的用\(lowerbound\)求出,之后的再用求出的序号带入到离散化数组就可以。

code:

#include <iostream>
#include <cstdio>
#include <algorithm> #define int long long using namespace std; const int wx=3000017; inline int read(){
int sum=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
return sum*f;
} int a[wx],sum_geshu[wx],sum_quanzhi[wx],b[wx];
int n,m,tot;
int c[wx];
char opt[7]; struct node{
int flag,num,to;
int c,s;
}t[wx]; void add1(int pos,int k){
for(int i=pos;i<=tot;i+=(i&-i))
sum_geshu[i]+=k;
} int query1(int pos){
int re=0;
for(int i=pos;i>=1;i-=(i&-i))
re+=sum_geshu[i];
return re;
} void add2(int pos,int k){
for(int i=pos;i<=tot;i+=(i&-i))
sum_quanzhi[i]+=k;
} int query2(int pos){
int re=0;
for(int i=pos;i>=1;i-=(i&-i))
re+=sum_quanzhi[i];
return re;
} signed main(){
n=read(); m=read();
for(int i=1;i<=m;i++){
scanf("%s",opt+1);
if(opt[1]=='U'){
t[i].flag=1;
t[i].num=read();
t[i].to=read();
b[++tot]=t[i].to;
}
else{
t[i].c=read();
t[i].s=read();
b[++tot]=t[i].s;
}
}
sort(b+1,b+1+tot);
for(int i=1;i<=m;i++){
if(t[i].flag){
int tmp=lower_bound(b+1,b+1+tot,t[i].to)-b;
if(a[t[i].num]){
add1(a[t[i].num],-1);add2(a[t[i].num],-b[a[t[i].num]]);
} if(tmp){
add1(tmp,1); a[t[i].num]=tmp; add2(tmp,b[tmp]);
}
}
else{
int s=lower_bound(b+1,b+1+tot,t[i].s)-b;
int tmp=b[s]*(t[i].c-(query1(tot)-query1(s-1)));
if(tmp<=query2(s-1))puts("TAK");
else puts("NIE");
}
}
return 0;
}

树状数组【洛谷P3586】 [POI2015]LOG的更多相关文章

  1. 洛谷 P3586 [POI2015]LOG

    P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...

  2. 树状数组 洛谷P3616 富金森林公园

    P3616 富金森林公园 题目描述 博艾的富金森林公园里有一个长长的富金山脉,山脉是由一块块巨石并列构成的,编号从1到N.每一个巨石有一个海拔高度.而这个山脉又在一个盆地中,盆地里可能会积水,积水也有 ...

  3. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  4. P3374 【模板】树状数组 1--洛谷luogu

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  5. P3368 【模板】树状数组 2--洛谷luogu

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  6. 【洛谷P3586】LOG

    题目大意:维护一个集合,支持单点修改.查询小于 X 的数的个数.查询小于 X 的数的和. 题解:学习到了动态开点线段树.对于一棵未经离散化的权值线段树来说,对于静态开点来说,过大的值域会导致不能承受的 ...

  7. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  8. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  9. hdu 4991(树状数组+DP)

    Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】

    整体二分: 对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位 ...

随机推荐

  1. MyBatis3配置文件示例及解释

    转自:https://blog.csdn.net/tobylxy/article/details/84320694 1 <?xml version="1.0" encodin ...

  2. django 基于正则表达式的url

    方式一: urls.py from mytest import views urlpatterns = [ url(r'^index-(\d+)-(\d+).html', views.Index.as ...

  3. js处理小数加减时精度失真

    最近公司业务有用js处理数据加减,但有时候会出现很多位小数:后来发现是js处理小数时精度失真:为了后边不在犯类似错误,笔者觉得有必要记录下处理方法,当然处理方法有很多种,这里笔者找了一种较为简洁的方法 ...

  4. 【291】Python 中字符串添加到剪贴板

    参考:如何使用Python将字符串复制到Windows上的剪贴板上? 实现代码如下: from Tkinter import Tk r = Tk() r.withdraw() r.clipboard_ ...

  5. fgets、gets和scanf的区别

    gets()从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中.换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字 ...

  6. uboot启动正常,加载内核kernel启…

    先说现象吧:uboot能够正常启动,不过在kernel启动时却出现起不了的现象,停在这里 Uncompressing Linux.................................... ...

  7. Ceph基本情况介绍

    Ceph基本情况的介绍 Ceph是一个分布式存储软件. 它支持用3种方式存储数据,分别是:对象存储.块设备存储.分布式文件系统存储. Ceph最初的目标是做一个分布式文件系统,直到现在这个目标也不能算 ...

  8. Python函数之返回值、作用域和局部变量

    一.函数返回值 说到返回值,相信大家肯定都认识,没错,就是return. 所谓返回值可以这样理解:函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回. 那具体怎么用呢?接 ...

  9. zookeeper伪集群的搭建

    由于公司服务器数量的限制,我们往往没有那么多的服务器用来搭建zookeeper的集群,所以产生了伪集群的搭建,也就是将多个zookeeper搭建在同一台机器上. 准备工作: 1,一台服务器,我们这里用 ...

  10. UVA-11280 Flying to Fredericton

    题意 给定一些国家,和两个国家间的花费,现在有一些询问,询问每次最多转k次飞机,最小花费 分析 最短路的裸题,跑spfa或者dijsktra什么的都行 多开一维来记录转k次飞机时的最短路是什么(拆点? ...