JOI2012春季合宿 Rotate 鍊錶

2021-09-29 04:48:49 字數 1130 閱讀 6814

又是一道神仙題……

顯然的做法是大力splay,時間複雜度\(o((n+q)n\log n)\), 可以卡掉。

正解: 使用十字鍊錶維護矩陣,在周圍增加第\(0\)行/列和第\((n+1)\)行/列,設\(li[x][d]\)表示\(x\)這個點在\(d\)這個方向上的下乙個元素的編號是什麼(一開始給每個元素都編上號)。那麼對於一次旋轉,子矩形邊界上的格仔暴力修改,內部相當於把\(4\)個方向做了個輪換,因此可以打標記實現。

然而本題的實現方法比較神奇: 每次修改從\((0,0)\)走到\((x,y)\) (只花費\(o(n)\)的時間),首先\((0,0)\)的標記一定是正確的(因為沒有修改過),然後一路上通過當前點和下乙個點互相儲存位置的偏移量以及當前點的正確標記確定下乙個點的正確標記。(詳見**,我的**裡標記的含義是實際方向等於儲存方向加標記)

時間複雜度\(o((n+q)n)\).

#include#define llong long long

using namespace std;

const int n = 1002;

const int dx[4]=,dy[4]=;

char ch[n+3];

char a[n*n+3];

int li[n*n+3][4];

int tag[n*n+3];

int aux1[4][n+3],aux2[4][n+3];

int n,q;

int getid(int x,int y)

int getnxt(int u,int dir)

} return ret;}

int main()

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

}while(q--)

{int x,y,l; scanf("%d%d%d",&x,&y,&l);

int u = 1;

for(int i=0; i

2012春季ACM內部測試賽3

a 題意是給定乙個n m的矩形,初始顏色都為0 代表一種顏色 然後給你乙個r c的矩形刷子可以講r c內部的顏色0或者是1變為相反色 注意一共有0,1兩種顏色,他倆互為相反色 對於每乙個出現的1,可定會至少被刷過一次,我們只要很據目標矩陣統計,遇到1是時就將r c的大小的矩陣進行翻轉,如果出現i r...

2012騰訊春季實習生面試經歷(二)

話說一面結束後,我感覺良好。次日便收到tencent的二面通知,感到萬分慶幸的我,開始準備迎接第三天的又一次挑戰。閒話少說,直入正題。這次面試持續大概25分鐘,內容如下 1.自我介紹。事先沒有預料,我張口就說。從目前的研究生說起,一直到大學生涯。我的感覺是自己說的有點粗糙,也沒啥亮點。這個以後需要事...

SDUT 2012春季ACM內部測試賽5

a題 字串問題 就是給定字典。然後查詢錯誤。分三種情況 letterletterletterketter letterlettre 然後判斷。之前做過類似的一道題目,1y.比賽時,隊長負責的題目,也是果斷1y.厲害。view code include include include include ...