题意:一辆车,从1点到n点,车上只有m个位置,载一个客人p块钱。承载哪些客人可以使收入最大。最大是多少,输出这些人。
可以中贪心。按下车的先后顺序排列。尽量让客车满载。
第八组数据大概长这副摸样:
10 3 3 1
1 3
1 3
1 3
使用了各种stl啊。。。。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <deque>
#include <string>
#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define SF scanf
#define PF printf
#define MM(a,v) memset(a,v,sizeof(a))
#define REP(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define REPD(i,a,b) for(int (i)=(a);(i)>(b);(i)--)
#define N 100009
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define BUG puts("bug")
#define PP pair<int,int>
using namespace std;
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int n,m,k,p;
multiset<PP> st;
priority_queue<int, vector<int>, greater<int> > que;
multimap<PP,int> mp;
vector<int> L;
int tree[N<<2];
int wt[N<<2];
void build()
{
MM(tree,0);
MM(wt,0);
}
void pushd(int rt)
{
if(wt[rt])
{
wt[rt<<1] += wt[rt];
wt[rt<<1|1] += wt[rt];
tree[rt<<1] += wt[rt];
tree[rt<<1|1] += wt[rt];
wt[rt] = 0;
}
}
void pushu(int rt)
{
tree[rt] = max(tree[rt<<1],tree[rt<<1|1]);
}
int query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
return tree[rt];
}
pushd(rt);
int m = (l+r)>>1,ans =0;
if(L<=m) ans = max(ans,query(lson,L,R));
if(R>m) ans = max(ans,query(rson,L,R));
return ans;
}
void update(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
tree[rt]++;
wt[rt]++;
return ;
}
int m = (l+r)>>1;
if(L<=m) update(lson,L,R);
if(m<R) update(rson,L,R);
pushu(rt);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int a,b;
SF("%d%d%d%d",&n,&m,&k,&p);
REP(i,0,k)
{
SI(a);
SI(b);
st.insert(PP(b,a));
//mp[PP(a,b)] = i+1;
//P aa = PP(a,b);int bb=i+1;
mp.insert(pair<PP,int>(PP(a,b),i+1));
}
multiset<PP>::iterator it;
build();
while((int)st.size()>0)
{
it = st.begin();
int a = it->second,b=it->first;
if(query(1,1,n,a,b-1)>=m)
{
st.erase(it);
continue;
}
update(1,1,n,a,b-1);
multimap<PP,int>::iterator mi = mp.find(PP(it->second,it->first));
L.push_back(mi->second);
mp.erase(mi);
que.push(it->first);
st.erase(it);
}
cout<<(int)L.size()*p<<endl;
REP(i,0,(int)L.size())
{
if(i) cout<<" ";
cout<<L[i];
}
cout<<endl;
return 0;
}