差分做法,只有三十分,实在是找不出错了,求助
查看原帖
差分做法,只有三十分,实在是找不出错了,求助
177604
LXH5514楼主2021/6/1 15:01

爆炸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;
}
2021/6/1 15:01
加载中...