热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[权值线段树]JzojP4270魔道研究

Description“我希望能使用更多的魔法。不对,是预定能使用啦。最终我要被大家称呼为大魔法使。为此我决定不惜一切努力。”——《TheGrimoireof

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

 

 

题解
  • 题目大意:有两个操作,①“BORROW”,加入一本i种类的书,它的威力为j  ②“RETURN”,换一本种类i威力j的书
  • 每次输出前N大的书的威力和(要求i种类的书的数量不能大与i)
  • 其实有点像区间第k大的意思,第一眼感觉是数据结构乱搞
  • 这题正解是权值线段树+动态开点
  • "权值线段树"就是在线段树的基础上用数字当下标
  • 考虑一下如何去做
  • 对于一次“BORROW”操作,其实就是找到第N个大的,且要合法的
  • 如果第N的大的比新加入的点小,可以将第N大的点从前N大踢出,将新点打入
  • 对于一次“RETURN”操作,其实就是找到第N+1个大的
  • 将其加入,将要还的书踢出(如果在前N大)
  • 注意MLE,所以要动态开点
代码
 1 #include 
 2 #include
 3 using namespace std;
 4 const int N=300010*2,inf=1000000000;
 5 int tot,root[N],num[N],left[N],right[N];
 6 long long ans,sum[300010];
 7 char ch;
 8 void add(int &x,int l,int r,int k,int f)
 9 {
10     if (!x) x=++tot;
11     if (f) num[x]++,sum[x]+=k; else num[x]--,sum[x]-=k;
12     if (l==r) return;
13     int mid=(l+r)/2;
14     if (k<=mid) add(left[x],l,mid,k,f); else add(right[x],mid+1,r,k,f);
15 }
16 int query(int x,int l,int r,int k)
17 {
18     if (l==r)
19     {
20         ans+=min(k,num[x])*l;
21         return l;
22     }
23     int mid=(l+r)/2;
24     if (num[right[x]]>=k) return query(right[x],mid+1,r,k);
25     else 
26     {
27         ans+=sum[right[x]];
28         return query(left[x],l,mid,k-num[right[x]]);
29     }
30 }
31 int main()
32 {
33     freopen("grimoire.in","r",stdin);
34     freopen("grimoire.out","w",stdout);
35     int n,m,x,y;
36     scanf("%d%d",&n,&m);
37     for (int i=1;i<=m;i++)
38     {
39         scanf("%c",&ch);
40         if (ch=='B')
41         {
42             scanf("ORROW %d %d\n",&x,&y);
43             int k=query(root[x],0,inf,x);
44             add(root[x],0,inf,y,1);
45             if (y>=k)
46             {
47                 add(root[0],0,inf,y,1);
48                 add(root[0],0,inf,k,0);
49             }
50         }
51         else 
52         {
53             scanf("ETURN %d %d\n",&x,&y);
54             int k=query(root[x],0,inf,x+1);
55             add(root[x],0,inf,y,0);
56             if (y>=k)
57             {
58                 add(root[0],0,inf,y,0);
59                 add(root[0],0,inf,k,1);
60             }
61         }
62         ans=0;
63         query(root[0],0,inf,n);
64         printf("%lld\n",ans);
65     }
66     return 0;
67 }

 


推荐阅读
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • JZOJ 1266. 玉米田
    1266.玉米田(cowfood.pasccpp)(FileIO):input:cowfood.inoutput:cowfood.outTimeLimits:1000msMemor ... [详细]
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 目录题目来源题目描述输入描述输出描述用例题目解析算法源码题目来源20200817-数位DP-带49的数_哔哩哔哩_bilibili题目描述求区间[1,n]范围内包 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • P113:集成日志组件 logback 2彩色日志
    第二步,将控制台的日志改成彩色日志,便于查看修改logback.xml文件。 ... [详细]
author-avatar
是远航呀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有