標籤:sdi double stream getchar char dig 修複 pre span
題意:n個建築,每個都需要修複,需要$t_i$的時間
若在$w_i$時之前還沒修好,則GG
問最多能修幾個
按GG時間排序
設當前建築為i
若i能修,就修了
若不能修,在堆(維護$t_i$最大值)中找到之前最大的$t_j$
若$t_j>t_i$那麼很顯然修當前的更優,就進行反悔操作
不修j了,修i
#include<cstdio>#include<iostream>#include<cstring>#include<cctype>#include<queue>#include<algorithm>using namespace std;#define int long long#define olinr return#define _ 0#define love_nmr 0#define DB doublepriority_queue<int> q;inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch==‘-‘) f=-f; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}inline void put(int x){ if(x<0) { x=-x; putchar(‘-‘); } if(x>9) put(x/10); putchar(x%10+‘0‘);}int n;struct node{ int t1; int t2; friend bool operator < (const node &a,const node &b) { return a.t2<b.t2; }}a[155050];int ans;signed main(){ n=read(); for(int i=1;i<=n;i++) { a[i].t1=read(); a[i].t2=read(); } sort(a+1,a+n+1); int t=0; q.push(0); for(int i=1;i<=n;i++) { if(t+a[i].t1>a[i].t2) { if(a[i].t1<q.top()) { t-=q.top(); q.pop(); q.push(a[i].t1); t+=a[i].t1; } } else { q.push(a[i].t1); ans++; t+=a[i].t1; } } put(ans); olinr ~~(0^_^0)+love_nmr;}
P4053 [JSOI2007]建築搶修