题意

有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(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系统中玩到让你停不下来的命令行游戏!

    大家好,我是良许. 在使用 Linux 系统时,命令行不仅可以让我们在工作中提高效率,它还可以在生活上给我们提供各种娱乐活动,因为你可以使用它玩许多非常有意思的游戏,这些游戏可都不需要使用专用显卡. ...

  2. Python要点总结,我使用了100个小例子!

  3. Python实现图片滑动式验证识别

    1 abstract 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类 ...

  4. java方法与方法的重载

    一 方法 1.方法的概述 在java中,方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本, 控制输入或计算数值.我们可以 ...

  5. C#LeetCode刷题之#167-两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3903 访问. 给定一个已按照升序排列 的有序数组,找到两个数使得 ...

  6. Vue 引入指定目录文件夹所有的组件 require.context

    require.context require.context是webpack中用来管理依赖的一个函数,此方法会生成一个上下文模块,包含目录下所有的模块的引用,同构正则表达式匹配,然后require进 ...

  7. 5分钟快速了解MySQL索引的各种类型

    文章持续更新,微信搜索「万猫学社」第一时间阅读. 关注后回复「电子书」,免费获取12本Java必读技术书籍. 什么是索引? 索引是数据库存储引擎用于快速查找到指定数据的一种数据结构. 可以用新华字典做 ...

  8. linux上传下载小工具lrzsz

    工具压缩包链接 密码:zbef 1.将压缩包放到linux的任意目录下,执行:tar zxvf lrzsz-0.12.20.tar.gz 解压压缩包 2.cd lrzsz-0.12.20 3../co ...

  9. docker简记

    title: docker学习简记 date: 2019-10-16 15:10:39 tags: docker Docker简记 1:Docker简介 1)出现背景 一款产品从开发到上线,从操作系统 ...

  10. 非对称加密与HTTPS(转)

    序:HTTPS更安全,为什么? 因为HTTP协议本身毫无安全性可言. 当你访问一个纯HTTP的网站(以及与这个网站有任何网络交互)时,你发出去一个请求.在这个请求到达网站服务器的路途上,不管是你家的路 ...