警示后人
查看原帖
警示后人
1154618
florrygg楼主2024/8/25 15:43

这道题需要开long long

这是不开的https://www.luogu.com.cn/record/174665060

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

const int maxn=3e5+1;
int n,p;
pair<pair<int,int>,int>a[maxn],b[maxn];
pair<int,int>beg[maxn],en[maxn];
set<pair<pair<int,int>,int>>s,s2;
int ans[maxn];
int pre[maxn],nex[maxn];
int hx[maxn],zx[maxn];
int sum[maxn];
int ans2[maxn];
bool flag2[maxn];
map<int,vector<pair<pair<int,int>,int>>>mp,mp2;
vector<pair<pair<int,int>,int>>v;

signed main()
{
//	freopen("P10278_4.in","r",stdin);
//	freopen("fence.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>p;
	for(int i=1;i<=p;i++)
	{
		cin>>a[i].first.first>>a[i].first.second;
		a[i].second=i;
		mp[a[i].first.first].push_back(a[i]);
		mp2[a[i].first.second].push_back({{a[i].first.second,a[i].first.first},a[i].second});
	}
	for(pair<int,vector<pair<pair<int,int>,int>>>i:mp)
	{
		v=i.second;
		sort(v.begin(),v.end());
		for(int i=0;i<v.size();i+=2)
		{
			hx[v[i].second]=v[i+1].second;
			hx[v[i+1].second]=v[i].second;
		}
	}
	for(pair<int,vector<pair<pair<int,int>,int>>>i:mp2)
	{
		v=i.second;
		sort(v.begin(),v.end());
		for(int i=0;i<v.size();i+=2)
		{
			zx[v[i].second]=v[i+1].second;
			zx[v[i+1].second]=v[i].second;
		}
	}
	bool flag=0;
	int cnt=1;
	for(int i=1;;i=nex[i],cnt++)
	{
		if(flag)
		{
			nex[i]=zx[i];
			pre[i]=hx[i];
		}
		else
		{
			nex[i]=hx[i];
			pre[i]=zx[i];
		}
		b[cnt]=a[i];
		flag^=1;
		if(nex[i]==1)
		{
			break;
		}
	}
	sum[1]=max(abs(b[1].first.first-b[p].first.first),abs(b[1].first.second-b[p].first.second));
	for(int i=2;i<=p;i++)
	{
		sum[i]=sum[i-1]+max(abs(b[i].first.first-b[i-1].first.first),abs(b[i].first.second-b[i-1].first.second));
	}
	sum[p+1]=sum[p];
	s.clear();
	s2.clear();
	for(int i=1;i<=p;i++)
	{
		s.insert({b[i].first,i});
		s2.insert({{b[i].first.second,b[i].first.first},i});
	}
	b[p+1]=b[1];
	for(int i=1;i<=n;i++)
	{
		cin>>beg[i].first>>beg[i].second>>en[i].first>>en[i].second;
		int pr,ne,pr2,ne2;
		int id=(s.lower_bound({beg[i],0}))->second;
		if(b[id].first.first!=b[id+1].first.first)
		{
			id--;
			if(id==0)
			{
				id=p;
			}
		}
		pr=abs(beg[i].second-b[id].first.second);
		ne=abs(b[id+1].first.second-beg[i].second);
		if(!(b[id].first.first==beg[i].first&&beg[i].first==b[id+1].first.first&&min(b[id].first.second,b[id+1].first.second)<=beg[i].second&&beg[i].second<=max(b[id].first.second,b[id+1].first.second)))
		{
			id=(s2.lower_bound({{beg[i].second,beg[i].first},0}))->second;
			if(b[id].first.second!=b[id+1].first.second)
			{
				id--;
				if(id==0)
				{
					id=p;
				}
			}
			pr=abs(beg[i].first-b[id].first.first);
			ne=abs(b[id+1].first.first-beg[i].first);
		}
		int id2=(s.lower_bound({en[i],0}))->second;
		if(b[id2].first.first!=b[id2+1].first.first)
		{
			id2--;
			if(id2==0)
			{
				id2=p;
			}
		}
		pr2=abs(en[i].second-b[id2].first.second);
		ne2=abs(b[id2+1].first.second-en[i].second);
		if(!(b[id2].first.first==en[i].first&&en[i].first==b[id2+1].first.first&&min(b[id2].first.second,b[id2+1].first.second)<=en[i].second&&en[i].second<=max(b[id2].first.second,b[id2+1].first.second)))
		{
			id2=(s2.lower_bound({{en[i].second,en[i].first},0}))->second;
			if(b[id2].first.second!=b[id2+1].first.second)
			{
				id2--;
				if(id2==0)
				{
					id2=p;
				}
			}
			pr2=abs(en[i].first-b[id2].first.first);
			ne2=abs(b[id2+1].first.first-en[i].first);
		}
		if(id<=id2)
		{
			if(sum[id2]-sum[id+1]+ne+pr2<sum[id]+pr+sum[p]-sum[id2+1]+ne2)
			{
				ans[id+(pr!=0)]++;
				ans[id2+1+(ne2==0)]--;
			}
			else
			{
				ans[1]++;
				ans[id+1+(ne==0)]--;
				ans[id2+(pr2!=0)]++;
				ans[p+1]--;
			}
		}
		else
		{
			if(sum[p]-sum[id+1]+ne+sum[id2]+pr2<sum[id]-sum[id2+1]+ne2+pr)
			{
				ans[id+(pr!=0)]++;
				ans[p+1]--;
				ans[1]++;
				ans[id2+1+(ne2==0)]--;
			}
			else
			{
				ans[id2+(pr2!=0)]++;
				ans[id+1+(ne==0)]--;
			}
		}
	}
	for(int i=1;i<=p+1;i++)
	{
		ans[i]+=ans[i-1];
		ans2[b[i].second]+=ans[i];
	}
	for(int i=1;i<=p;i++)
	{
		cout<<ans2[i]<<endl;
	}
	return 0;
}
/*

*/

