猛新求助双指针
  • 板块P8858 折线
  • 楼主mtaoye
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/20 21:25
  • 上次更新2023/10/27 02:08:48
查看原帖
猛新求助双指针
639700
mtaoye楼主2022/11/20 21:25
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct point
{
	int x,y;
}a[100005];
int n;
int sumx[100005],sumy[100005],f1[100005],f2[100005];
vector<int> ss1[100005],ss2[100005];
signed main()
{
	int T=read();
	while(T--)
	{
		for(int i=1;i<=n;i++)
		{
			sumx[i]=0;
			sumy[i]=0;
			f1[i]=0;
			f2[i]=0;
			a[i]=(point){0,0};
			ss1[i].clear();
			ss2[i].clear();
		}
		n=read();
		int s1=0,s2=0;
		bool flag=1;
		for(int i=1;i<=n;++i)
		{
			int x=read(),y=read();
			sumx[x]++;
			sumy[y]++;
			ss1[x].push_back(i);
			ss2[y].push_back(i);
			a[i]=(point){x,y};
		}
		for(int i=1;i<=n;++i)
		{
			s1+=sumx[i];
			s2+=sumy[i];
			if(s1==n/2||s2==n/2)
			{
				flag=0;
				break;
			}
		}
		if(!flag) 
		{	
			cout<<2<<endl;
			continue;
		}
		flag=1;
		int l=1,r=1,m=0;
		while(l<=r)
		{
			if(!flag) break;
			while(m<n/2&&r<=n)
			{
				m+=sumy[r]-f2[r];
				++r;
			}
			if(m==n/2)
			{
				flag=0;
				break;
			}
			for(int i=0;i<ss1[l].size();++i)
			{
				f2[a[ss1[l][i]].y]++;
				if(a[ss1[l][i]].y<r) --m;
			}
			++l;
		}
		if(m==n/2) flag=0;
		if(!flag)
		{
			cout<<3<<endl;
			continue;
		}
		flag=1;
		l=r=1;m=0;
		while(l<=r)
		{
			if(!flag) break;
			while(m<n/2&&r<=n)
			{
				m+=sumx[r]-f1[r];
				++r;
			}
			if(m==n/2)
			{
				flag=0;
				break;
			}
			for(int i=0;i<ss2[l].size();++i)
			{
				f1[a[ss2[l][i]].x]++;
				if(a[ss2[l][i]].x<r)--m;
			}
			++l;
		}
		if(m==n/2) flag=0;
		if(!flag)
		{
			cout<<3<<endl;
		}
		else
		{
			cout<<4<<endl;
		}
	}
}

只对了三个点 对着神犇的代码改来改去 已经变成了神犇的模样

2022/11/20 21:25
加载中...