P3271 JLOI2016 方 容斥 數學

2021-10-09 19:20:36 字數 3638 閱讀 7057

給定乙個n∗m

n*mn∗

m的矩陣,從中刪去k

kk個頂點,求最後能形成多少個正方形

範圍&性質:1≤n

,m≤1

06,1

≤k≤2000

1\le n,m\le 10^6,1\le k\le 2000

1≤n,m≤

106,

1≤k≤

2000

,正方形可以是斜著的(邊不一定與網格圖上的邊重合)

暴力做法:

列舉,複雜度o(n

mk)o(nmk)

o(nmk)

,直接去世

正解:通過容斥簡化運算,記f(i

)f(i)

f(i)

表示至少包含i

ii個被刪除的點的正方形數目,最終的答案就是f(0

)−f(

1)+f

(2)−

f(3)

+f(4

)f(0)-f(1)+f(2)-f(3)+f(4)

f(0)−f

(1)+

f(2)

−f(3

)+f(

4),那麼問題轉化成了如何求f(i

)f(i)

f(i)

首先我們考慮對於乙個被刪除的點,它能形成的正方形有多少種,情況如下圖所示

我們很容易觀察出正方形可以分為兩類,斜著的和正著的,但是斜著的正方形可以在大的正方形裡被統計,rt

我們按照橫縱座標的差值,對斜著的正方形進行定義,如下圖的正方形我們可以稱其為(a,

b)(a,b)

(a,b

)正方形

那麼對於乙個被刪除的點,它的屬性可以用四個值表示分別為(u,

我們先考慮(0,

x)(0,x)

(0,x

)正方形,也就是橫平豎直的正方形,分象限考慮,這樣的正方形的數目是min

(l,d

)+mi

n(d,

r)+m

in(u

,r)+

min(

u,l)

min(l,d)+min(d,r)+min(u,r)+min(u,l)

min(l,

d)+m

in(d

,r)+

min(

u,r)

+min

(u,l

) 接下來考慮斜著的正方形,我們依舊分象限考慮,先考慮(l,

r,d)

(l,r,d)

(l,r,d

)所在象限,正方形(a,

我們列出此時對a

aa的限制$a\le r,a\le a+b-1,1\le a,a+b-l\le a $改為列舉a+b,轉化成**就是

for

(int c=

2;c<=d&&c<=l+r;c++

)

但是,單次o(n

2)o(n^2)

o(n2

)的複雜度不優秀,其實c

cc影響答案的值只在[l+

1,r+

1][l+1,r+1]

[l+1,r

+1]範圍內,因為小於l+1

l+1l+

1時mi

nmin

min會取1,大於$ r+1時

時時min$會取r,在取值範圍內是一次函式,所以可以對列舉進行優化,只列舉分界點

int lim=

min(l+r,h)

,res=0;

int pos[3]

=;sort

(pos,pos+3)

;int cl=

1,cr,vl,vr;

for(

int i=

0;i<

3;i++

)return res;

對於含兩個以上的情況,列舉兩個點,利用向量或者座標等數學知識推出其他點的座標

tip:對於含至少三個點的情況會重複計算c32

c_3^2

c32​

次,對於至少四個點的情況會重複計算c42

c_4^2

c42​

次,統計答案的時候直接除掉就可以

#include

#define mk(x,y) make_pair(x,y)

using

namespace std;

namespace zzc

intcalc

(int l,

int r,

int h)

;sort

(pos,pos+3)

;int cl=

1,cr,vl,vr;

for(

int i=

0;i<

3;i++

)return res;

}int

calc0()

return res;

}int

calc1()

return res;

}int

calc2()

}return res;

}int

calc3()

if(check

(x1-y1+y2,y1+x1-x2)

&&check

(x2+y2-y1,y2-x2+x1))if

(((y1+y2+x1+x2)&1

)==0)

}}}return res/3;

}int

calc4()

if(check

(x1-y1+y2,y1+x1-x2)

&&check

(x2+y2-y1,y2-x2+x1))if

(((y1+y2+x1+x2)&1

)==0)

}}}return res/6;

}void

work()

printf

("%d\n",(

calc0()

-calc1()

+calc2()

-calc3()

+calc4()

+mod)

%mod);}

}signed

main()

JLOI2016 SHOI2016 偵察守衛

嘟嘟嘟 這道題可以說是 hnoi2003 消防局的設立的公升級版。距離從2改為了d。辛虧d只有20,這也就是乙個切入點。令f u j 表示u四周 j 1的距離需要被覆蓋,g u j 表示u可以像四周覆蓋 j 的距離。考慮轉移方程,令v為u的其中乙個兒子 1.f u j 直接從v延伸而來 f u j ...

洛谷 P3268 JLOI2016 圓的異或並

在平面上有兩兩不相交的 n 個圓,即其關係只有相離和包含。求這些圓的異或面積並。異或面積並為 當一片區域被奇數個圓包含則計算其面積,否則不計算。輸出所有圓的異或面積並除以 pi 的結果。n le 200000 前置知識 掃瞄線,set。可以發現,由於圓是不相交的,那麼這種包含關係可以看作是一棵森林 ...

JLOI2016 成績比較

給定 n 個變數,每個變數有 m 個屬性,屬性 i 的值在 1,u i 中隨機。第 1 個變數的所有屬性的排名以及給出,然後我們知道恰好有 k 個變數滿足所有屬性都嚴格小於等於 1 求所有可能的合法情況。答案對 10 9 7 取模。n,m le 100,u i le 10 9 方便起見,令 n le...