题意

有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(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. maven项目的运行方式,maven私服的上传下载

    一.maven项目父子工程的运行方式 1.通过父项目的plugin下集成的tomacat run启动 2.通过自身项目的tomcat plugin启动,但前提是所依赖的项目必须全部都install(将 ...

  2. “随手记”开发记录day01

    今天进行了第二次团队会议,并且开始了“随手记”APP的开发. 今天,我们的完成了登陆.注册页面,开始完成记账部分页面和个人信息页面. 完成页面如下:

  3. 20行代码教你用python给证件照换底色

    1.图片来源 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交流.本文只是为了告诉大家:python其实有很多黑科技(牛逼的库),我们既可以用python处理工作中的一些事儿,同时我们也 ...

  4. MyBatis深入理解参数

    目录 一.快速创建mapper文件 二.parameterType 三.MyBatis 传递参数 1. 一个简单参数(掌握) 一.快速创建mapper文件 由于每个接口都要创建一个对应的mapper文 ...

  5. 一篇看懂Socket开发

    Socket[套接字]是什么,对于这个问题,初次接触的开发人员一般以为他只是一个通讯工具. Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发 T ...

  6. C++游戏(大型PC端枪战游戏)服务器架构

    实习期间深入参与到某大型pc端枪战游戏的后端开发中,此游戏由著名游戏工作室编写,代码可读性极高,自由时间对游戏后台代码进行了深入研究,在满足自身工作需要的同时对游戏后台的架构也有了理解,记录在此,以便 ...

  7. .NetCore(Avalonia) 项目dll混淆,Ubuntu 或者deepin操作系统 deb安装包解压,重新打包

    .NetCore(Avalonia) 项目dll混淆,deb安装包解压,重新打包 本文分为两部分,一部分是介绍使用 DotNetReactor6.0 及以上版本混淆.netcore项目的dll. 另一 ...

  8. 简单认识Adam优化器

    转载地址 https://www.jianshu.com/p/aebcaf8af76e 基于随机梯度下降(SGD)的优化算法在科研和工程的很多领域里都是极其核心的.很多理论或工程问题都可以转化为对目标 ...

  9. hdfs学习(一)

    一.hdfs概述 介绍: 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统 .HDFS(Hadoop Distributed File ...

  10. Go热门开源项目大全

    监控系统 项目 简介 Star数 grafana/grafana Grafana 是一个用于监控指标分析和图表展示的工具, 后端支持 Graphite, InfluxDB & Promethe ...