Description

“我希望能使用更多的魔法。不对,是预定能使用啦。最终我要被大家称呼为大魔法使。为此我决定不惜一切努力。”
——《The Grimoire of Marisa》雾雨魔理沙
魔理沙一如既往地去帕秋莉的大图书馆去借魔导书(Grimoire) 来学习魔道。
最开始的时候,魔理沙只是一本一本地进行研究。然而在符卡战中,魔理沙还是战不过帕秋莉。
好在魔理沙对自己的借还和研究结果进行了记录,从而发现了那些魔导书的精妙之处。
帕秋莉的那些魔导书,每本都有一个类别编号ti 和威力大小pi。而想要获得最有威力的魔法,就必须同时研究一些魔导书。而研究的这些魔导书就必须要满足,类别编号为T 的书的本数小于等于T,并且总共的本数小于等于一个给定的数N。而研究这些魔导书之后习得的魔法的威力就是被研究的魔导书的威力之和。
为了击败帕秋莉,魔理沙想要利用自己发现的规律来获得最有威力的魔法。
她列出了计划中之后M 次的借还事件,并想要知道每个事件之后自己所能获得的魔法的最大威力。可她忙于魔法材料——蘑菇的收集,于是这个问题就交给你来解决了。

Input

输入文件grimoire.in。
第1 行2 个整数N,M,分别表示魔理沙能研究的魔导书本数的上限和她的借还事件数。
之后M 行,每行的形式为“op t p”(不含引号)。Op 为“BORROW” 或“RETURN”,分别表示借书和还书。T 为一个整数,表示这本书的类别编号。P为一个整数,表示这本书的威力大小。注意,还书时如果有多本书满足类别编号为t,威力大小为p,这表明这些书都是相同的,魔理沙会任选其中一本书还回去。如果你问我为何会有相同的书,多半因为这是魔导书吧。

Output

输出文件grimoire.out。
一共M 行,每行一个整数,即每个事件之后的最大威力。

Sample Input

5 10
BORROW 1 5811
BORROW 3 5032
RETURN 3 5032
BORROW 3 5550
BORROW 5 3486
RETURN 1 5811
RETURN 3 5550
BORROW 4 5116
BORROW 3 9563
BORROW 5 94

Sample Output

5811
10843
5811
11361
14847
9036
3486
8602
18165
18259

Data Constraint

对于5% 的数据,1 <= t,N,M <= 50。
对于10% 的数据,1 <= t,N,M <= 100。
对于30% 的数据,1 <= t,N,M<= 10 000。
另有30% 的数据,1 <= p <= 1 000。
对于100% 的数据,1 <= t,N,M <= 300 000,1<= p<= 1 000 000 000。
另外,总共有30% 的数据,满足没有“RETURN” 操作。这部分数据均匀分布。

思路

这是一个数据结构练(du)习(liu)题

我们需要一个数据结构,可以支持插入,删除,和查询第K大的数。
我们可以用平衡树(你愿意敲300行代码的话)或对顶堆(不推荐)或权值线段树(我用了)。

但我们发现这样会MLE,所以我们要动态开点。
按我理解,动态开点就是记录树上的一条链,并且把他们联系起来。

对于添加操作,设在集合i中添加一个权值为x的元素。
首先直接添加。
集合{a1,a2……aia1,a2……ai},若x比ai大,那么在大集合中要把ai删除,把x加入(显然)。
对于删除操作同理,反过来维护即可。
删除可以插入一个权值为负的点来实现

query就按普通线段树搞一下即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=300777*90,inf=1000000000;
int n,m,a[maxn],root[maxn],cnt=0,le[maxn],ri[maxn];
long long ass=0,s[maxn];
void add(int &v,int l,int r,int k,int b)
{if(!v) v=++cnt;a[v]+=b; s[v]+=k*b;if(l==r) return;int mid=(l+r)>>1;if(k<=mid) add(le[v],l,mid,k,b);else add(ri[v],mid+1,r,k,b);
}
int query(int v,int l,int r,int k)
{if(l==r){ass+=l*min(k,a[v]);return l;}int mid=(l+r)>>1;if(a[ri[v]]>=k) query(ri[v],mid+1,r,k); else{ass+=s[ri[v]];return query(le[v],l,mid,k-a[ri[v]]);}
}
int main()
{freopen("grimoire.in","r",stdin);freopen("grimoire.out","w",stdout);scanf("%d %d\n",&n,&m);for(int i=1; i<=m; i++){char c=getchar();if(c=='B'){int x,y;scanf("ORROW %d %d\n",&x,&y);int k=query(root[x],0,inf,x);add(root[x],0,inf,y,1);if(y>=k){add(root[0],0,inf,y,1);add(root[0],0,inf,k,-1);}}else{int x,y;scanf("ETURN %d %d\n",&x,&y);int k=query(root[x],0,inf,x+1);add(root[x],0,inf,y,-1);if(y>=k){add(root[0],0,inf,y,-1);add(root[0],0,inf,k,1);}}ass=0;query(root[0],0,inf,n);printf("%lld\n",ass);}return 0;
}

【JZOJ B组】【NOIP2015模拟10.27】魔道研究相关推荐

  1. jzoj4270 [NOIP2015模拟10.27]魔道研究 线段树

    Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...

  2. 2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔道研究

    #Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Ma ...

  3. 4270. 【NOIP2015模拟10.27】魔道研究

    Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...

  4. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...

  5. 【NOIP2015模拟10.27】魔道研究

    Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...

  6. jzoj4270. 【NOIP2015模拟10.27】魔道研究

    题目描述 Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire o ...

  7. 【NOIP2015模拟10.27】魔道研究题解

    改了这么久,终于把这道题A了,我太弱了 感谢ZLZ巨佬的教导以及CZC帮忙调试. 来写一篇题解吧. Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼 ...

  8. 2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔法阵

    #Description 帕秋莉·诺蕾姬,有着"不动的大图书馆" 的称号,擅长使用各种各样的属性魔法. --<东方求闻史记> 一如既往地,帕秋莉在图书馆中研究着魔法.今 ...

  9. JZOJ 5931. 【NOIP2018模拟10.27】冒泡排序

    Description 题目背景 冒泡排序的交换次数被定义为交换过程的执行次数. 题面描述 小 S 开始专注于研究⻓度为 n 的排列,他想知道,在你运气足够好的情况下(即每次冒泡排序的交换次数都是可能 ...

最新文章

  1. Jquery--遮罩弹窗特效
  2. 第二章 第二节 安装Eclipse
  3. 如何编写一个Jquery插件
  4. My github blog
  5. 中判断字符串是否为空_自己动手编写VBA代码,判断一个工作表是否为空,然后删除它...
  6. Web 前端怎样入门?
  7. Xcode字体新宠 Monoid
  8. position之属性
  9. 假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。...
  10. 古风素材无水印免费下载
  11. adobe creative cloud的开机自启如何阻止
  12. IDL调用ENVI-FLAASH大气校正异常退出解决办法
  13. ShaderForge - 纹理逐步消失
  14. html实现iphone桌面,HTML_Html5实现iPhone开机界面示例代码,今天我突发其想,想到可以用H - phpStudy...
  15. sd卡烧写linux内核,uboot从SD卡烧写内核和文件系统
  16. ARM服务器开箱测试【转载】
  17. 编译原理 —— 逆波兰式
  18. Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命
  19. 在ubuntu20.04环境下安装opencv教程并测试
  20. windows service 无法访问映射的网络驱动器

热门文章

  1. 深度学习系列27:VAE生成模型
  2. 用markdown写数学公式
  3. idea单元测试左侧装订线中的颜色指示器设置
  4. 伦敦国家美术馆遭史上最大“洗劫”?“赃画”被尽数展出,场地比卢浮宫还大400倍
  5. JAVA 基础(4) 类与对象
  6. java 导出excel合计_POI导出excel执行自动求和
  7. python中求质数_python求质数的3种方法
  8. pycharm必会的常见快捷键
  9. Access denied的解决
  10. 如何打开drm?drm是什么格式?