演算法競賽訓練實錄

2022-05-31 10:42:12 字數 3015 閱讀 9455

目錄codeforces round 604

codeforces edu round 78

codeforces edu round 80

4題 rank1985

都是很水的題。 cout << 000輸出0,而cout<<"000"才輸出000,因為這個wa6次要被笑(打)死。

判定括號序列合法性:每乙個字首和不小於0,同時最後乙個字首和等於0.線段樹更新即可.新技能get.

#include using namespace std;

const int maxn=1e6+5;

int minz[maxn*4],tg[maxn*4],maxz[maxn*4],tg2[maxn*4];

char s[maxn];

inline int ls(int x)

inline int rs(int x)

void pushdown(int rt)

void pushdown2(int rt)

int upd(int il,int ir,int d,int rt,int l,int r)

pushdown(rt);

int mid=(l+r)>>1;

return minz[rt]=min(upd(il,ir,d,ls(rt),l,mid),upd(il,ir,d,rs(rt),mid+1,r));

}int ask(int il,int ir,int rt,int l,int r)

int upd2(int il,int ir,int d,int rt,int l,int r)

pushdown2(rt);

int mid=(l+r)>>1;

return maxz[rt]=max(upd2(il,ir,d,ls(rt),l,mid),upd2(il,ir,d,rs(rt),mid+1,r));

}int ask2(int il,int ir,int rt,int l,int r)

int st[maxn];

int main()

else if(s[i]=='(')

else

} else if(s[i]==')')

else

} else

else

} if(ask(1,n,1,1,n)>=0&&ask(n,n,1,1,n)==0)

else printf("-1 ");

} return 0;

}

4題 rank 252

單調棧正反掃一遍,找每個數左邊和右邊第乙個比它大的數的位置,位置之差等於它本身則成立,否則不成立。

似乎有更簡單的做法。。懶得看了

#include using namespace std;

char ans[200005];

int a[200005];

int stk[200005],id[200005];

int l[200005],r[200005],pos[200005];

int main()

return res%mod;

}int p[200005];

int dp[200005];

int main()

cout << dp[n+1];

return 0;

}

3題rk891

memcmp函式返回值:相等為0,小於時小於0,大於時大於0

猜想:對於\(1\)到\(n\)的和\(\frac\),對於任意\(0\leq s \leq \frac\),總能找到\(1\)到\(n\)的子集,使其元素和為\(s\).

證明:\(s\)有兩種情況:1)小於等於\(n\),問題解決;2)大於\(n\),則將\(s\)減去\(n\),此時\(s\)小於等於\(1\)到n-1的和,問題轉化為1到n-1的情況;如此遞迴下去,得證。

列舉左邊,判斷右邊,map維護

左端點排序,掃瞄線從左到右即可。

不會t的理由是並查集至多合併\(n\)次就一定可以break出來

#include using namespace std;

struct nodep[500005];

int id[1000005];

setsr;

int fa[500005];

int find(int x)

bool cmp(node x,node y)

else break;

} for(int j=0;j*it)

else break;

if(!f)

} if(!f)

sr.insert(p[i].r);

} int cnt=0;

for(int i=1;i<=n;i++) if(find(i)==i) cnt++;

if(cnt>1) ff=false;

if(ff) cout << "yes\n";

else cout << "no\n";

return 0;

}

\(dp1[i][j]\)表示a陣列第i位為j有多少種,\(dp2[i][j]\)表示b陣列。。。這麼簡單怎麼就想不出來

顯然是二分答案。judge應該狀態壓縮,將每一行壓縮為乙個數,數字為1表示這一位大於等於x,否則為0,那麼只要存在兩行i,j其\(num(i)|num(j)==2^-1\)即可。而狀態數至多\(2^m\)個。

這一題極其重要。

首先應該快速反應過來最小值不是i就是1

考慮最大值:考慮任何乙個朋友x,假設他在一段區間內都沒有被移到隊首,考察其他朋友對他的影響:假設朋友i在他右邊並被移到隊首,那麼x的位置加一,而在這之後朋友i的移動都不會對x產生任何影響,因而可以知道x在這段區間內向右移動次數為這段區間內不同朋友的個數。這可以用主席樹完成。而x沒有被操作的區間顯然就是它相鄰兩次被操作的區間。不過從一開始到x被操作的區間需要求比他大的不同朋友個數,這可以用bit實時更新來求出來。所有區間取max即可。

主席樹任何一次單點更新都將產生一棵新樹,不可直接在原樹上修改!!

TJU WannaCry訓練實錄

現場賽成績記錄 2017.10.22 ccpc哈爾濱 金 2017.10.29 ccpc秦皇島 金 2017.11.04 icpc青島 二題 鐵 2017.11.28 icpc南寧 銀 2017.12.03 ccpc final 哈爾濱 銀 2017.12.17 ecl final 上海 金 圓滿退...

Corner Cat 訓練實錄

現場賽記錄 名稱 獎項 排名 2019 to do list 總結 構建修改 詢問樹上倍增 o n logn o nlogn o nlog n xo l ogn o logn o logn 樹鏈剖分 o n o n o n o l ogn o logn o logn o log2 n o log n...

CTGU 訓練實錄

之前做題都沒有感覺,慢慢出去比賽後,打codeforces,看別的人部落格,知乎上的討論,慢慢的對演算法有一些自己的思考。特寫是最近看知乎上別人說的dijkstra利用水流去理解,lca的學習,感覺自己原來還只是浮在表面的感覺,就是沒有真的能做到深入思考,快速理解這些。無論什麼演算法,如果你能通俗易...