給定乙個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...