日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題


題目大意

有若干個紅點和藍點,對于每一對紅點和藍點,若距離大于DDD則藍點壓制紅點,否則紅點壓制藍點。然后紅點和藍點之間也有不定的壓制關系。

求有多少個三角要求AAA壓制BBBBBB壓制CCCCCC壓制AAA且至少包含一個紅點和藍點。求三角數量的最小值和最大值。


解題思路

我們考慮最暴力的做法先,我們可以枚舉兩個相同顏色的點,枚舉他們之間的關系,然后找三角。

我們定義covxcov_xcovx?表示在xxxDDD范圍以內與他異色的點的數量,covx,ycov_{x,y}covx,y?表示同時在x,yx,yx,y兩個點的DDD范圍內的異色點的數量,對于包含兩個紅色點的方案數為
∑x,y∈redmax{covx?covx,y,covy?covx,y}\sum_{x,y\in red}max\{cov_x-cov_{x,y},cov_{y}-cov_{x,y}\}x,yred?max{covx??covx,y?,covy??covx,y?}
∑x,y∈redmax{covx,covy}?covx,y\sum_{x,y\in red}max\{cov_x,cov_y\}-cov_{x,y}x,yred?max{covx?,covy?}?covx,y?
∑x,y∈redmax{covx,covy}?∑z∈bluecovx,y\sum_{x,y\in red}max\{cov_x,cov_y\}-\sum_{z\in blue} cov_{x,y}x,yred?max{covx?,covy?}?zblue?covx,y?
那我們發現對于每個藍點zzz被統計的次數就是Ccovz2C_{cov_z}^{2}Ccovz?2?
?∑x,y∈redmax{covx,covy}?∑z∈blueCcovz2\Rightarrow \sum_{x,y\in red}max\{cov_x,cov_y\}-\sum_{z\in blue} C_{cov_z}^{2}?x,yred?max{covx?,covy?}?zblue?Ccovz?2?
然后我們發現如果計算出covcovcov數組即可在O(nlog?n)O(n\log n)O(nlogn)的時間內統計答案(排個序瞎搞搞就好)

那如何統計covcovcov數組,我們可以將每個點(x,y)(x,y)(x,y)轉換為(x?y,x+y)(x-y,x+y)(x?y,x+y)然后將曼哈頓距離轉換為切比雪夫距離。這樣我們發現covcovcov就是在(x,y)(x,y)(x,y)這個點為中心的2D?2D2D*2D2D?2D的矩陣包含的點的個數,用掃描線統計即可。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=200100; struct node{ll x,y; }a[N],b[N]; ll n,m,D,y[N*3],mov,maxs,mins,covn[N],covm[N],cnt; struct Seq_node{struct Tree_node{ll l,r,w;}t[N*16];void Build(ll x,ll l,ll r){t[x].l=l;t[x].r=r;if(l==r) return;ll mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);}ll Ask(ll x,ll l,ll r){if(t[x].l==l&&t[x].r==r)return t[x].w;ll mid=(t[x].l+t[x].r)/2;if(r<=mid) return Ask(x*2,l,r);else if(l>mid) return Ask(x*2+1,l,r);else return Ask(x*2,l,mid)+Ask(x*2+1,mid+1,r);}void Change(ll x,ll pos,ll val){if(t[x].l==t[x].r){t[x].w+=val;return;}ll mid=(t[x].l+t[x].r)/2;if(pos<=mid) Change(x*2,pos,val);else Change(x*2+1,pos,val);t[x].w=t[x*2].w+t[x*2+1].w;} }T; bool cMp(node x,node y) {return x.x<y.x;} int main() {freopen("mhw.in","r",stdin);freopen("mhw.out","w",stdout);scanf("%lld%lld%lld",&n,&m,&D);for(ll i=1;i<=n;i++){ll X,Y;scanf("%lld%lld",&X,&Y);a[i].x=X+Y;a[i].y=X-Y;y[++cnt]=a[i].y;y[++cnt]=a[i].y+D;y[++cnt]=a[i].y-D;}for(ll i=1;i<=m;i++){ll X,Y;scanf("%lld%lld",&X,&Y);b[i].x=X+Y;b[i].y=X-Y;y[++cnt]=b[i].y;y[++cnt]=b[i].y+D;y[++cnt]=b[i].y-D;} sort(b+1,b+1+m,cMp);sort(a+1,a+1+n,cMp);sort(y+1,y+1+cnt);cnt=unique(y+1,y+1+cnt)-(y+1);T.Build(1,1,cnt);ll l=0,r=0;for(ll i=1;i<=n;i++){while(l<m&&b[l+1].x<a[i].x-D){ll Y=lower_bound(y+1,y+1+cnt,b[++l].y)-y;T.Change(1,Y,-1);}while(r<m&&b[r+1].x<=a[i].x+D){ll Y=lower_bound(y+1,y+1+cnt,b[++r].y)-y;T.Change(1,Y,1);}ll L=lower_bound(y+1,y+1+cnt,a[i].y-D)-y,R=lower_bound(y+1,y+1+cnt,a[i].y+D)-y;covn[i]=T.Ask(1,L,R);}while(l<m){ll Y=lower_bound(y+1,y+1+cnt,b[++l].y)-y;T.Change(1,Y,-1);}while(r<m){ll Y=lower_bound(y+1,y+1+cnt,b[++r].y)-y;T.Change(1,Y,1);}l=0,r=0;for(ll i=1;i<=m;i++){while(l<n&&a[l+1].x<b[i].x-D){ll Y=lower_bound(y+1,y+1+cnt,a[++l].y)-y;T.Change(1,Y,-1);}while(r<n&&a[r+1].x<=b[i].x+D){ll Y=lower_bound(y+1,y+1+cnt,a[++r].y)-y;T.Change(1,Y,1);}ll L=lower_bound(y+1,y+1+cnt,b[i].y-D)-y,R=lower_bound(y+1,y+1+cnt,b[i].y+D)-y;covm[i]=T.Ask(1,L,R);}sort(covn+1,covn+1+n);sort(covm+1,covm+1+m);for(ll i=1;i<=n;i++)maxs+=covn[i]*(i-1),mins+=covn[i]*(n-i),mov+=covn[i]*(covn[i]-1)/2;for(ll i=1;i<=m;i++)maxs+=covm[i]*(i-1),mins+=covm[i]*(m-i),mov+=covm[i]*(covm[i]-1)/2;printf("%lld %lld",mins-mov,maxs-mov); }

總結

以上是生活随笔為你收集整理的jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。