魔道研究

题面

思路

简单的想,就是在 \(T\) 个可重集合每个中选出 \(k\) 个最大的数组成新的可重集合,其中 \(k\) 为其编号

然后在新的集合中选前 \(n\) 大的数,求其和

考虑开 \(T + 1\) 个权值线段树,维护对应的 \(T\) 个可重集合和答案可能在的第 \(T + 1\) 个代表新的集合的线段树

由于空间限制,我们需要动态开点(其实动态开点很简单,线段树二分下去时,遇到一个空节点再使用它。如此一来,在只需开可能使用的节点数)

然后维护区间个数,区间和(注意一个点可能有多个数)

因为是动态开点,所以再记录它的左、右子树的编号

对于 \(B\) 操作,我们直接在根为 \(t\) 的线段树中加入,然后考虑它能不能进入第 \(T + 1\) 棵线段树成为可能的答案。

即查它在第 \(t\) 棵线段树中的从大到小的排名(其实就是求第 \(t\) 棵线段树中 \(p\) 到上限的个数)和)。

如果它的排名 \(\leq t\) ,则可能加入第 \(T + 1\) 个线段树。加入后把现在排名为 \(t+1\) 的数从第 \(T + 1\) 棵线段树中删去(即原先的排名为 \(t\) 的数,它在第 \(T + 1\) 棵线段树中),当然,如果有的话。

对于 \(R\) 操作,就是 \(B\) 操作的逆操作,具体见代码。

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL; const int N = 3e5 , Len = 1e9;
int n , m , tot , len = N + 1;
LL tr[18000005][5]; inline void New(int t , int x){if (!tr[t][x]) tr[t][x] = ++len;} inline void update(int t , int l , int r , int p , int v)
{
tr[t][2] += (LL)v;
tr[t][3] += (LL)p * v;
if (l == r) return;
int mid = (l + r) >> 1;
if (p <= mid)
{
if (!tr[t][0]) New(t , 0);
update(tr[t][0] , l , mid , p , v);
}
else{
if (!tr[t][1]) New(t , 1);
update(tr[t][1] , mid + 1 , r , p , v);
}
} inline int findk(int t , int l , int r , int x , int y)
{
if (l >= x && r <= y) return (int)tr[t][2];
int res = 0 , mid = (l + r) >> 1;
if (x <= mid && tr[tr[t][0]][2]) res += findk(tr[t][0] , l , mid , x , y);
if (y > mid && tr[tr[t][1]][2]) res += findk(tr[t][1] , mid + 1 , r , x , y);
return res;
} inline int kfind(int t , int l , int r , int k)
{
if (l == r) return k <= tr[t][2] ? l : 0;
int mid = (l + r) >> 1;
if (tr[tr[t][1]][2] < k) return kfind(tr[t][0] , l , mid , k - tr[tr[t][1]][2]);
else return kfind(tr[t][1] , mid + 1 , r , k);
} inline LL query(int t , int l , int r , int k)
{
if (l == r) return 1LL * min(1LL * k , tr[t][2]) * l;
int mid = (l + r) >> 1;
LL res = 0;
if (tr[tr[t][1]][2] <= k)
{
res += tr[tr[t][1]][3];
if (tr[tr[t][0]][2] && k > tr[tr[t][1]][2])
res += query(tr[t][0] , l , mid , k - tr[tr[t][1]][2]);
}
else{
if (tr[tr[t][1]][2]) res += query(tr[t][1] , mid + 1 , r , k);
}
return res;
} int main()
{
freopen("grimoire.in" , "r" , stdin);
freopen("grimoire.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
int t , p;
char op[8];
for(register int i = 1; i <= m; i++)
{
int s1 , s2;
scanf("%s%d%d" , op , &t , &p);
if (op[0] == 'B')
{
update(t , 1 , Len , p , 1);
s1 = findk(t , 1 , Len , p , Len);
if (s1 <= t)
{
update(N + 1 , 1 , Len , p , 1);
s2 = kfind(t , 1 , Len , t + 1);
if (s2) update(N + 1 , 1 , Len , s2 , -1);
}
}
else{
s1 = findk(t , 1 , Len , p , Len);
update(t , 1 , Len , p , -1);
if (s1 <= t)
{
update(N + 1 , 1 , Len , p , -1);
s2 = kfind(t , 1 , Len , t);
if (s2) update(N + 1 , 1 , Len , s2 , 1);
}
}
printf("%lld\n" , query(N + 1 , 1 , Len , n));
}
}

JZOJ 4270.【NOIP2015模拟10.27】魔道研究的更多相关文章

  1. JZOJ 4269. 【NOIP2015模拟10.27】挑竹签

    4269. [NOIP2015模拟10.27]挑竹签 (File IO): input:mikado.in output:mikado.out Time Limits: 1000 ms  Memory ...

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

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

  3. [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)

    题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...

  4. [NOIP2015模拟10.27] 挑竹签 解题报告(拓扑排序)

    Description 挑竹签——小时候的游戏夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签.如果动了其他的竹签,就要换对手来挑.在所有 ...

  5. JZOJ 4273. 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语

    4273. [NOIP2015模拟10.28B组]圣章-精灵使的魔法语 (File IO): input:elf.in output:elf.out Time Limits: 1000 ms  Mem ...

  6. JZOJ 4272. 【NOIP2015模拟10.28B组】序章-弗兰德的秘密

    272. [NOIP2015模拟10.28B组]序章-弗兰德的秘密 (File IO): input:frand.in output:frand.out Time Limits: 1000 ms  M ...

  7. [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)

    题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...

  8. [NOIP2015模拟10.22] 最小代价 解题报告 (最小生成树)

    Description 给出一幅由n个点m条边构成的无向带权图.其中有些点是黑点,其他点是白点.现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得 ...

  9. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  10. [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)

    题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...

随机推荐

  1. Iris_data_analysis

    SVM调用实例--鸢尾花 任务描述: 构建一个模型,根据鸢尾花的花萼和花瓣大小将其分为三种不同的品种. 数据集: 每一行数据由4个特征值及1个目标值组成,4个特征值分别为:萼片长度.萼片宽度.花瓣长度 ...

  2. 将 Vue.js 项目部署至静态网站托管,并开启 Gzip 压缩

    摘要:关于使用 Nginx 开启静态网站 Gzip 压缩的教程已经有很多了,但是好像没几个讲怎么在对象存储的静态网站中开启 Gzip 压缩.其实也不复杂,我们一起来看下~ 本文分享自华为云社区< ...

  3. MYSQL快速安装整理

    参考教程:https://www.cnblogs.com/brad93/p/16650780.html [检查是否已安装过] find / -name mysql [快速安装开始] groupadd  ...

  4. 【面试题总结】JVM01-组成及垃圾回收

    一.概念 1.JVM组成及作用 (1)组成:类加载器.运行时数据区(Java内存模型).执行引擎.本地库接口 (2)作用: 类加载器(ClassLoader)把class文件转换成字节码: 运行时数据 ...

  5. TypeScript 之 Type

    Type 描述:全称叫做 '类型别名',为类型字面量提供名称.比 Interface 支持更丰富的类型系统特性. Type 与 Interface 区别 Interface 只能描述对象的形状,Typ ...

  6. jupyter 数据显示设置

    #设置显示行数pd.set_option('display.max_row',None)#设置显示列数pd.set_option('display.max_column',None)#设置显示宽度pd ...

  7. ORM数据增删改查 django请求生命周期 django路由层 反向解析

    目录 可视化界面之数据增删改查 补充 1.建表 2.数据展示功能 3.数据添加功能 4.数据编辑功能 5.数据删除功能 django请求生命周期流程图 crsf wsgirel 与 uwsgi ngi ...

  8. python 爬虫可视化,天气

    网站地址='https://lishi.tianqi.com/chengdu/201704' import matplotlib.pyplot as plt import requests from ...

  9. Sql Server中order by对varchar类型排序结果不对

    1.问题描述 我写一个sql想要把查询结果根据LineNumber升序进行排序,即1.0,1.1,1.2,...1.3.2....2.0,......10.0,......15.2,......这样子 ...

  10. [OpenCV实战]41 嵌入式计算机视觉设备选择

    文章目录 1 简介 1.1 深度学习与传统计算机视觉 1.2 性能考量 1.3 社区支持 2 结论 3 参考 在计算机视觉领域中,不同的场景不同的应用程序需要不同的解决方案.在本文中,我们将快速回顾可 ...