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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JLOI2016 方

發(fā)布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JLOI2016 方 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

bzoj4558

真是一道非常excited的題目啊…JLOI有毒

題目大意:給一個(N+1)*(M+1)的網(wǎng)格圖,格點坐標為(0~N,0~M),現(xiàn)在挖去了K個點,求剩下多少個正方形(需要注意的是正方形可以是斜著的,多斜都可以)

N,M<=10^6,K<=2*10^3。

首先我們發(fā)現(xiàn)有一個非常感人的K=0部分分…

我們考慮K=0怎么做。

對于一個形如這樣的正方形,我們叫它(a,b)正方形好了。

我們可以很容易地發(fā)現(xiàn)一個(a,b)正方形實際上要占下(a+b)*(a+b)這么大一塊網(wǎng)格。

然后我們考慮a+b的大小,這樣a就是[0,a+b]這么大,這樣就可以得到一個答案。

代碼如下:

現(xiàn)在我們發(fā)現(xiàn),有了這些障礙物,我們只要能求出總共的正方形個數(shù)、經(jīng)過一個障礙點的正方形個數(shù)、經(jīng)過兩個障礙點的正方形個數(shù)、經(jīng)過三個點的、經(jīng)過四個點的即可。

經(jīng)過三個和經(jīng)過四個直接二分查找一下顯然是trivial的,經(jīng)過兩個點的要考慮是作為邊往兩側延伸和作為對角線的情況,也比較trivial。

總共的正方形個數(shù)我們已經(jīng)求出來了,現(xiàn)在我們就要考慮經(jīng)過某一個障礙點的正方形個數(shù)。

對于一個點和它相關的只有四個屬性,u,d,l,r對吧。

首先我們考慮直的正方形,即(0,x)或(x,0)正方形,因為這類正方形容易被重復統(tǒng)計。

容易發(fā)現(xiàn)這類正方形個數(shù)為min(u,l)+min(u,r)+min(l,d)+min(d,r)。

其它的正方形顯然都是在四個象限中某兩個相鄰象限的。

為了簡化起見,我們先考慮l,r,d這一象限的。

還是一樣,設正方形為(a,b)正方形,我們枚舉a+b,假設a+b=c。

因為正方形不是直的,所以a,b≠0。

現(xiàn)在我們考慮求出a的取值范圍。

容易發(fā)現(xiàn)a<=r,a<=c-1,a>=1,a>=c-l(由于b<=l)。

那么我們可以列出一個形如這樣的式子來計算:

這樣顯然不夠優(yōu)秀,我們可以人工分類討論一下…

額其實注意到當r=c-1時c=r+1,當c-l=1時c=l+1,那么min和max的兩個“分界點”是l+1和r+1,在分界點中間顯然都是一些一次函數(shù),那么就都是等差數(shù)列,于是我們就可以避免人工分類討論了。

有了這個函數(shù)calc(l,r,d),那么calc(u,d,l,r)顯然就等于

一些奇怪的細節(jié)詳見代碼…

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <math.h> using namespace std; typedef long long ll; #define MOD 100000007 ll calc(ll l,ll r,ll d) {if(!l||!r||!d) return 0;ll ans=0;ll upp=min(l+r,d);ll ps[3]={l+1,r+1,upp};sort(ps,ps+3);ll cl=1;for(int i=0;i<3;i++){ll cr=ps[i];if(cr>upp) break;if(cr<2||cl==cr) continue;++cl;ll vl=min(r,cl-1)-max(cl-l,1LL)+1;ll vr=min(r,cr-1)-max(cr-l,1LL)+1;ans+=(vl+vr)*(cr-cl+1)/2;ans%=MOD;cl=cr;}return ans; } ll calc(ll u,ll d,ll l,ll r) {return calc(u,d,l)+calc(u,d,r)+calc(l,r,u)+calc(l,r,d)+min(u,r)+min(u,l)+min(d,l)+min(d,r); } typedef pair<ll,ll> pll; pll ps[233333]; #define X first #define Y second ll n,m,k,ans=0; bool ok(pll a) {return a.X>=0&&a.X<n&&a.Y>=0&&a.Y<m; } ll tointt(double x) {if(fabs(x-ll(x+0.5))<1e-5) return x+0.5;return -1; } double chk(double x,double y) {ll xx=tointt(x),yy=tointt(y);if(xx>=0&&xx<n&&yy>=0&&yy<m) return 1;return 0; } int main() {cin>>n>>m>>k; ++n; ++m;ll cnt3=0,cnt4=0;for(ll g=1;g<=n&&g<=m;g++) ans+=(n-g)%MOD*(m-g)%MOD*g%MOD, ans%=MOD;for(int i=1;i<=k;i++){ll x,y;scanf("%lld%lld",&x,&y);ans-=calc(x,n-1-x,y,m-1-y);ans%=MOD;ps[i]=pll(x,y);}sort(ps+1,ps+1+k);for(int i=1;i<=k;i++){for(int j=i+1;j<=k;j++){do{double mx=(ps[i].X+ps[j].X)/2.0,my=(ps[i].Y+ps[j].Y)/2.0;double dx=ps[i].X-mx,dy=ps[i].Y-my;if(chk(mx-dy,my+dx)&&chk(mx+dy,my-dx)) ans++;}while(0);for(int p=-1;p<=1;p+=2){ll dx=ps[j].X-ps[i].X,dy=ps[j].Y-ps[i].Y;pll n1=pll(ps[j].X-dy*p,ps[j].Y+dx*p);pll n2=pll(ps[i].X-dy*p,ps[i].Y+dx*p);if(ok(n1)&&ok(n2));else continue;ans++;int cp=0;if(binary_search(ps+1,ps+1+k,n1)) ++cp;if(binary_search(ps+1,ps+1+k,n2)) ++cp;if(cp==1) cnt3++;else if(cp==2) cnt3++, cnt4++;}}}ans-=cnt3/2; ans-=cnt4/4;printf("%d\n",int(((ans%MOD)+MOD)%MOD)); }

轉載于:https://www.cnblogs.com/zzqsblog/p/5493655.html

總結

以上是生活随笔為你收集整理的JLOI2016 方的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。