只能说。。我好菜啊QAQ
一开始没注意到重复的区间可能是不连续的,直接WA,先附上错误代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const int INF=0x3f3f3f3f;
const int MAX=1e5+5;
int n,m;
int a[MAX];//从1开始
struct fact
{
int l,r;
}f[MAX];
bool cmp(struct fact a,struct fact b)
{
if(a.l<b.l) return true;
else if(a.l>b.l) return false;
else return a.r>b.r;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d%d",&f[i].l,&f[i].r);
sort(f,f+m,cmp);
int k=f[0].l;
int p=1;
while(k<=f[0].r)
a[k++]=p++;
int pre=f[0].r;
for(int i=1;i<m;i++)
{
if(f[i].r<pre)
continue;
k=f[i].l;
int mi=1e9,ma=-1;
if(k<=pre)
{
mi=a[k],ma=a[pre];//出错点
k=pre+1;p=1;
while(k<=f[i].r)
{
if(p<mi)
a[k++]=p++;
else
{p=ma+1;a[k++]=p++;}
}
pre=f[i].r;
}
else
{
p=1;
while(k<=f[i].r)
a[k++]=p++;
pre=f[i].r;
}
}
for(int i=1;i<=n;i++)
{
if(a[i]==0) printf("1 ");
else printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
如一组样例为:8 3
1 3
3 6
5 8
后两组范围重合部分的数据为“2,4”不连续,错误点为mi=2,ma=4,错误输出如下:
实际上正确答案应该是“1 2 3 1 2 4 1 3”
因此我就GG了_(:з」∠)_
通过向大佬讨教Orz,我用set解决了问题(第一次用QAQ...)
附上AC代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
#define ll long long
const int INF=0x3f3f3f3f;
const int MAX=1e5+5;
int n,m;
int a[MAX];//从1开始
struct fact
{
int l,r;
}f[MAX];
bool cmp(struct fact a,struct fact b)
{
if(a.l<b.l) return true;
else if(a.l>b.l) return false;
else return a.r>b.r;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d%d",&f[i].l,&f[i].r);
sort(f,f+m,cmp);
/*for(int i=0;i<m;i++)
cout<<f[i].l<<" "<<f[i].r<<endl;*/
set<int>s;
s.clear();
for(int i=1;i<=n;i++)//初始化很重要
{
s.insert(i);//1,2,3,4,5,...
a[i]=1;
}
for(int i=f[0].l;i<=f[0].r;i++)
{
a[i]=*s.begin();
s.erase(*s.begin());
}
int p=f[0].r+1;
for(int i=1;i<m;i++)
{
int k=f[i].l;
for(int j=f[i-1].l;j<k;j++)
s.insert(a[j]);
if(k>p)
p=k;//跳过
for(;p<=f[i].r;p++)
{
a[p]=*s.begin();
s.erase(*s.begin());
}
}
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
return 0;
}
后来发现用优先权队列也可以,附上大佬的博客地址: