【题解】【LibreOJ Round #6】花团 LOJ 534 时间线段树分治 背包
Prelude
题目链接:萌萌哒传送门(/≧▽≦)/
Solution
如果完全离线的话,可以直接用时间线段树分治来做,复杂度\(O(qv \log q)\)。
现在在线了怎么办呢?
这其实是个假在线,因为每个物品的删除时间已经给你了,所以还是直接用时间线段树分治来做。
其实我是重点想谈一下复杂度的,\(O(n^{2} \log n)\)的复杂度居然都可以出到\(15000\),而且居然还跑的飞快?
Code
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ldouble;
typedef pair<int,int> pii;
typedef vector<pii>::iterator viter;
const int MAXN = 15010;
const int LOGN = 17;
const int INF = 0x3f3f3f3f;
int _w;
inline void bmin( int &a, int b ) {
a = b < a ? b : a;
}
inline void bmax( int &a, int b ) {
a = b > a ? b : a;
}
int q, maxv, T, lastans;
struct Knapsack {
int f[MAXN];
void init() {
for( int i = 0; i <= maxv; ++i )
f[i] = -INF;
f[0] = 0;
}
void insert( int v, int w ) {
for( int i = maxv-v; i >= 0; --i )
bmax( f[i+v], f[i]+w );
}
const int &operator[]( int i ) const {
return f[i];
}
int &operator[]( int i ) {
return f[i];
}
};
vector<pii> item[MAXN<<2];
Knapsack f[LOGN];
int qv[MAXN];
pii ins;
int ql, qr;
void insert( int o, int L, int R ) {
if( L >= ql && R <= qr ) {
item[o].push_back(ins);
} else {
int M = (L+R)>>1, lc = o<<1, rc = lc|1;
if( ql <= M ) insert(lc, L, M);
if( qr > M ) insert(rc, M+1, R);
}
}
void query( int i, int d ) {
if( qv[i] != -1 ) {
int v = qv[i];
if( f[d][v] < 0 ) {
puts("0 0");
lastans = 0;
} else {
printf( "1 %d\n", f[d][v] );
lastans = T * (f[d][v] ^ 1);
}
}
if( i == q ) return;
int op;
_w = scanf( "%d", &op );
if( op == 1 ) {
int v, w, e;
_w = scanf( "%d%d%d", &v, &w, &e );
v -= lastans, w -= lastans, e -= lastans;
ins = pii(v, w), ql = i+1, qr = e;
insert(1, 0, q);
} else {
_w = scanf( "%d", qv+i+1 );
qv[i+1] -= lastans;
}
}
void solve( int o, int L, int R, int d ) {
for( viter it = item[o].begin(); it != item[o].end(); ++it )
f[d].insert(it->first, it->second);
if( L == R ) {
query(L, d);
} else {
int M = (L+R)>>1, lc = o<<1, rc = lc|1;
f[d+1] = f[d];
solve(lc, L, M, d+1);
f[d+1] = f[d];
solve(rc, M+1, R, d+1);
}
}
int main() {
_w = scanf( "%d%d%d", &q, &maxv, &T );
f[0].init();
memset(qv, -1, sizeof qv);
solve(1, 0, q, 0);
return 0;
}
【题解】【LibreOJ Round #6】花团 LOJ 534 时间线段树分治 背包的更多相关文章
- 2019.01.13 loj#6515. 贪玩蓝月(线段树分治+01背包)
传送门 题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi,vi),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODM ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案
题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...
- LOJ#121. 「离线可过」动态图连通性(线段树分治)
题意 板子题,题意很清楚吧.. Sol 很显然可以直接上LCT.. 但是这题允许离线,于是就有了一个非常巧妙的离线的做法,好像叫什么线段树分治?? 此题中每条边出现的位置都可以看做是一段区间. 我们用 ...
- LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset
题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...
- 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月
考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...
- UOJ46 【清华集训2014】玄学 【时间线段树】
题目链接:UOJ 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差 ...
- hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]
传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- Codeforces Round #603 (Div. 2) E. Editor 线段树
E. Editor The development of a text editor is a hard problem. You need to implement an extra module ...
随机推荐
- ES6的新特性(14)——Iterator 和 for...of 循环
Iterator 和 for...of 循环 Iterator(遍历器)的概念 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Ma ...
- MacBook Pro 15寸常见问题及修复
苹果MacBook Pro更换SSD硬盘攻略教程 MacBook pro开机黑屏解决 苹果电脑 MAC PRO 开机黑屏了 MacBook Pro 开机后黑屏,怎么办啊 如果 Mac 无法开机 Mac ...
- 2018软工实践—Alpha冲刺(5)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助测试的进行 测试项目运行的服务器环境 ...
- CentOS 7 网卡命名修改为eth0格式
Linux 操作系统的网卡设备的传统命名方式是 eth0.eth1.eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名全自动的.可预知的,缺 ...
- 安装DHCP 服务器 指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码
DHCP服务详解 前言:动态主机配置协议,给局域网内的主机分配IP地址,子网掩码,网关,DNS ARP协议 arp: address resolveing protocol (地址解析协议) 实现:I ...
- Hash(散列函数)简单应用引出解决散列冲突的四种方法
商店允许顾客通过电话订购商品,并在几天后上门自取.商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的).如何组织商店的数据库,以允许更加高效的进行 ...
- c 结构体读取与保存
1.结构体保存到文本 #include <stdio.h> #include <stdlib.h> #include <string.h> #define max ...
- PHP中类中成员及常量
类中成员概述 面向对象编程,是需要通过“对象”去做什么事情(以完成某种任务): 而: 对象总是来源于类: 所以: 面向对象的编程,一切都是从定义类开始: 类中成员分为3大类: 属性: 方法: 常量: ...
- Vue.js 判断对象属性是否存,不存在添加
Vue.set是可以对对象添加属性的,这里item对象添加一个checked属性 //if(typeof item.checked=='undefined'){if(!this.item.checke ...
- AtCoder Regular Contest 074 瞎打记
(很长时间没更新了>_<) 由于机房的网总是奥妙重重,开考30多分钟之后我才登进去... 然后发现T1是个简单枚举,1A.T2是个简单优先队列,1A.T3似乎需要一点推导,先看了T4发现是 ...