标签:
input | output |
---|---|
6 2 6 9 1 4 2 6 1 5 2 3 4 6 3 6 |
36 1 5 6 4
|
分析:贪心+线段树;
按结束时间排序,则尽可能让座位坐满,线段树区间更新判断是否可坐;
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define Lson L, mid, rt<<1 #define Rson mid+1, R, rt<<1|1 const int maxn=1e5+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} int n,m,k,t; vi ans; struct node { int x,y,id; bool operator<(const node&p)const { return y<p.y; } }a[maxn]; struct Node { int Max, lazy; } T[maxn<<2]; void PushUp(int rt) { T[rt].Max = max(T[rt<<1].Max, T[rt<<1|1].Max); } void PushDown(int L, int R, int rt) { int mid = (L + R) >> 1; int t = T[rt].lazy; T[rt<<1].Max += t; T[rt<<1|1].Max += t; T[rt<<1].lazy += t; T[rt<<1|1].lazy += t; T[rt].lazy = 0; } void Update(int l, int r, int v, int L, int R, int rt) { if(l==L && r==R) { T[rt].lazy += v; T[rt].Max += v; return ; } int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt); if(r <= mid) Update(l, r, v, Lson); else if(l > mid) Update(l, r, v, Rson); else { Update(l, mid, v, Lson); Update(mid+1, r, v, Rson); } PushUp(rt); } int Query(int l, int r, int L, int R, int rt) { if(l==L && r== R) { return T[rt].Max; } int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt); if(r <= mid) return Query(l, r, Lson); else if(l > mid) return Query(l, r, Rson); return max(Query(l, mid, Lson) , Query(mid + 1, r, Rson)); } int main() { int i,j; scanf("%d%d%d%d",&n,&m,&k,&t); rep(i,1,k)scanf("%d%d",&a[i].x,&a[i].y),a[i].id=i; sort(a+1,a+k+1); rep(i,1,k) { if(Query(a[i].x,a[i].y-1,1,n,1)<m) { ans.pb(a[i].id); Update(a[i].x,a[i].y-1,1,1,n,1); } } printf("%lld\n",(ll)ans.size()*t); if(ans.size())printf("%d",ans[0]); for(i=1;i<ans.size();i++)printf(" %d",ans[i]); printf("\n"); //system("Pause"); return 0; }
标签:
原文地址:http://www.cnblogs.com/dyzll/p/5858678.html