刷題總結 天使玩偶(bzoj2716)

2022-05-23 13:24:14 字數 1651 閱讀 3232

學了cdq後近期最後一道題···然而tm還是搞了1個半小時才tm搞出來······

先說思路:對於絕對值,我們採取類似於旋轉整個圖的方法,也就是說共計三次翻轉再加上原來的圖,每次旋轉90度,算出點在旋轉後的對應座標(具體看**中的注釋部分),然後對於乙個詢問,每次只算它左上角的點的貢獻,這樣就有乙個三維偏序:《時間,x,y>,時間已經在開始就預設排好了,由於此時dis=x-x1+y-y1=x+y-x1-y1,所以對於乙個《時間,x,y>,我們要計算的是所有x1但這道題讓我發現了自己的許多細節錯誤,詳細見**注釋

#include#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=2e6+5

;const

int m=5e5+5

;struct

node

a[n],q[n],tmp[n];

int n,m,tot,maxx,maxy,ans[m],cnt=0

,tree[n],tag[n],tim;

inline

intr()

bool

comp(node a,node b)

inline

void insert(int u,int

v)inline

int query(int

u)inline

void solve(int l,int

r)

else

} while(i<=mid) tmp[k++]=q[i++];

while(j<=r)

for(j=l;j<=r;j++) q[j]=tmp[j];

}int

main()

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

maxx++,maxy++;

for(int i=1;i<=cnt;i++) ans[i]=1e+8;

for(int i=1;i<=tot;i++) q[i]=a[i]; //

第一次,不用翻轉

solve(1

,tot);

for(int i=1;i<=tot;i++) q[i]=a[i],q[i].x=maxx-a[i].x; //

第一次翻轉 (不一定是90度,把所有情況討論了就行)

solve(1

,tot);

for(int i=1;i<=tot;i++) q[i]=a[i],q[i].y=maxy-a[i].y; //

第二次翻轉

solve(1

,tot);

for(int i=1;i<=tot;i++) q[i]=a[i],q[i].x=maxx-a[i].x,q[i].y=maxy-a[i].y; //

第三次翻轉

solve(1

,tot);

for(int i=1;i<=cnt;i++) printf("

%d\n

",ans[i]);

return0;

}

刷題總結 作詩(bzoj2821)

神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩 些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢字都必須在 l,r 裡出現了正偶數次。而且shy認 為選出的漢字的種類數 兩個一樣的漢字稱為同一種 越多越好 為了拿到...

刷題總結 書架(bzoj1861)

小t有乙個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裡的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。小t在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於這些書太有吸引力了,所以她看完後常常會忘記原來是放在書櫃的什麼位置。不過小t的記憶力是非常好的,所以每次放書的時候至...

刷題總結 魔法森林(bzoj3669)

為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為1.n,邊標號為1.m。初始時小e同學在號節點1,隱士則住在號節點n。小e需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪。每當有人經過一條邊的時候,這條...