debug好难受啊,这个题竟然用了我小半天的时间
主要在细节问题上容易出错,这种贪心思路是很好想的
详细看代码吧,容易出错的地方我加了注释
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;const int maxn=100000+100;struct Node{int l,r;
}node[maxn];
int ans[maxn];inline bool cmp(Node a,Node b){return a.l==b.l?a.r<b.r:a.l<b.l;
}int main(){int T;scanf("%d",&T);while(T--){priority_queue<int,vector<int>,greater<int> >que; int n,m;scanf("%d%d",&n,&m);for(int i=0;i<m;i++) scanf("%d%d",&node[i].l,&node[i].r);sort(node,node+m,cmp);for(int i=1;i<=n;i++) que.push(i); //整个区间最多需要n种数,基于贪心,当然是[1,n] for(int i=node[0].l;i<=node[0].r;i++) ans[i]=que.top(),que.pop();Node now=node[0]; // 现在所在的区间 for(int i=1;i<m;i++){if(node[i].r<=now.r) continue; //此时node[i].r<=now.r ,又node[i].l>=now.l ,这个区间就没有必要了 for(int j=now.l;j<=now.r && j<node[i].l;j++) que.push(ans[j]); //释放前一个区间不与当前区间相交的区间,注意 j<=now.r && j<node[i].l ,有可能不相交 for(int j=max(now.r+1,node[i].l);j<=node[i].r;j++){ //注意 j=max(now.r+1,node[i].l), 还是因为有可能不相交 ans[j]=que.top(),que.pop();}now=node[i]; //更新现在所在的区间 }for(int i=1;i<=n;ans[i]=0,i++) printf("%d%c",ans[i]?ans[i]:1,i==n?'\n':' '); //ans[]==0,说明是没有必要不一样的,基于贪心,就都为1,记得ans[]要清0 }
}