题目描述

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” 操作。这部分数据均匀分布。

魔理沙竟然会还书了

5~70%

不会

100%

一个显然的性质:把当前所有的书从大到小排序,依次取合法的书,最后的结果一定最优
因为如果不取当前的某本书,就只能取收益更低的

所以用线段树来维护
开一棵总的权值线段树,维护当前可选书目(就是种类为t的书不超t本)
接着对于每种书再各自开一棵权值线段树,维护当前种类的书的情况

当加入一本书时,就先加入当前编号的树里,之后判断如果对总答案有影响(排在前t本里),就加到总的树中,再把当前编号为t+1的书踢掉(如果有的话)

删除反之,先从当前编号的树里删去,之后判断如果对总答案有影响(排在前t本里),就从总的树中删去,再把当前编号为t的书加上去
复制真爽

因为一种书可能有多本,所以某些细节上要注意一下

code

线段树的时间较大,所以要尽量减少操作次数
(之前我把某个操作移到if内之后直接少了700ms)

#include <iostream>
#include <cstdlib>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define Len 1000000000
using namespace std;long long tr[20000001][5];
int n,m,i,j,k,l,x,y,len,S,S2;
char s[20];
long long ans;void New(int t,int x)
{if (!tr[t][x])tr[t][x]=++len;
}void change(int t,int l,int r,int x,int s)
{int mid=(l+r)/2;tr[t][2]+=s;if (tr[t][2]<0)cout<<tr[t][2]<<endl;tr[t][3]+=s*x;if (l==r){if (tr[t][2])tr[t][4]=x;elsetr[t][4]=0;return;}if (x<=mid){New(t,0);change(tr[t][0],l,mid,x,s);}else{New(t,1);change(tr[t][1],mid+1,r,x,s);}tr[t][4]=max(tr[tr[t][0]][4],tr[tr[t][1]][4]);
}void get(int t,int l,int r,long long k)
{int mid=(l+r)/2;if (l==r){ans+=(long long)min(k,tr[t][2])*l;return;}if (tr[tr[t][1]][2]<=k){ans+=tr[tr[t][1]][3];if (tr[tr[t][0]][2] && k>tr[tr[t][1]][2])get(tr[t][0],l,mid,k-tr[tr[t][1]][2]);}else{if (tr[tr[t][1]][2])get(tr[t][1],mid+1,r,k);}
}void Get(int t,int l,int r,int x,int y)
{int mid=(l+r)/2;if (x<=l && r<=y){S+=tr[t][2];return;}if (x<=mid && tr[tr[t][0]][2])Get(tr[t][0],l,mid,x,y);if (mid<y  && tr[tr[t][1]][2])Get(tr[t][1],mid+1,r,x,y);
}void find(int t,int l,int r,int k)
{int mid=(l+r)/2;if (l==r){if (k<=tr[t][2])S2=l;return;}if (tr[tr[t][1]][2]<k){if (tr[tr[t][0]][2])find(tr[t][0],l,mid,k-tr[tr[t][1]][2]);}else{if (tr[tr[t][1]][2])find(tr[t][1],mid+1,r,k);}
}int main()
{freopen("grimoire.in","r",stdin);freopen("grimoire.out","w",stdout);scanf("%d%d",&n,&m);len=300001;fo(i,1,m){scanf("%s%d%d",s,&x,&y);if (s[0]=='B'){change(x,1,Len,y,1);S=0;Get(x,1,Len,y,Len);if (S<=x){change(300001,1,Len,y,1);S2=0;find(x,1,Len,x+1);if (S2)change(300001,1,Len,S2,-1);}}else{S=0;Get(x,1,Len,y,Len);change(x,1,Len,y,-1);if (S<=x){change(300001,1,Len,y,-1);S2=0;find(x,1,Len,x);if (S2)change(300001,1,Len,S2,1);}}ans=0;get(300001,1,Len,n);printf("%lld\n",ans);}fclose(stdin);fclose(stdout);return 0;
}

jzoj4270. 【NOIP2015模拟10.27】魔道研究相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. jzoj4271. 【NOIP2015模拟10.27】魔法阵

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

最新文章

  1. 可以发张图片做链接用吗
  2. IEEE分享 | 机器学习在领英的规模化应用
  3. 怎么缩小界面_188M的PPT,我是怎么把它压缩成18M的?这三个方法很少人知道
  4. linux转换C编码风格
  5. 【hard】146. LRU Cache
  6. CV之IG:基于CNN网络架构+ResNet网络进行DIY图像生成网络
  7. 文件传输_python socket实现文件传输(防粘包)
  8. Lis(bzoj 3532)
  9. !JS实战之随机像素图
  10. 2020后半年iPhone取消附赠耳机?分析师上调AirPods出货量预估
  11. nhibernate GetType
  12. php在函数中定义全局变量,PHP 全局变量在用户自定义函数内部不足见
  13. Oracle:ODP.NET Managed 小试牛刀
  14. (附源码)node.js宠物医生预约平台 毕业设计030945
  15. hangfire支持mysql_abp 使用 hangfire结合mysql
  16. 深度揭秘:消费者应如何激活iPhone
  17. 用python写家族树的基本事实
  18. HTML5+WebGL 3D机房开发实例
  19. android版游戏键盘,游戏键盘(GameKeyboard)
  20. cocos2d 3.3 lua 代码加密 luac

热门文章

  1. 无法访问tomcat的解决方案?
  2. jacobWord案例
  3. 如何查看己连接的Wi-Fi密码
  4. 你公司哪个部门是“老大”?
  5. 谷歌浏览器那些有趣的隐藏功能
  6. 为什么苹果允许「自助修 iPhone」这件事,与每个人息息相关?
  7. 2、yaml语法注解
  8. js文本框设置必填项_Jquery文本框小例(必填框)
  9. 郑州大学中外合作计算机科学与技术,郑州大学中外合作办学历年分数线
  10. mybatis注解开发动态sql