这是开了的https://www.luogu.com.cn/record/174670340

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'

const int maxn=3e5+1;
int n,p;
pair<pair<int,int>,int>a[maxn],b[maxn];
pair<int,int>beg[maxn],en[maxn];
set<pair<pair<int,int>,int>>s,s2;
int ans[maxn];
int pre[maxn],nex[maxn];
int hx[maxn],zx[maxn];
int sum[maxn];
int ans2[maxn];
bool flag2[maxn];
map<int,vector<pair<pair<int,int>,int>>>mp,mp2;
vector<pair<pair<int,int>,int>>v;

signed main()
{
//	freopen("P10278_4.in","r",stdin);
//	freopen("fence.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>p;
	for(int i=1;i<=p;i++)
	{
		cin>>a[i].first.first>>a[i].first.second;
		a[i].second=i;
		mp[a[i].first.first].push_back(a[i]);
		mp2[a[i].first.second].push_back({{a[i].first.second,a[i].first.first},a[i].second});
	}
	for(pair<int,vector<pair<pair<int,int>,int>>>i:mp)
	{
		v=i.second;
		sort(v.begin(),v.end());
		for(int i=0;i<v.size();i+=2)
		{
			hx[v[i].second]=v[i+1].second;
			hx[v[i+1].second]=v[i].second;
		}
	}
	for(pair<int,vector<pair<pair<int,int>,int>>>i:mp2)
	{
		v=i.second;
		sort(v.begin(),v.end());
		for(int i=0;i<v.size();i+=2)
		{
			zx[v[i].second]=v[i+1].second;
			zx[v[i+1].second]=v[i].second;
		}
	}
	bool flag=0;
	int cnt=1;
	for(int i=1;;i=nex[i],cnt++)
	{
		if(flag)
		{
			nex[i]=zx[i];
			pre[i]=hx[i];
		}
		else
		{
			nex[i]=hx[i];
			pre[i]=zx[i];
		}
		b[cnt]=a[i];
		flag^=1;
		if(nex[i]==1)
		{
			break;
		}
	}
	sum[1]=max(abs(b[1].first.first-b[p].first.first),abs(b[1].first.second-b[p].first.second));
	for(int i=2;i<=p;i++)
	{
		sum[i]=sum[i-1]+max(abs(b[i].first.first-b[i-1].first.first),abs(b[i].first.second-b[i-1].first.second));
	}
	sum[p+1]=sum[p];
	s.clear();
	s2.clear();
	for(int i=1;i<=p;i++)
	{
		s.insert({b[i].first,i});
		s2.insert({{b[i].first.second,b[i].first.first},i});
	}
	b[p+1]=b[1];
	for(int i=1;i<=n;i++)
	{
		cin>>beg[i].first>>beg[i].second>>en[i].first>>en[i].second;
		int pr,ne,pr2,ne2;
		int id=(s.lower_bound({beg[i],0}))->second;
		if(b[id].first.first!=b[id+1].first.first)
		{
			id--;
			if(id==0)
			{
				id=p;
			}
		}
		pr=abs(beg[i].second-b[id].first.second);
		ne=abs(b[id+1].first.second-beg[i].second);
		if(!(b[id].first.first==beg[i].first&&beg[i].first==b[id+1].first.first&&min(b[id].first.second,b[id+1].first.second)<=beg[i].second&&beg[i].second<=max(b[id].first.second,b[id+1].first.second)))
		{
			id=(s2.lower_bound({{beg[i].second,beg[i].first},0}))->second;
			if(b[id].first.second!=b[id+1].first.second)
			{
				id--;
				if(id==0)
				{
					id=p;
				}
			}
			pr=abs(beg[i].first-b[id].first.first);
			ne=abs(b[id+1].first.first-beg[i].first);
		}
		int id2=(s.lower_bound({en[i],0}))->second;
		if(b[id2].first.first!=b[id2+1].first.first)
		{
			id2--;
			if(id2==0)
			{
				id2=p;
			}
		}
		pr2=abs(en[i].second-b[id2].first.second);
		ne2=abs(b[id2+1].first.second-en[i].second);
		if(!(b[id2].first.first==en[i].first&&en[i].first==b[id2+1].first.first&&min(b[id2].first.second,b[id2+1].first.second)<=en[i].second&&en[i].second<=max(b[id2].first.second,b[id2+1].first.second)))
		{
			id2=(s2.lower_bound({{en[i].second,en[i].first},0}))->second;
			if(b[id2].first.second!=b[id2+1].first.second)
			{
				id2--;
				if(id2==0)
				{
					id2=p;
				}
			}
			pr2=abs(en[i].first-b[id2].first.first);
			ne2=abs(b[id2+1].first.first-en[i].first);
		}
		if(id<=id2)
		{
			if(sum[id2]-sum[id+1]+ne+pr2<sum[id]+pr+sum[p]-sum[id2+1]+ne2)
			{
				ans[id+(pr!=0)]++;
				ans[id2+1+(ne2==0)]--;
			}
			else
			{
				ans[1]++;
				ans[id+1+(ne==0)]--;
				ans[id2+(pr2!=0)]++;
				ans[p+1]--;
			}
		}
		else
		{
			if(sum[p]-sum[id+1]+ne+sum[id2]+pr2<sum[id]-sum[id2+1]+ne2+pr)
			{
				ans[id+(pr!=0)]++;
				ans[p+1]--;
				ans[1]++;
				ans[id2+1+(ne2==0)]--;
			}
			else
			{
				ans[id2+(pr2!=0)]++;
				ans[id+1+(ne==0)]--;
			}
		}
	}
	for(int i=1;i<=p+1;i++)
	{
		ans[i]+=ans[i-1];
		ans2[b[i].second]+=ans[i];
	}
	for(int i=1;i<=p;i++)
	{
		cout<<ans2[i]<<endl;
	}
	return 0;
}
/*

*/
2024/8/25 15:43
加载中...