模擬測試20190810

2022-02-03 13:43:26 字數 2869 閱讀 4280

又炸了啊。。。。。。

這次考試時候狀態十分不對,上來t2原題,然後又雙叒叕看錯題肛了1h+,發現看錯題之後心態直接崩了

然後開始渾身發冷,去廁所吐了一會感覺好些了,回來看t1

發現是個貪心,然後。。。。。。然後我在腦子不清醒的情況下打了個暴力貪心?!wtf??!?

後來繼續肛t2,發現時間複雜度不對之後整個人又不好了,最後2分鐘碼了個暴力扔上去

最終得分50+30+0=80pts,rank33

怎麼說呢,從到第一機房之後就沒考過這麼低的分數,也算給自己澆了一盆冷水吧

但不管怎麼說,奧賽仍然是我很喜歡的一項事業,我也不打算就這麼放棄啊

努力吧。

以上。t1、blue

乙個很簡單的貪心,每個青蛙都盡量往後跳就好了

那麼我們可以開乙個stl::set來維護石頭,跳過的直接刪除,總複雜度o(nlogn),可以得到ac

然而這種做法其實是沒有深入思考的體現

我們繼續觀察,根據上面貪心的策略,可以發現轉移到每個石頭的點都是單調的

那麼我們豈不是直接維護i乙個單調佇列就好了?依次掃瞄每個石頭判斷隊頭i是否合法就好了

最後留在佇列裡的個數就是答案

set單隊

t2、weed

原題啊。。。。。。考場上毫無頭緒也是醉了(yzh學長我對不起你)

直接維護答案肯定不可做,我們考慮分幾種來維護(參考山海經)

設cut,has,key分別表示刪除的層數,剩下的層數,答案

考慮怎麼合併左右區間,分這樣幾種情況來討論

1、右兒子能把左兒子刪完

has和key直接繼承右兒子,cut=cut[ls]+cut[rs]-has[ls];

2、右兒子沒有刪除操作

直接合併就好了

3、右兒子有刪除,但不能把左兒子刪完

has直接合併兩個兒子,cut直接繼承左兒子,key的統計很麻煩,我們這裡引入乙個函式cal(x,y),表示在x這棵子樹里刪除y層剩餘答案

現在假設我們已經能夠維護出cal,那麼顯然key=key[rs]+cal(ls,cut[rs])

現在考慮怎麼維護cal,顯然我們優先考慮右子樹,然後根據右樹是否刪完討論就好了

總複雜度o(nlog2n)

view code

t3、drink

亂搞神仙啊。。。。。。

直接暴力修改單次是n^2肯定過不了,需要找到至多o(n)單次修改的東西

我們發現只有邊界上的相互關係會改變,我們考慮只修改邊界

使用動態鍊錶,每次把乙個方格切下旋轉並重連

但是我們發現如果僅僅把邊界上的相互關係修改的話,中間點的方向會發生問題,但是修改方向的話又變成n^2了

我們發現乙個點的方向可以由相鄰點的方向唯一確定,考慮在原網格圖中加入不動點

然後中間點的方向可以由不動點推出

這樣就可以做到單詞o(n)修改,只是常數稍大

#include#define ll long long

#define cri const register int

#define db double

#define re register

#define rf(x) p[x].to[(1+di[x])&3]

#define ff(x) p[x].to[di[x]]

#define bf(x) p[x].to[(2+di[x])&3]

#define lf(x) p[x].to[(3+di[x])&3]

using

namespace

std;

const

int mx[4]=,my[4]=;

intis[2002][2002

];int

cnt,top;

int iss[4010010

];int fro[2002],rig[2002],lef[2002],en[2002

];int sh[2002],xi[2002],zu[2002],yo[2002

];short di[4010010

];int a[4010010

];struct

nodep[

4010010

];inline

short

its(cri x,cri y)

inline

void

get_lf(cri x,cri y)

inline

void

get_rf(cri x,cri y)

inline

void

get_ff(cri x,cri y)

inline

void

get_bf(cri x,cri y)

intmain()

is[i][m+1]=++cnt;

}for(int i=0;i<=m+1;i++) is[n+1][i]=++cnt;

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

}while(q--)

get_rf(fr,rf(fr)),rig[

1]=rf(fr);yo[1]=fr;

for(int i=2;i<=c;i++)

get_bf(fr,bf(fr)),en[

1]=bf(fr);xi[1]=fr;

for(int i=2;i<=c;i++)

get_lf(fr,lf(fr)),lef[

1]=lf(fr);zu[1]=fr;

for(int i=2;i<=c;i++)

for(int i=1;i<=top-1;i++) (di[iss[i]]+=3)&=3

;

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

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

}

view code

csp模擬 模擬測試16

fdasds include using namespace std define cle a memset a,0,sizeof a inline int read const int mod 1e9 7,maxn 1e3 100 int n,m,ans 0 int f maxn maxn int...

csp模擬 模擬測試4

t1是暴力分,t2當時沒有花太多時間去推導,一見到t2就十分害怕,便放過了它,t3的話花了大量的時間推了乙個錯誤的解,以後對於t2這種題不要未戰先怯,一點一點的去推導!那一天我們在教室裡許下約定。我至今還記得我們許下約定時的歡聲笑語。我記得她說過她喜歡吃餅乾,很在意自己體重的同時又控制不住自己。她跟...

CSP模擬 模擬測試5

題意是讓求平均值第k小的連續子區間。發現直接計算無論怎麼優化都是 n 2 的,然後發現這樣找k個的似乎可以考慮二分答案。簡單推一下式子。記 sum i 為字首和,顯然符合條件的區間有 frac leq mid 即 sum j j times mid leq sum i i times mid 預設 ...