並不對勁的CF480E Parking Lot

2022-05-08 20:00:14 字數 1862 閱讀 7308

題目大意

有乙個\(n\times m\)的網格,每個位置是黑色或者白色。\(k\)個操作,每個操作是將乙個白格仔染黑,操作後輸出當前最大的白色正方形的邊長。\(n,m,k\leq 2\times 10^3\)

題解發現在每次操作是把白格仔變黑,會使答案變小。維護「變小的最大值」聽上去不太舒服。考慮把操作全都反過來,變成把黑格仔染白。

這樣每次操作之後,如果答案變大了,那麼新的答案正方形一定包含在被操作的格仔。

考慮對每個點記它左邊最左的白格仔和右邊最右的白格仔,操作時暴力更新與被操作點同行的點。

答案就是想找連續的一段與被操作的點在同一列,「段的長度」與「最左的右邊界-最右的左邊界」的最小值盡可能大。

發現可以判斷答案是否大於乙個數\(x\):當這一列上存在乙個點,滿足該點到從該點往上數第\(x\)個點滿足「最左的右邊界-最右的左邊界」不少於\(x\),\(x\)就可以;反之就不可以。

可以用線段樹或單調佇列維護區間最左右邊界和最右左邊界。

這題知道判斷解是否合法的方法後也不用二分,因為在處理過後答案就是不降的,而且不會超過\(min(n,m)\),而判斷能否使答案增加1需要\(\theta(n)\)或\(\theta(n\space log\space n)\)的時間複雜度,所以可以每次暴力判斷能否使答案增加。

總時間複雜度\(\theta(n\times m+k\times m+k\times n)\)。

**

#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define rep(i,x,y) for(int i=(x);i<=(y);++i)

#define dwn(i,x,y) for(int i=(x);i>=(y);--i)

#define view(u,k) for(int k=fir[u];~k;k=nxt[k])

#define maxn 2007

using namespace std;

int read()

void write(int x)

if(x<0)putchar('-'),x=-x;

while(x)ch[++f]=x%10+'0',x/=10;

while(f)putchar(ch[f--]);

putchar('\n');

}int qx[maxn],qy[maxn],q[maxn],hd,tl;

int col[maxn][maxn],ans,lmx[maxn][maxn],rmx[maxn][maxn],n,m,k,res[maxn],tmp[maxn],dp[maxn][maxn];

char s[maxn];

int jud(int yy)

int main()

rep(i,1,k)qx[i]=read(),qy[i]=read(),col[qx[i]][qy[i]]=1;

rep(i,1,n)

dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;

ans=max(dp[i][j],ans);

if(j==1||col[i][j-1])lmx[i][j]=j;

else lmx[i][j]=lmx[i][j-1];

} dwn(j,m,1)

if(j==m||col[i][j+1])rmx[i][j]=j;

else rmx[i][j]=rmx[i][j+1];

} }dwn(i,k,1)

rep(i,1,k)write(res[i]);

return (0-0);

}

並不對勁的splay

splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...

並不對勁的費用流

最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...

並不對勁的字尾陣列

字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...