这道题需要开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;
}
/*
*/