Codeforces1250C Trip to Saint Petersburg 线段树
题意
有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(k\)块钱,然后在圣彼得堡有\(n\)个兼职工作\(l_i,r_i,p_i\),如果这个人在\(l_i\)到\(r_i\)这个时间段都在圣彼得堡,那么他就可以赚到\(p_i\)块钱,现在他要规划旅游计划\(\left[ L,R\right]\),表示他会在\(L\)到达,在\(R\)离开,要求给出赚钱最多的方案。
解题思路
线段树区间加法,单点最大值及取得最大值的下标。
将兼职工作挂到右端点上,然后枚举离开的时间,枚举到\(i\)时,就对区间\(\left[1,i\right]\)进行区间减\(k\),然后对于以\(i\)为右端点的询问\((l,r,p)\)对区间\(\left[1,l\right]\)进行区间加\(p\)。这样,对于线段树维护的序列,记为\(A\),\(A_j\)即表示第\(j\)天到达,第\(i\)天离开能获取的最大利润,然后每次更新即可。
解题代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pi;
typedef tuple<ll,int,int> tp;
const int maxn=2e5+5;
int n;
ll k;
pi v[maxn<<2];
ll tag[maxn<<2];
void push_down(int x){
if(tag[x]){
tag[x<<1]+=tag[x]; tag[x<<1|1]+=tag[x];
v[x<<1].first+=tag[x]; v[x<<1|1].first+=tag[x];
tag[x]=0;
}
}
void build(int x,int l,int r){
if(l==r){
v[x]=make_pair(0LL,l);
return;
}
int mid=(l+r)>>1;
build(x<<1,l,mid); build(x<<1|1,mid+1,r);
v[x]=max(v[x<<1],v[x<<1|1]);
}
void update(int x,int l,int r,int L,int R,ll val){
if(l==L && r==R){
tag[x]+=val;
v[x].first+=val;
return;
}
push_down(x);
int mid=(l+r)>>1;
if(R<=mid)update(x<<1,l,mid,L,R,val);
else if(L>mid)update(x<<1|1,mid+1,r,L,R,val);
else{
update(x<<1,l,mid,L,mid,val);
update(x<<1|1,mid+1,r,mid+1,R,val);
}
v[x]=max(v[x<<1],v[x<<1|1]);
}
pi query(int x,int l,int r,int L,int R){
if(l==L && r==R)return v[x];
push_down(x);
int mid=(l+r)>>1;
if(R<=mid)return query(x<<1,l,mid,L,R);
else if(L>mid)return query(x<<1|1,mid+1,r,L,R);
return max(query(x<<1,l,mid,L,mid),query(x<<1|1,mid+1,r,mid+1,R));
}
vector<tp>q[maxn];
vector<int>ans;
int main()
{
scanf("%d %lld",&n,&k);
int l,r; ll p;
build(1,1,2e5);
for(int i=1;i<=n;i++){
scanf("%d %d %lld",&l,&r,&p);
q[r].push_back(make_tuple(p,l,i));
}
p=0;int L,R;
for(int i=1;i<=2e5;i++){
update(1,1,2e5,1,i,-k);
for(tp P:q[i])update(1,1,2e5,1,get<1>(P),get<0>(P));
if(v[1].first>p){
p=v[1].first; L=v[1].second; R=i;
}
}
if(p<=0)printf("0\n");
else{
for(int i=L;i<=R;i++){
for(tp P:q[i])if(get<1>(P)>=L)ans.push_back(get<2>(P));
}
printf("%lld %d %d %d\n",p,L,R,(int)ans.size());
for(int id:ans)printf("%d ",id);
}
return 0;
}
Codeforces1250C Trip to Saint Petersburg 线段树的更多相关文章
- 离散化+线段树 POJ 3277 City Horizon
POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...
- poj City Horizon (线段树+二分离散)
http://poj.org/problem?id=3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissi ...
- POJ3321/Apple tree/(DFS序+线段树)
题目链接 Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9692 Accepted: 3217 Descr ...
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- 【BZOJ】1645: [Usaco2007 Open]City Horizon 城市地平线(线段树+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1645 这题的方法很奇妙啊...一开始我打了一个“离散”后的线段树.............果然爆了. ...
- HDU 6162 Ch’s gift (树剖 + 离线线段树)
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 D 80 Days (线段树查询最小值)
题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...
- Luogu P3459 [POI2007]MEG-Megalopolis(线段树)
P3459 [POI2007]MEG-Megalopolis 题意 题目描述 Byteotia has been eventually touched by globalisation, and so ...
随机推荐
- JVM系列之:从汇编角度分析Volatile
目录 简介 重排序 写的内存屏障 非lock和LazySet 读的性能 总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了.Volatile是JMM(Java Memory ...
- 介绍一种 Python 更方便的爬虫代理池实现方案
现在搞爬虫,代理是不可或缺的资源 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...
- HIVE常用正则函数(like、rlike、regexp、regexp_replace、regexp_extract)
Oralce中regex_like和hive的regexp对应 LIKE 语法1: A LIKE B 语法2: LIKE(A, B) 操作类型: strings 返回类型: boolean或null ...
- Python爬虫获取百度贴吧图片
#!/usr/bin/python# -*- coding: UTF-8 -*-import urllibimport re文章来源:https://www.cnblogs.com/Axi8/p/57 ...
- 2-1关闭和重启linux系统
0x01 shutdown命令 语法:shutdown [选项][时间][警告信息] 选项 含义 -k 并不执行shutdown,只是发出警告信息 -r 重新启动系统 -h 关闭系统 -c 取消运行s ...
- mycat数据库集群系列之mycat读写分离安装配置
最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...
- javaString详解
String基础 Java String 类 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 创建字符串最简单 ...
- 如何理解“异或(XOR)”运算在计算机科学中的重要性?(转自-阿里聚安全)
XOR加密是一种简单高效.非常安全的加密方法 一. XOR 运算 逻辑运算之中,除了 AND 和 OR,还有一种 XOR 运算,中文称为"异或运算". 它的定义是:两个值相同时,返 ...
- linux驱动之模块化编程小总结
本文包含了linux驱动模块化编程的基本,包括创建多线程,延时,以及makefile 以一个实例来说明 #include<linux/init.h> #include<linux/m ...
- JavaScript学习系列博客_32_JavaScript 包装类
包装类 - 在JS中为我们提供了三个包装类: String() Boolean() Number() - 通过这三个包装类可以创建基本数据类型的对象 例子: var num = new Number( ...