题意

有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(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 线段树的更多相关文章

  1. 离散化+线段树 POJ 3277 City Horizon

    POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...

  2. poj City Horizon (线段树+二分离散)

    http://poj.org/problem?id=3277 City Horizon Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

  3. POJ3321/Apple tree/(DFS序+线段树)

    题目链接 Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9692 Accepted: 3217 Descr ...

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

  5. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  6. 【BZOJ】1645: [Usaco2007 Open]City Horizon 城市地平线(线段树+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1645 这题的方法很奇妙啊...一开始我打了一个“离散”后的线段树.............果然爆了. ...

  7. HDU 6162 Ch’s gift (树剖 + 离线线段树)

    Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  8. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 D 80 Days (线段树查询最小值)

    题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...

  9. Luogu P3459 [POI2007]MEG-Megalopolis(线段树)

    P3459 [POI2007]MEG-Megalopolis 题意 题目描述 Byteotia has been eventually touched by globalisation, and so ...

随机推荐

  1. day22:面向对象封装对象操作&类操作&面向对象删除操作

    面向对象程序开发 1.类的三种定义方式 class MyClass: pass class MyClass(): #(推荐) pass class MyClass(object): # object类 ...

  2. iptables看门狗

    近来业内很多服务器因redis造成服务器被黑,这个攻击的防范重点在于防火墙!! 有时为了方便我们可能会将iptables临时关闭,方便完倘若忘记把它打开,黑客大摇大摆就走进来. 这时候,我们需要条看门 ...

  3. JS 执行机制笔记

        js同步和异步同步 前一个任务结束以后再执行下面一个任务,程序的执行顺序与任务的排列顺序是一致的 同步任务都在主线程上执行,形成一个执行线 异步 前一个任务没结束之前程序还可以执行别的任务 j ...

  4. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  5. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  6. noip复习——线性筛(欧拉筛)

    整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod\limits _{i=1}^{s}p_{i}^{a_{i}}=A\ ...

  7. HotSpot的垃圾回收器

    如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.这里讨论的收集器基于JDK 1.7 Update 14之后的 HotSpot 虚拟机,这个虚拟机包含的所有收集器如下图所示 上图 ...

  8. FCIS:Fully Convolutional Instance-aware Semantic Segmentation

    论文:Fully Convolutional Instance-aware Semantic Segmentation   目录 0.简介 1.Position-sensitive Score Map ...

  9. 安装centos7显示器分辨率不适配的解决方法

    1,系统读取安装信息后,选择Install Centos7 然后Tab调出参数行 2,在quiet后空格输入nomodeset回车即可

  10. 第五篇Scrum冲刺博客--Interesting-Corps

    第五篇Scrum冲刺博客 站立式会议 1.会议照片 2.队友完成情况 团队成员 昨日完成 今日计划 鲍鱼铭 音乐详情页面跳转.设计及布局实现设计 搜索页面以及音乐详情页面数据导入及测试 叶学涛 编写分 ...