题意

有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(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. 查看 Linux 系统服务的 5 大方法

    Linux 系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务. 在本文中,良许将为大家介绍如何列出 Linux 系统里所有运行的服务,以及如何检查某个服务 ...

  2. 如何用Keil MDK5创建新项目

    1.安装相应软件 2.创建与Build项目 创建项目 下载与调试— ST-Link

  3. c++日志工具spdLog

    c++日志工具spdLog简单使用示例代码 spdlog直接引用头文件就可以使用,这一点还是比较方便的,也是刚入门使用,下面是在源码的示例代码基础上修改测试的代码: #include <cstd ...

  4. 微信公众号里放XLS链接

    微信公众号里放XLS链接 我们都知道创建一个微信公众号在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件,如:xls,word等 ...

  5. 2020-08-01:MySQL 的数据如何恢复到任意时间点?

    福哥答案2020-08-01: 恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提.恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间 ...

  6. C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3736 访问. 给定一个包含了一些 0 和 1的非空二维数组 gr ...

  7. Deep learning-based personality recognition from text posts of online social networks 阅读笔记

    文章目录 一.摘要 二.模型过程 1.文本预处理 1.1 文本切分 1.2 文本统一 2. 基于统计的特征提取 2.1 提取特殊的语言统计特征 2.2 提取基于字典的语言特征 3. 基于深度学习的文本 ...

  8. CPF 入门教程 - 数据绑定和命令绑定(二)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) 数据绑定和Wpf类似,支持双向绑定.数据绑定和命令绑定是UI和业务逻辑分离的基础 ...

  9. 阿里P8架构师大话设计模式,体会乐与怒的程序人生中值得回味一幕

    本书特色 本书有两个特色,第一特色是重视过程.看了太多的计算机编程类的图书,大多数书籍都是集中在讲授优秀的解决方案或者一个完美的程序样例,但对这些解决方案和程序的演变过程却重视不够,好书之所以好,就是 ...

  10. echars 饼图使用

    option = {       tooltip: {         trigger: 'item',         formatter: '{a} <br/>{b}: {c} ({d ...