又炸了啊。。。。。。
這次考試時候狀態十分不對,上來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 longview code#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++)
}
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 預設 ...