专栏文章

题解:AT_arc190_a [ARC190A] Inside or Outside

AT_arc190_a题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqj33yj
此快照首次捕获于
2025/12/04 05:37
3 个月前
此快照最后确认于
2025/12/04 05:37
3 个月前
查看原文
赛时没有思路,但同机房的lbr巨佬一眼秒

首先,作为第一题,且赛时有人速通,再加上表意不明的题面,可知本题应为诈骗题。
可以手玩一下小样例或打表。然后可以发现一些性质:
  1. 答案不会超过3(可证)
  2. 答案为3的情况比较少
由此,我们可以大胆的分类讨论
考虑有解:
  1. 答案为1,当且仅当存在一个区间,为[1,n][1,n]
  2. 答案为2,可以是两个区间都执行2操作,当且仅当存在两个区间无公共点;可以是两个区间,分别执行1,2两个操作,当且仅当存在两个区间,满足其中一个区间能包含另一个区间,此时被包含的区间执行2操作,包含的区间执行1操作;可以是两个区间都执行1操作,当且仅当存在两个区间,相交且一个区间左端点为11,一个区间右端点为nn
  3. 答案为三,当且仅当m>=3m>=3
除去这三种情况,就可以直接输出1-1了。
下面考虑答案为什么不会超过3
显然,除去答案为1,2的情况,一定满足这mm个区间有至少一个公共点,且两两之间无包含与被包含关系,由此可以将这些区间以左端点为关键字排序,右端点也一定是有序的,这时直接取前三个区间[l1,r1],[l2,r2],[l3,r3](l1<l2<l3,r1<r2<r3)[l_1,r_1],[l_2,r_2],[l_3,r_3](l_1<l_2<l_3,r_1<r_2<r_3),可将1、3两个区间执行1操作,2区间执行2操作即可。
CPP
/*胡金梁*/
#include<bits/stdc++.h>
using namespace std;
#define __MY_TEST__ 0
inline int read()
{
	int f=1,re=0;
	char ch=getchar();
	while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar();}
	while( isdigit(ch)) re=(re<<3)+(re<<1)+(ch^'0'),ch=getchar();
	return re*f;
}
struct node
{
	int l,r,id;
	bool operator <(const node &t) const
	{
		return (l==t.l?r>t.r:l<t.l);
	}
}q[200005];
signed main()
{
#if __MY_TEST__
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
#endif
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		q[i].l=read(),q[i].r=read();q[i].id=i;
		if(q[i].l==1&&q[i].r==n)
		{
			cout<<1<<endl;
			for(int j=1;j<i;j++) cout<<0<<" ";
			cout<<1<<" ";
			for(int j=i+1;j<=m;j++) cout<<0<<" ";
			return 0; 
		}
	}
	sort(q+1,q+m+1);
	int rmax=q[1].r,rnum=q[1].id;
	for(int i=2;i<=m;i++)
	{
		if(q[i].r<=rmax)
		{
		//	cout<<q[i].l<<" "<<q[i].r<<" "<<rmax<<" "<<rnum<<endl;
			cout<<2<<endl;
			for(int j=1;j<min(rnum,q[i].id);j++)
			{
				cout<<0<<" ";
			}
			if(q[i].id<=rnum)
				cout<<2<<" ";
			else
				cout<<1<<" "; 
			for(int j=min(rnum,q[i].id)+1;j<max(q[i].id,rnum);j++)
			{
				cout<<0<<" ";
			}
			if(q[i].id<=rnum)
				cout<<1<<" ";
			else
				cout<<2<<" "; 
			for(int j=max(q[i].id,rnum)+1;j<=m;j++)
			{
				cout<<0<<" ";
			}
			return 0;
		}
		if(q[i].r>rmax) rmax=q[i].r,rnum=q[i].id;
	}
	int rmin=q[1].r;
	rnum=q[1].id;
	for(int i=2;i<=m;i++)
	{
		if(q[i].l>rmin)
		{
			cout<<2<<endl;
			for(int j=1;j<min(rnum,q[i].id);j++)
			{
				cout<<0<<" ";
			}
			cout<<2<<" ";
			for(int j=min(rnum,q[i].id)+1;j<max(q[i].id,rnum);j++)
			{
				cout<<0<<" ";
			}
			cout<<2<<" ";
			for(int j=max(q[i].id,rnum)+1;j<=m;j++)
			{
				cout<<0<<" ";
			}
			return 0;
		}
		if(q[i].r<rmin) rmin=q[i].r,rnum=q[i].id;
	}
	bool x1=0,x2=0;
	int i1,i2;
	for(int i=1;i<=m;i++)
	{
		if(q[i].l==1)
		{
			x1=1;
			i1=q[i].id;
		}
		if(q[i].r==n)
		{
			x2=1;
			i2=q[i].id;
		}
	}
	if(x1&&x2)
	{
		cout<<2<<endl; 
		for(int i=1;i<min(i1,i2);i++) cout<<"0 ";
		cout<<"1 ";
		for(int i=min(i1,i2)+1;i<max(i1,i2);i++) cout<<"0 ";
		cout<<"1 ";
		for(int i=max(i1,i2)+1;i<=m;i++) cout<<"0 ";
		return 0;
	}
	if(m>=3)
	{
	    cout<<3<<endl;
	    for(int i=1;i<min(min(q[1].id,q[2].id),q[3].id);i++) cout<<"0 ";
	    if(q[1].id==min(min(q[1].id,q[2].id),q[3].id)||q[3].id==min(min(q[1].id,q[2].id),q[3].id)) cout<<"1 ";
	    else cout<<"2 ";
	    for(int i=min(min(q[1].id,q[2].id),q[3].id)+1;i<q[1].id+q[2].id+q[3].id-min(min(q[1].id,q[2].id),q[3].id)-max(max(q[1].id,q[2].id),q[3].id);i++) cout<<"0 ";
	    if(q[1].id==q[1].id+q[2].id+q[3].id-min(min(q[1].id,q[2].id),q[3].id)-max(max(q[1].id,q[2].id),q[3].id)||q[3].id==q[1].id+q[2].id+q[3].id-min(min(q[1].id,q[2].id),q[3].id)-max(max(q[1].id,q[2].id),q[3].id)) cout<<"1 ";
	    else cout<<"2 ";
		for(int i=q[1].id+q[2].id+q[3].id-min(min(q[1].id,q[2].id),q[3].id)-max(max(q[1].id,q[2].id),q[3].id)+1;i<max(max(q[1].id,q[2].id),q[3].id);i++) cout<<"0 ";
	    if(q[1].id==max(max(q[1].id,q[2].id),q[3].id)||q[3].id==max(max(q[1].id,q[2].id),q[3].id)) cout<<"1 ";
	    else cout<<"2 ";
	    for(int i=max(max(q[1].id,q[2].id),q[3].id)+1;i<=m;i++) cout<<"0 ";
	    return 0;
	}
    cout<<-1<<endl;
    return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...