爆炸OJ上交第一个点wa在第107行,非常无奈。
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c-'0'),c=getchar();
return x*f;
}
const int MAXN=1e5+10;
int n,k,m,cnt=0;
struct node
{
int l,r;
friend bool operator <(node x,node y)
{
if(x.l==y.l)return x.r>y.r;
return x.l<y.l;
}
}a[MAXN];
int b[MAXN],c[MAXN],l[MAXN],r[MAXN];
int d[MAXN],tail,num;
int g[MAXN],f[MAXN];
int main()
{
freopen("1.in","r",stdin);
n=read();
k=read();
m=read();
for(int i=1;i<=m;i++)
{
int x,y,z;
x=read();
y=read();
z=read();
if(z==1)a[++cnt].l=x,a[cnt].r=y;
else b[x]++,b[y+1]--;
}
for(int i=1,tot=0;i<=n;i++)
{
b[i]+=b[i-1];
if(b[i]==0)
{
tot++;
l[i]=tot;
r[i]=tot;
c[tot]=i;
}
}
for(int i=1;i<=n;i++)if(r[i]==0)r[i]=r[i-1];
if(r[n]<k)
{
printf("%d\n",-1);
return 0;
}
l[n+1]=n+1;
for(int i=n;i>=1;i--)if(l[i]==0)l[i]=l[i+1];
num=cnt;
cnt=0;
for(int i=1;i<=num;i++)a[++cnt].l=l[a[i].l],a[cnt].r=r[a[i].r];
num=0;sort(a+1,a+1+cnt);
for(int i=1;i<=cnt;i++)
{
while(tail>0&&a[i].r<=a[d[tail-1]].r)tail--;
d[tail++]=i;
}
if(tail==k)
{
for(int i=0;i<tail;i++)
printf("%d\n",c[a[d[i]].r]);
return 0;
}
for(int i=0;i<tail;i++)
a[i+1].l=a[d[i]].l,a[i+1].r=a[d[i]].r;
for(int i=1,last=0,sum=0;i<=tail;i++)
{
if(a[i].l>a[last].r)last=i,sum++;
g[i]=sum;
}
for(int i=tail,last=0,sum=0;i>=1;i--)
{
if(last==0||a[i].r<a[last].l)last=i,sum++;
f[i]=sum;
}
if(g[tail]>k){
printf("-1\n");
return 0;
}
num=0;
for(int i=1;i<=tail;i++)
{
if(f[i]==f[i-1])continue;
if(a[i].l==a[i].r)printf("%d\n",c[a[i].l]),num++;
else
{
int x=a[i].r-1;
int l=1,r=i-1,mid=(l+r)>>1;
int xx=0,yy=tail+1;
while(l<=r)
{
if(a[mid].r<x)l=mid+1,xx=mid;
else r=mid-1;
mid=(l+r)>>1;
}
l=i+1,r=tail,mid=(l+r)>>1;
while(l<=r)
{
if(a[mid].l>x)r=mid-1,yy=mid;
else l=mid+1;
mid=(l+r)>>1;
}
if((g[xx]+f[yy]+1)>k)printf("%d\n",c[a[i].r]),num++;
}
}
if(num==0)printf("-1\n");
return 0;
}