JZOJ 4270.【NOIP2015模拟10.27】魔道研究
魔道研究
题面

思路
简单的想,就是在 \(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】魔道研究的更多相关文章
- JZOJ 4269. 【NOIP2015模拟10.27】挑竹签
4269. [NOIP2015模拟10.27]挑竹签 (File IO): input:mikado.in output:mikado.out Time Limits: 1000 ms Memory ...
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...
- [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)
题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...
- [NOIP2015模拟10.27] 挑竹签 解题报告(拓扑排序)
Description 挑竹签——小时候的游戏夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签.如果动了其他的竹签,就要换对手来挑.在所有 ...
- JZOJ 4273. 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语
4273. [NOIP2015模拟10.28B组]圣章-精灵使的魔法语 (File IO): input:elf.in output:elf.out Time Limits: 1000 ms Mem ...
- JZOJ 4272. 【NOIP2015模拟10.28B组】序章-弗兰德的秘密
272. [NOIP2015模拟10.28B组]序章-弗兰德的秘密 (File IO): input:frand.in output:frand.out Time Limits: 1000 ms M ...
- [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...
- [NOIP2015模拟10.22] 最小代价 解题报告 (最小生成树)
Description 给出一幅由n个点m条边构成的无向带权图.其中有些点是黑点,其他点是白点.现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个黑点,可以选取其中任意一个),我们想要使得 ...
- [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...
- [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)
题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...
随机推荐
- python(牛客)试题解析3 - 困难
导航 一.找到已经最大承重的背包内如何放入最大价值的物品的最优解 二.查找一个字符串中包含另外一个字符串(可打乱顺序)的次数三.计算正整数数组从头走到最后一个成员所需的最小步骤四.计算字符串非严格递增 ...
- 【每日一题】【dfs重载原始函数&循环/函数结束条件&左右下标在数组中位置的确定】2022年2月7日-NC12 由先序和中序遍历重建二叉树
描述给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建 ...
- 【每日一题】【小根堆&边出队边入队后续节点&注意判空】23. 合并K个升序链表-211128/220213
给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 答案1(参数是数组): /** * Definition for singly-linked li ...
- 干电池升压IC或者干电池升压芯片
1, 干电池升压IC 升压输出3V,3,3V,5V等3V-5V可调 2, 单节锂电池升压IC 升压输出4. ...
- aiohttp、asyncio使用协程增加爬虫效率
import aiohttp import asyncio import time async def get_requests(url): async with aiohttp.ClientSess ...
- SpringBoot向Excel模板中写入数据并下载 (无需获取file对象及模板绝对路径)
之前用获取模板路径的方式测试没问题打包后就有问题了 莫名出现一个! 找了很多教程尝试无果 最终使用下面这个方式 无需获取file对象以及模板路径的方式进行写入下载 (那个设置浏览器编码没有测试不知道能 ...
- 说说真实Java项目的开发流程,以及面试前的项目准备说辞
介绍项目是必不可少的Java面试环节,求职者需要借此证明自己真实Java项目的经验,如果再做的好的话,需要借此展开自己的亮点说辞. 不过之前如果只有学习项目经验,比如是自己跑通一个项目,或者是在培训班 ...
- hyperf 配置 https 访问
最近用hyperf写了支付系统,本地调试支付完成,打包上线部署,要解决https协议进行相应的访问,但是hyperf 官方没有找到相关的ssl配置说明.搜了一下soole还是有几个案例说明,据我的了解 ...
- formly-form 动态表单
动态表单库 https://github.com/ngx-formly/ngx-formly 安装 ng add @ngx-formly/schematics --ui-theme=ng-zorro- ...
- vue 实现一键复制功能(两种方式)
方法 一 : <div class="mask-cont"> <p><input id="input" /></p&g ...