description
在遠古的yl國大地上,有n個祭壇,每個祭壇上四個方向寫有「艄、毜、鼛、甌」四個大字,其實這在yl國古代分別是「東、南、西、北」的意思。
yl國每年都要舉行祈福消災的祭祀活動,這個時候,每個祭壇都要在艄毜鼛甌四個方向中選乙個方向,祭壇將向這個方向發出一道**的光線,如果兩個祭壇發出的光線相交,或者祭壇發出的光線經過了別的祭壇,則祭祀不僅不能成功還將遭到上天的懲罰,如果這些條件都滿足則祭祀將成功,yl國在接下來的一年內將不會有任何災難,甚至只會有人出生不會有人死亡。
抽象的來說,如果我們以「艄」方向為x軸,「甌」方向為y軸,建立笛卡爾座標系,那麼每個祭壇將會對應乙個整點。每個點向上下左右四個方向之一連出一條射線,這些射線不能相交且射線不能經過除了發出點之外的其他點}。
現在他們又到了祭祀活動的時候,他們想知道,有多少種方法選擇每個祭壇的方向},使得自己的祭祀能成功?輸出方案數對998244353取模後的值}。
input
第一行乙個正整數n。
接下來n行,第i + 1行兩個整數x_i, y_i,表示第i個祭壇在題目中所述的座標系下的座標為(x_i, y_i)。
output
輸出一行乙個整數,表示要求的方案數對998244353取模後的值。
sample input
輸入1:
1 1 1
輸入2:
2 1 1
2 2
輸入3:
6 0 0
0 1
0 2
0 3
0 4
0 5
輸入4:
5 1 3
-4 6
2 4
1 6
5 9
輸入5:
10 175470546 566770243
501153312 923840801
-36922529 -888266785
-587403745 908979876
-483726071 -96937502
991096990 -783436017
766700568 -679180551
-601529754 815529478
961445805 303768338
245415738 325847411
sample output
輸出1:
4 樣例1解釋:只有乙個祭壇,顯然四個方向都可以發射。
輸出2:
14 樣例2解釋:
對於所有的4 × 4 = 16種情況中,只有兩種不可行:
1號祭壇向上,2號向左。
1號向右,2號向下
輸出3:
144
樣例3解釋:
最上面的祭壇可以向左中右三個方向連出射線,最下面的祭壇可以向右下左三個方向連出射線,中間4個祭壇可以向左右連出射線,方案數為3 × 2 × 2 × 2 × 2 × 3 = 144。
輸出4:
117
輸出5:
24341
data constraint
對於前30%的資料,n ≤ 9。
對於前40%的資料,n ≤ 18。
對於前60%的資料,n ≤ 36。
對於前100%的資料,n ≤ 54,對於所有i, j,有x_i ≠ x_j或y_i ≠ y_j,且|x_i|, |y_i| ≤ ^ 9。
這個題目好神奇啊,一開始還真被第5個樣例嚇著了。。。話說那四個大字是怎麼回事。。囧
好了,言歸正傳,題目大意大概是這樣的:
平面上有n個點,每個點都要沿上下左右其中乙個方向射出一條射線。問這些射線之間兩兩不相交且不與除端點外的任何乙個點相交的方案數。
n<55(要dp的節奏啊)
首先,如果某個點往另乙個點的方向射線,顯然是不合法的,乙個點在另乙個點的射程上也是不合法的。
考慮按x遞增的順序來進行dp。那麼我們只需要判定某個點對某個方向放出射線是否可行。不難發現只需要記錄以下幾個值就可以進行判定:
往上的點的縱座標最小值
往下的點的縱座標最大值
往右的點的縱座標的最大值和最小值
那麼剩下的就是乙個o(n5)的dp就可以解決問題了。
注意要排除多餘狀態以及要使用滾動陣列。
貼貼程式~~
**頗長,打時需注意細節,哪怕一丁點也不能放過,因為這有可能會使你的程式整個wa掉(悲劇~tat~),還有要注意一些地方的特判,以及轉移dp方程,這需要不斷地斟酌與思考#include
#include
#include
#include
#include
#define n 56
#define mo 998244353
using
namespace
std;
struct record
a[n];
int f[n][n][n][n][2]; //up down left right roll
bool bz;
bool cmp(record a,record b)
int max(int x,int y)
bool pd(int i,int j,int k)
int main()
if (bz)}}
}p=(p+1)%mo;
q=(q+1)%mo;
for(int l=0;l<=n;l++)
for (int r=0;r<=n;r++)
for (int u=0;u<=n;u++)
for (int d=0;d<=n;d++)
f[l][r][u][d][q]=0;
}for(int l=0;l<=n;l++)
for (int r=0;r<=n;r++)
for (int u=0;u<=n;u++)
for (int d=0;d<=n;d++)
ans=(ans+f[l][r][u][d][p])%mo;
printf("%d",ans);
}
不得不說有些dp還真是我的軟肋啊~在考場上很難想到像這種複雜dp,還需課後仔細思考~~
五校聯考3day2 C
目錄 description input output sample input sample output data constraint 題解 在遠古的yl國大地上,有n個祭壇,每個祭壇上四個方向寫有 艄 毜 鼛 甌 四個大字,其實這在yl國古代分別是 東 南 西 北 的意思。yl國每年都要舉行...
五校聯考3day2 C
這題dp,想明白了就可以了。這就像個座標系一樣 好像本來就是。而在其上面,有很多個點。咳咳,有點醜。然後呢,我們就按照x座標排個序,y也順便排一下 第二關鍵字 這樣子,在我們dp的時候,或者說對於i,我們可以滿足a i x a i 1 n x 所以,我們就可以不記錄對於i點射向左邊的了。而我們要記錄...
五校聯考3day2 A
這題考場考慮不太全 但相比於60,其它90分的人,還是很全的 long long我是開了的,然後後面的特判我也是加了的,可是竟然打錯了?其實這題不需要打的像我這樣麻煩 設a i 表示i點還需連線的邊數 ans表示sigma a i max表示max a i 如果max ans 2,就說明全部連項那個...