2018雅禮 折射

2022-03-27 02:51:25 字數 1262 閱讀 6959

雅禮題好難啊。 

這個dp題思路好強。

這個東西首先一眼就知道按y排的dp怎麼寫,大概就是設$f(i,j,k)$表示考慮到y座標從大到小排名為i的點,這線上一次轉是j,上上次轉是k的數量,直接二維限制轉移就行了。

考慮這東西怎麼優化。

字首和能搞時間,woc空間也被卡了???

打出來表看一看????

這個dp陣列有好多都是空的。。。

因為越往後x限制的越少。

然後我就不會了。

正經:設$f(i,0/1)$表示從x座標排名為i,出門左轉還是右轉的線的數量。

我一開始就否掉了這東西因為好像轉移順序會出問題。

但是仔細考慮一下。

對於乙個點i,如果它的左側有乙個點j比他低,那麼j能把自己的右轉數量轉移給i的左轉數量。

如果有乙個點j比它高,那麼應該是把i的左轉轉移給j的右轉。

但是這時i的左轉不能轉的比j還靠左否則不合題意。

但是我們可以在轉移i的時候先不轉移i的右轉,然後去列舉左側j用i去給j做他的右轉貢獻(先後問題。有人會給i做貢獻)。

當我們從大到小列舉比i高的j的時候恰好就有,此時加到的i左轉沒有比j還小的點的貢獻。

那麼就可以給j做右轉貢獻。

所以它很對。

還很快。

還很省空間。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int n=6020,mod=1e9+7;7

intf[n][n];

8 inline int

rd()916

struct nodep[n];

17bool cmp(node a,node b)

18int

main()

1932}33

long

long ans=0;34

for(int i=1;i<=n;i++)

35 ans=((ans+f[i][0])%mod+f[i][1])%mod;

36 printf("

%lld\n

",(ans-n+mod)%mod);37}

38/*

39g++ 1.cpp -o 1

40./1414

422 2

433 1

441 4

454 3

46*/

view code

2018雅禮1 2 串 結論題

題面 首先答案只有 1 1,2 三種。若s 不為回文串,答案顯然為1。若s為回文串,假設答案 2,那麼從任意地方切開該串分成的兩個串中至少有乙個回文串。假設一二位相等,第乙個出現的與第一位不同的字母不在正中間,即aa b b a a 那麼因為字首aa b 不回文,那麼後面一定回文,導致兩個 b 中無...

雅禮集訓 2018 Day4 Magic

傳送門本部分 於 這位大佬 題中要求本質不同的序列數量,不太好搞。我們考慮給相同顏色的牌加上編號,這樣所有牌都不相同。那麼如果我們求出了答案,只需要將答案除以 prod a i 就好了。恰好有 k 對 不能直接求,考慮容斥,如果我們求出了 g x 表示至少有 x 對的方案數,那麼答案即為 sum l...

雅禮集訓 2018 Day7 A 題解

題意 雅禮集訓 2018 day7 a 題解 線段樹處理。考慮只有一種與的操作。顯然當乙個區間的或和與上將要與的數還是原數時就沒必要遞迴計算了,剪枝剪掉。當一段區間與和與上將要與的數等於這段區間或和與上將要與的數時,更新後這段區間的最小值位置還是更新前的位置。由於一次操作至少將數的乙個二進位制改變,...