工大培训——day5 C题 线段树变形应用
来源:互联网 发布:windows重启网络服务 编辑:程序博客网 时间:2024/06/01 10:47
题目大意:在外打工的小明,带着父亲的一张并没有钱的信用卡,每次他花钱或者挣得钱时都要给父亲写信汇报,但是父亲收到信的顺序和他寄信的顺序不同,每次接到信后,父亲都要估算一下他信用卡已经透支多少了(本题的题意是小明只会花父亲的钱,并不会把自己挣得的钱存到父亲的卡里,但是他自己有钱,就不会继续透支父亲的卡)
解题思路:每次的写信时间看做是一个时间点,其花的钱或者是挣得钱都只能更新该时间点之后的时间对应的钱数,用一个线段树维护,最后查询只有查询根节点。时间卡的很紧,我用常规的线段树写超时了。
#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>#include <vector>using namespace std;#define ls (x<<1)#define rs ((x<<1)|1)const int N=111111;int n,a[N],b[N],v[N];long long lazy[N<<2],ans[N<<2];void pushdown(int x){ if(lazy[x]) { lazy[ls]+=lazy[x],lazy[rs]+=lazy[x]; ans[ls]+=lazy[x],ans[rs]+=lazy[x]; lazy[x]=0; }}void pushup(int x){ ans[x]=min(ans[ls],ans[rs]);}void insert(int x,int v,int l,int r,int loc){ if(r<loc) return; if(loc<=l) lazy[x]+=v,ans[x]+=v; else if(l!=r) { pushdown(x); int mid=(l+r)/2; insert(ls,v,l,mid,loc); insert(rs,v,mid+1,r,loc); pushup(x); }}int main(){ cin>>n; for(int i=0;i<n;i++) { int day,mouth,hour,minute; scanf("%d %d.%d %d:%d",v+i,&day,&mouth,&hour,&minute); a[i]=b[i]=((mouth*31+day)*24+hour)*60+minute; } sort(b,b+n); for(int i=0;i<n;i++) { int loc=lower_bound(b,b+n,a[i])-b; insert(1,v[i],0,n-1,loc); cout << min(0LL,ans[1])<<endl; } return 0;}/*5-1000 10.09 21:00+500 09.09 14:00+1000 02.09 00:00-1000 17.09 21:00+500 18.09 13:00*/
0 0
- 工大培训——day5 C题 线段树变形应用
- buy tickrt(线段树)单点更新应用变形
- 工大培训——day3 G题
- Drupal开发培训 Day5
- 培训#2 线段树
- 线段树变形 568,1012
- hdu4027——Can you answer these queries?(线段树+区间更新变形)
- POJ 2828(线段树,思维,逆序数变形题)
- 线段树的应用——刷墙
- “大数据可视化技术与应用”培训
- pku 2777 Count Color(线段树变形)
- hdu4521 线段树or变形LIS
- HDU2795 Billboard 线段树单点更新变形
- 线段树变形(玲珑学院1129)
- C语言:Day5~Day6
- Objective-C:Day5
- 2010 Asia Regional Tianjin Site —— Online Contest (线段树二维转一维,2-SAT,floyed变形)hdu3621-3631
- hdoj 4521 小明系列问题——小明序列 【线段树优化dp or LIS变形】
- ASP表单输入到HTML
- 十三周项目五
- oracle sql 优化
- 数据库的索引
- 实现java导出Excel表
- 工大培训——day5 C题 线段树变形应用
- 在Linux里设置环境变量的方法(export PATH)
- Mysql学习笔记-数据库事务
- AsyncTask3.0修改api
- Eclipse升级ADT
- java修改系统时间
- 第十三周项目六(2)英语成绩统计
- 矩阵的翻转
- SSH常用基础命令