JZOJ 3571. 【GDKOI2014】内存分配
2024-10-21 02:43:39
解析
也就是说建一棵权值线段树维护这些信息。要注意的是每次的最优解必然是 \(b\) 小的先做,故离线排序确定离散后的下标再依次求解
\(Code\)
#include<cstdio>
#include<algorithm>
#define ls (k << 1)
#define rs (ls | 1)
#define LL long long
using namespace std;
const int N = 200005;
int n , m , rd[N];
struct node{
int a , b , id , k;
}e[N] , ind[N];
struct segment{
LL a , b;
}seg[N << 2];
inline bool cmp1(node x , node y){return x.b < y.b;}
inline void insert(int l , int r , int k , int x , segment y)
{
if (l == r)
{
seg[k].a = y.a , seg[k].b = y.b;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) insert(l , mid , ls , x , y);
else insert(mid + 1 , r , rs , x , y);
seg[k].a = seg[ls].a + seg[rs].a;
seg[k].b = max(seg[ls].b , seg[rs].b - seg[ls].a);
}
int main()
{
scanf("%d%d" , &n , &m);
for(register int i = 1; i <= n; i++) scanf("%d%d" , &e[i].a , &e[i].b) , e[i].id = i , ind[i] = e[i];
for(register int i = 1; i <= m; i++)
scanf("%d%d%d" , &e[i + n].k , &e[i + n].a , &e[i + n].b) , e[i + n].id = i + n , ind[i + n] = e[i + n];
sort(ind + 1 , ind + n + m + 1 , cmp1);
for(register int i = 1; i <= n + m; i++) rd[ind[i].id] = i;
for(register int i = 1; i <= n; i++) insert(1 , n + m , 1 , rd[e[i].id] , segment{e[i].a , e[i].b});
for(register int i = 1; i <= m; i++)
{
insert(1 , n + m , 1 , rd[e[i + n].k] , segment{0 , 0});
insert(1 , n + m , 1 , rd[e[i + n].id] , segment{e[i + n].a , e[i + n].b});
rd[e[i + n].k] = rd[e[i + n].id];
printf("%d\n" , seg[1].b);
}
}
最新文章
- Java GUI编程-(项目代码_扫雷_弹钢琴)
- Linux系统下 解决Qt5无法连接MySQL数据库的方法
- MySQL数据库中的哈希加密
- SQL每个用户最后的一条记录
- IE下兼容Css+HTML5
- php反射类 ReflectionClass
- 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
- 大约SQL/NoSQL数据库搜索/思考查询
- The Swift Programming Language-官方教程精译Swift(3)基本运算符
- 图解vue生命周期
- Eclipse 中构建 Maven 项目的完整过程 - SpringBoot 项目
- Creating an LMDB database in Python
- LINQ解析
- 苹果手机显示分享链接的方法html页面
- Hadoop中 Unable to load native-hadoop library for your platform... using builtin-java classes where applicable问题解决
- if else的使用以及如何从键盘获取数值
- WorldWind源码剖析系列:二维点类Point2d和三维点类Point3d
- 如何在O(n)的时间复杂度内找出数组中出现次数超过了一半的数
- TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ...
- BIOS和Bootloader的对比
热门文章
- 微软宣布 S2C2F 已被 OpenSSF 采用
- DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead
- python多线程批量操作交换机
- C# 操作IIS加强版(添加,删除,启动,暂停网站,默认页,绑定信息)
- 《HTTP权威指南》– 4.HTTP连接管理
- CBV如何添加装饰器?
- 如何优化大场景实时渲染?HMS Core 3D Engine这么做
- Java的深拷贝和浅拷贝的区别
- [cocos2d-x]判断两个矩形是否有交叉区域
- 51NOD5213A 【提高组/高分-省选预科 第一场【M】】序列