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 时间线段树分治 背包的更多相关文章

  1. 2019.01.13 loj#6515. 贪玩蓝月(线段树分治+01背包)

    传送门 题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi​,vi​),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODM ...

  2. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  3. LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案

    题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...

  4. LOJ#121. 「离线可过」动态图连通性(线段树分治)

    题意 板子题,题意很清楚吧.. Sol 很显然可以直接上LCT.. 但是这题允许离线,于是就有了一个非常巧妙的离线的做法,好像叫什么线段树分治?? 此题中每条边出现的位置都可以看做是一段区间. 我们用 ...

  5. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  6. 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月

    考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...

  7. UOJ46 【清华集训2014】玄学 【时间线段树】

    题目链接:UOJ 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. 天马行空DevOps-Dev平台建设概述

    概述 DevOps(Development和Operations的组合词)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.它是一 ...

  2. Linux环境下Java应用性能分析定位-CPU使用篇

    1     CPU热点分析定位背景 CPU资源还是很昂贵的,为了深刻感受到这种昂贵,间下图当前CPU的资源售价: 所以对于程序猿们来说,需要让程序合理高效的使用CPU资源.利用有限的CPU资源来解决完 ...

  3. 华为中兴借eBay出海 靠零售渠道撬动市场

    在跨境电商领域,大多数中国商家依靠“中国制造”的优势和价格战策略打拼出一条血路,在海外市场占领了自己的一席 之地.不过,山寨货纷纷出海的同时,中国本土的品牌商们也开始了探索海外市场之旅.目前,华为.中 ...

  4. 第四次ScrumMeeting博客

    第四次ScrumMeeting博客 本次会议于10月28日(六)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和 ...

  5. 获取文件夹下某个类型的文件名---基于python

    方法1:import osclass flist_name(): def __init__(self,path): self.flist_name=os.listdir(path) def pcap_ ...

  6. TDGA-需求分析

    李青:绝对的技术控,团队中扮演“猪”的角色,勤干肯干,是整个团队的主心骨,课上紧跟老师的步伐,下课谨遵老师的指令,课堂效率高,他的编程格言“没有编不出来的程序,只有解决不了的bug”. 胡金辉:半两油 ...

  7. QT中文乱码解决方法

    由于我毕设的界面是用Qt做的,之前没怎么接触过Qt,所以实现过程中遇到不少小问题,头一个就是这个. 现如今宝宝将其记录下来,供同样有需要的同学或者自己以后方便查阅. 1.所有文件编码格式须一致 不统一 ...

  8. C++ Primer Plus学习:第十四章

    第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...

  9. Swift-闭包使用及解决循环引用问题

    Swift中闭包使用参考OC中block使用,基本一致 // 闭包类型 首先写(参数列表)->(返回值类型) func loadData(callBack : (jsonData:String) ...

  10. bash 基础

    bash是一些基本的命令组成,要想学好bash脚本,基本命令是必须要记住 红色标记为着重点 1执行命令,利用状态返回值来判断 0 : 成功 1-255:失败 2: 测试表达式 [  expressio ...