HZOI20190828模擬32題解

2022-04-14 06:50:56 字數 1767 閱讀 9747

題面:

chinese:

考慮$\sum\limits_^i*f_i$的意義:所有方案中煉字的個數之和。

統計答案時可以考慮[1,k]每個字對答案的貢獻,即每個字在多少種方案中成為煉字。

在方格的乙個確定位置(x,y),字元i對答案的貢獻((x,y)位置的數是i且i是煉字的方案數)是

$(i-1)^*(i-1)^*k^$。

由於詩作中的所有位置都是等價的,那麼最後的答案就是

$n*m*\sum\limits_^(i-1)^*(i-1)^*k^$。

時間複雜度o(k)。

#include#include#include#include#define int long long

using namespace std;

const int mod=1e9+7;

int n,m,k,ans=0;

int q_pow(int a,int b,int p)

return res%mod;

}signed main()

physics:

資料過水導致$o(qn^2log_2n)$過了

#include#include#include#include#define maxn 1005

#define re register

using namespace std;

int n,m,q,ans,l,r,mid,sum[maxn][maxn],ansi,ansj,x,y;

char ch[maxn];

inline int read()

return a;

}inline bool judge(re int k)

} }return 0;

}signed main()

} ans=min(n,m),ansi=0,ansj=0;

while(q--)

if(ans!=min(n,m)&&(xansi+ans-1||yansj+ans-1))

l=0,r=ans,ans=0;

while(l<=r)

else r=mid-1;

} printf("%d\n",ans);

} return 0;

}

正解:典型的時光倒流,先將所有待修改的正電荷都修改為負電荷,然後倒序考慮所有修改操作。

考慮如何在較優複雜度內計算最後一次修改後的答案(經典問題):

upi,j 表示 (i, j) 向上延伸的正電荷的最長長度。

downi,j 表示 (i, j) 向下延伸的正電荷的最長長度。

可以通過單調棧求出 lefti,j 表示 (i, j) 左面第乙個小於 upi,j 的位

置, righti,j 表示 (i, j) 右面第乙個小於 upi,j 的位置。

那麼問題的答案就是max 。

時間複雜度 o(n2)

對於多次修改操作:

倒序考慮所有操作,如果答案增加,那麼一定是由於當前(x, y) 位置負電荷變正電荷造成的。每次修改操作只會影響一列的 up, down ,可以暴力修改。考慮當前負電荷變正電荷後是否存在邊長為 k 的正方形,那麼問題就轉化為是否存在min+min≥k 。求長度固定的區間的最小值,這就轉化成單調佇列的經典問題(滑動的視窗)。每次負電荷變正電荷後,可以二分求出由於此次修改造成的更優答案。

時間複雜度$o(n^2+qnlogn)$。

chemistry:

留坑

HZOI20190902模擬35題解

題面 a 公園 dag上想拓撲dp 然而博主記憶化搜尋了一下 設f i j 表示從i節點走j個點出公園所用的最小時間 則 f u i min f v j 1 dis 然後記憶化搜尋 include include include include include define int long lon...

HZOI0814NOIp模擬賽 考試筆記

rank1 gekoo 240pts rank2 kai586123 220pts rank3 hzoier yxk hzoier wmz 190pts rank5 一堆人 170pts 考試概況 t1 模擬題 pts 100 t2 數論 pts 30 t3 神奇數字dp pts 40 sum 17...

HZOI19年07 14NOIp模擬賽筆記

我尋思著因為我們是提前跟衡中打了招呼才拿到的賬號,所以題還是不能公開的吧.所以我就只聊聊自己怎麼搞的 聽說衡中那邊一考完就有個金牌爺給他們講題 好羨慕啊 我們就很鬱悶了.一群人圍著黑板講各種錯解.t1 序列 考場上 我第一次看的時候看錯了,導致浪費了1h.看懂題之後開始推幾個小結論 solution...