如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1424

来自"NOCOW"

跳转到: 导航, 搜索

调map维护下就行。。

#include <cstdio>
#include <map>
#include <algorithm>
#define Delete if(!(--(it->second)))x.erase(it->first)
using namespace std;
int n,m,k,p,tot=0,ans=0;
struct node  {  int l,r,rank;  }v,t[50002];
map<node,int> x;
map<node,int>::iterator it;
bool used[50002]={false};
bool operator < (const node& a,const node& b)
{
    if (a.r == b.r)  return a.l < b.l;
    return a.r < b.r;
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&k,&p);
    for (int i=1;i<=k;t[i].rank=i++)
        scanf("%d%d",&t[i].l,&t[i].r);
    sort(&t[1],&t[k+1]);
    for (int i=1;i<=k;++i)
    {
        v.rank=t[i].rank,v.l=-1,v.r=t[i].l;
        it=x.upper_bound(v);
        v.l=-v.rank,v.r=t[i].r;
        bool null=(it==x.begin());
        if (!null)  --it;
        if (tot < m)
        {
            if (!null)  {  Delete;  --tot;  }
            ++x[v],++tot;
        }
        else if (!null)  {  Delete;  ++x[v];  }
        else  ++ans,used[t[i].rank]=true;
    }
    printf("%d\n",(k-ans)*p);
    for (int i=1;i<=k;++i)  if (!used[i])  printf("%d ",i);
    printf("\n");
    return 0;
}
//by zzy
个人工具