工大培訓——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語言
- 勢能線段樹專題
- 洛谷題單指南-線段樹-P3373 【模板】線段樹 2
- 【題解】Solution Set - NOIP2024集訓Day2 線段樹
- 線段樹也能是 Trie 樹 題解
- 線~段~樹
- 線段樹
- 【UI設計培訓】字型設計-偏旁部首變形UI
- 區間演算法題用線段樹可以秒解?演算法
- 【題解】Solution Set - NOIP2024集訓Day7 李超線段樹
- 線段樹分治略解&雜題解析
- 線段樹模板
- 線段樹--RMQMQ
- 01 線段樹
- 線段樹 hate it
- 【模版】線段樹
- C135 線段樹分治 P5631 最小mex生成樹
- 藍橋杯 演算法訓練 操作格子 (線段樹)演算法
- web應用安全培訓教程之reactWebReact
- ut.cpp 最大線段並減線段交 [線段樹]
- 【題解】Solution Set - NOIP2024集訓Day3 權值線段樹、動態開點、主席樹
- 權值線段樹
- 線段樹筆記筆記
- Segment Tree(線段樹)
- 線段樹入門
- 李超線段樹
- 線段樹進階
- FPGA影片、影像處理應用方向培訓FPGA
- CF EDU165-E-序列問題,線段樹
- 線段樹擴充套件套件
- 第二課——線段樹
- 線段樹簡單思路
- 深入理解線段樹
- 線段樹(毒瘤)總結
- POJ 3667 Hotel 線段樹
- poj 2667 hotel 線段樹