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:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #define int long long
  5. using namespace std;
  6. const int wx=3000017;
  7. inline int read(){
  8. int sum=0,f=1; char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
  10. while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
  11. return sum*f;
  12. }
  13. int a[wx],sum_geshu[wx],sum_quanzhi[wx],b[wx];
  14. int n,m,tot;
  15. int c[wx];
  16. char opt[7];
  17. struct node{
  18. int flag,num,to;
  19. int c,s;
  20. }t[wx];
  21. void add1(int pos,int k){
  22. for(int i=pos;i<=tot;i+=(i&-i))
  23. sum_geshu[i]+=k;
  24. }
  25. int query1(int pos){
  26. int re=0;
  27. for(int i=pos;i>=1;i-=(i&-i))
  28. re+=sum_geshu[i];
  29. return re;
  30. }
  31. void add2(int pos,int k){
  32. for(int i=pos;i<=tot;i+=(i&-i))
  33. sum_quanzhi[i]+=k;
  34. }
  35. int query2(int pos){
  36. int re=0;
  37. for(int i=pos;i>=1;i-=(i&-i))
  38. re+=sum_quanzhi[i];
  39. return re;
  40. }
  41. signed main(){
  42. n=read(); m=read();
  43. for(int i=1;i<=m;i++){
  44. scanf("%s",opt+1);
  45. if(opt[1]=='U'){
  46. t[i].flag=1;
  47. t[i].num=read();
  48. t[i].to=read();
  49. b[++tot]=t[i].to;
  50. }
  51. else{
  52. t[i].c=read();
  53. t[i].s=read();
  54. b[++tot]=t[i].s;
  55. }
  56. }
  57. sort(b+1,b+1+tot);
  58. for(int i=1;i<=m;i++){
  59. if(t[i].flag){
  60. int tmp=lower_bound(b+1,b+1+tot,t[i].to)-b;
  61. if(a[t[i].num]){
  62. add1(a[t[i].num],-1);add2(a[t[i].num],-b[a[t[i].num]]);
  63. }
  64. if(tmp){
  65. add1(tmp,1); a[t[i].num]=tmp; add2(tmp,b[tmp]);
  66. }
  67. }
  68. else{
  69. int s=lower_bound(b+1,b+1+tot,t[i].s)-b;
  70. int tmp=b[s]*(t[i].c-(query1(tot)-query1(s-1)));
  71. if(tmp<=query2(s-1))puts("TAK");
  72. else puts("NIE");
  73. }
  74. }
  75. return 0;
  76. }

树状数组【洛谷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. Open XML 检索 EXCEL

    1.Excel 隐藏行判断 项目的 Hidden 属性不为 null,且 Hidden 属性的值为 True var itemList = ws.Descendants<Row>(). W ...

  2. Android studio如何和VS的region一样折叠代码

    相信用过VS的朋友都会经常有用到VS的region来折叠代码,非常方便.那么Android studio是否可以呢?当然可以. 选择代码,Ctrl + Alt + T 选择 第二项,这样就可以啦

  3. Spring Cloud Zuul 2(基于配置中心的动态API网关)

    在大体了解了API Zuul 和 配置中心Config后我们来尝试完成一个基于配置中心的动态API网关 创建项目 命名为api-gateway-dynamic-route并加入config 和 Zuu ...

  4. libevent源码深度剖析七

    libevent源码深度剖析七 ——事件主循环 张亮 现在我们已经初步了解了libevent的Reactor组件——event_base和事件管理框架,接下来就是libevent事件处理的中心部分 — ...

  5. python pipelines 用法

    http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html http://blog.csdn.net/m ...

  6. pip指定安装包版本

    pip是目前最好用的python包关系工具,没有之一. 1.版本范围符号:==.>=.<=.>.<. 2.单个安装示例: 1 2 3 pip install cchardet  ...

  7. 对C#泛型讲的很好的一篇文章

    请参考 https://www.cnblogs.com/kissdodog/archive/2013/01/27/2879185.html

  8. Why does my Authorize Attribute not work?

    the roles of a ClaimsPrincipal are actually just claims create with a type of ClaimsIdentity.RoleCla ...

  9. 当this指针成为指向之类的基类指针时,也能形成多态

    this指针: 1)对象中没有函数,只有成员变量 2)对象调用函数,通过this指针告诉函数是哪个对象自己谁. #include<iostream> using namespace std ...

  10. bootstrap页面效果图

    <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...