工大培訓——day5 C題 線段樹變形應用
題目大意:在外打工的小明,帶著父親的一張並沒有錢的信用卡,每次他花錢或者掙得錢時都要給父親寫信匯報,但是父親收到信的順序和他寄信的順序不同,每次接到信後,父親都要估算一下他信用卡已經透支多少了(本題的題意是小明只會花父親的錢,並不會把自己掙得的錢存到父親的卡里,但是他自己有錢,就不會繼續透支父親的卡)
解題思路:每次的寫信時間看做是一個時間點,其花的錢或者是掙得錢都只能更新該時間點之後的時間對應的錢數,用一個線段樹維護,最後查詢只有查詢根節點。時間卡的很緊,我用常規的線段樹寫超時了。
#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
*/
相關文章
- 線段樹差分及其應用
- 簡單的線段樹應用
- 線段樹詳解 (原理,實現與應用)
- C/C++ Qt TreeWidget 單層樹形元件應用C++QT元件
- C++演算法 線段樹C++演算法
- C語言 編寫線段樹C語言
- CF19D 線段樹+STL各種應用
- 線~段~樹
- 【UI設計培訓】字型設計-偏旁部首變形UI
- 區間演算法題用線段樹可以秒解?演算法
- 線段樹 hate it
- 01 線段樹
- 線段樹--RMQMQ
- 線段樹模板
- 藍橋杯 演算法訓練 操作格子 (線段樹)演算法
- Codeforces 52C (線段樹區間更新)
- web應用安全培訓教程之reactWebReact
- 線段樹筆記筆記
- 線段樹入門
- 權值線段樹
- HDU 1556 Color the ball 線段樹入門題
- FPGA影片、影像處理應用方向培訓FPGA
- 線段樹(毒瘤)總結
- 線段樹模板總結
- 深入理解線段樹
- 線段樹入門理解
- 第二課——線段樹
- 線段樹簡單思路
- 線段樹 - 多組圖帶你從頭到尾徹底理解線段樹
- 資料結構之樹( 線段樹,字典樹)資料結構
- POJ 2777 Count Color 線段樹入門題
- CF EDU165-E-序列問題,線段樹
- FLOW-3D水利行業應用培訓3D行業
- 培訓的螢幕廣播網路應用
- java培訓分享:java培訓架構師學習線路圖Java架構
- 資料結構-線段樹資料結構
- 關於線段樹基礎
- 淺談線段樹(Segment Tree)