Trip to Saint Petersburg CodeForces-1250 C
题解:
我们首先枚举每个日期i,对于每个日期,对[1,i]区间内的值减去k,代表新增加了一天花费值
如果有了收入我们就把区间[第一天开始,这个工作开始得日子]加上val。
举个栗子:
首先:
看这张图,我们先假设他没有活干,那么假设经过了6天,每天花费对应的值为上图,
1.如果你在第一天去了那个地方,那么到了第六天,对应得花费就是数字1下面对应得数字
2.如果你在第二天去了那个地方,那么到了第六天,对应得花费就是数字2下面对应得数字
……
6.如果你在第六天去了那个地方,那么到了第六天,对应得花费就是数字6下面对应得数字
这样大概就明白了线段树储是如何储存得了。
其次:
如果我们在第4-6天有一份兼职工作,每天转val元,那么我们把这个工作加在区间[1,4]上,如图所示。
1.如果你在第一天去了那个地方,那么到了第六天,对应得花费就是数字1下面对应得数字
2.如果你在第二天去了那个地方,那么到了第六天,对应得花费就是数字2下面对应得数字
……
6.如果你在第四天去了那个地方,那么到了第六天,对应得花费就是数字4下面对应得数字
这里你可能会思考一个问题,如果工作时间再第七天结束怎么办,其实不必考虑这个问题,因为我们是按照每份工作得结束时间进行枚举得,既然他能加到线段树上去,那么结束时间必定是在这个日期之前结束得。
这个地方需要细品,理解了就会做了
其实这个题可以理解为区间最值查询,并且需要输出最值相对应的区间,所以线段树也要维护一下区间范围。
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
struct wazxy{ll l,val,id;wazxy(ll x,ll y,ll z){l=x,val=y,id=z;}
};
vector<wazxy> v[maxn];
ll add[maxn<<2];
ll imax[maxn<<2];
ll section[maxn<<2];
void Add(int node,ll val){add[node]+=val;imax[node]+=val;return ;
}
void push_down(int node){ //这个跟上面的Add函数都是线段树的lazy操作if(!add[node]) return;Add(node*2,add[node]); //pushdownAdd(node*2+1,add[node]);add[node]=0;
}
void build(int node,int start,int ends){ //新键线段树,这里新建的目的是要维护左端点值if(start==ends){section[node]=start; //更新区间左端的值return;}int mid=(start+ends)/2;build(node*2,start,mid);build(node*2+1,mid+1,ends);
}void update(int node,int start,int ends,int l,int r,ll val){ //更新区间操作if(start>=l&&ends<=r){Add(node,val);return;}int mid=(start+ends)/2;push_down(node);if(l<=mid) update(node*2,start,mid,l,r,val);if(r>mid) update(node*2+1,mid+1,ends,l,r,val);//跟平时不同的是,不仅要对最值进行更新,// 同时也需要对每个最值对应的范围进行更新操作imax[node]=max(imax[node*2],imax[node*2+1]);if(imax[node]==imax[node*2]) section[node]=section[node*2]; //看看这个总的max是取了哪边区间的,对应更新其区间值else section[node]=section[node*2+1];}
int main(){ll n,k,ma=0;cin>>n>>k;for(int i=0;i<n;i++){ll x,y,val;scanf("%lld%lld%lld",&x,&y,&val);v[y].push_back(wazxy(x,val,i+1)); //这里吧y时间结束的的放在一个容器中,避免了排序ma=max(ma,y);}build(1,1,ma);ll ans=0,l,r;for(int i=1;i<=ma;i++){update(1,1,ma,1,i,-k);for(auto it : v[i]) update(1,1,ma,1,it.l,it.val);pair<ll,ll> z=make_pair(imax[1],section[1]);if(z.first>ans){ //更新答案区间ans=z.first,l=z.second,r=i;}}if(ans==0) cout<<0<<endl;else{vector<ll> aa; for(int i=l;i<=r;i++){for(auto it : v[i]){if(it.l>=l) aa.push_back(it.id);}}printf("%lld %lld %lld %d\n",ans,l,r,aa.size());for(auto it : aa) printf("%lld ",it);cout<<endl;}return 0;
}
Trip to Saint Petersburg CodeForces-1250 C相关推荐
- Codeforces 1250 G Discarding Game —— 贪心
This way/a> 题意: 现在你和一个机器人在比赛,共有n个回合,从1到n,每回合你会得到a[i]点值,机器人会得到b[i]点值,规则入下: 当有一个人的值大于等于k,那么这个人就会输掉比 ...
- Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp
E. Mahmoud and a xor trip 链接: http://codeforces.com/contest/766/problem/E 题意: 给定一颗n节点的树以及每个节点的权值,另di ...
- 2019 6月编程语言_今年六月您可以开始学习650项免费的在线编程和计算机科学课程...
2019 6月编程语言 Seven years ago, universities like MIT and Stanford first opened up free online courses ...
- 夏天和空调_您可以在今年夏天开始学习650项免费的在线编程和计算机科学课程...
夏天和空调 Seven years ago, universities like MIT and Stanford first opened up free online courses to the ...
- 2020年国际学术会议参考列表
IJAC年度重磅分享:2020重要国际学术会议列表,涵盖机器学习.人工智能.计算机视觉.模式识别.自动控制.机器人几大领域,部分未列入表格的会议,或未正式发布会讯,或为两年至三年举办一次.如会议网站无 ...
- 使用同一个目的port的p2p协议传输的tcp流特征相似度计算
结论: (1)使用同一个目的port的p2p协议传输的tcp流特征相似度高达99%.如果他们是cc通信,那么应该都算在一起,反之就都不是cc通信流. (2)使用不同目的端口的p2p协议传输的tcp流相 ...
- Using Headless Mode in the Java SE Platform--转
原文地址: By Artem Ananiev and Alla Redko, June 2006 Articles Index This article explains how to use ...
- MySQL coalesce()函数
转载自 MySQL coalesce()函数 MySQL COALESCE函数介绍 下面说明了COALESCE函数语法: COALESCE(value1,value2,...); COALESCE函 ...
- 从JDBC ResultSet创建对象流
Java 8中引入了Stream API和Lambda功能 ,使我们能够从JDBC ResultSet优雅地转换为仅提供映射功能的对象流. 这种功能当然可以是lambda. 基本上,这个想法是使用Re ...
最新文章
- plt.xlabel 'str' object is not callable
- Linux 安装 TigerVNC
- CentOS 7系统上部署Apache+PHP+MariaDB+xcache使用rpm,php module
- java boolean 对象_为什么Java后端用Boolean属性筛选不出对象,但改成String类型就可以了?...
- oracle当前用户创建的表不可见?
- [Leetcode] Path Sum II路径和
- Denise God Mode for mac(磁带饱和器音频插件)
- 不高兴INTEL挤牙膏,技术天才Jim Keller愤而辞职
- 制作pip源(按需,非镜像方式)
- 数中唯一只出现一次的数字
- 我的世界java种子 要塞,《我的世界》你绝对没见过的稀奇种子,恐龙骨架出现在要塞...
- WIN10访问linux分区「ext2fsd」
- Linux redis常用命令
- ABBYY教程—PDF识别模式如何使用?
- java时间戳的单位_java – SimpleDateFormat – 解析时间戳,以毫秒为单位
- 卡耐基梅隆大学计算机科学,卡耐基梅隆大学之计算机科学系
- 备品管理方案怎么写_备品备件管理制度62802
- 霸屏三大综艺 小度强势破圈引发“胜利者效应”
- excel切片器显示错误_带切片器的Excel弹出选择器工具
- 初探QQ空间本地安全问题!