C++ Competitive Programming Codebook
C++ Competitive Programming Codebook
Contents 1 Basic
1 Basic 1 1.1 default template
1.1 default template . . . . . . . . . . . . . . . . . . . 1
2.3 約瑟夫問題
NTNU_import_magic 2
1 /// n 個 人 , 查 m 個 數 5 for (int i=0; i<N; i++) length[i] = 1;
2 int JosephusProblem(int n, int m) { 6 for (int i=0; i<N; i++)
3 if(n<1 || m<1) return -1; 7 for (int j=0; j<i; j++)
4 vector<int> f(n+1, 0); 8 if (s[j] < s[i])
5 for(unsigned i=2; i<=n; ++i) 9 length[i] = max(length[i], length[j] +
6 f[i] = (f[i-1]+m) % i; 1);
7 return f[n]; 10 int l = 0;
8 } 11 for (int i=0; i<N; i++) l = max(l, length[i]);
12 return l;
13 }
3 Dynamic Programming 14 // Robinson-Schensted-Knuth Algorithm
15 int LIS(vector<int>& s) {
3.1 0/1 &無限背包 16 if (s.size() == 0) return 0;
17 vector<int> v;
1 const int N = 100, W = 100000; 18 v.push_back(s[0]);
2 int cost[N], weight[N], c[W + 1]; 19 for (int i=1; i<s.size(); ++i) {
3 void knapsack(int n, int w) { 20 int n = s[i];
4 memset(c, 0, sizeof(c)); 21 if (n > v.back()) v.push_back(n);
5 for (int i = 0; i < n; ++i) 22 else *lower_bound(v.begin(), v.end(), n) = n;
6 for (int j = w; j - weight[i] >= 0; --j) // 23 }
0/1 背 包 24 return v.size();
7 // for (int j = weight[i]; j <= w; ++j) 無 限 背 25 }
包
8 c[j] = max(c[j], c[j - weight[i]] + cost[i
]); 3.5 LCS
9 cout << "最 高 的 價 值 為" << c[w];
10 } 1 // DP
2 const int N1 = 7, N2 = 5;
3 int s1[N1+1] = {0, 2, 5, 7, 9, 3, 1, 2};
3.2 有限背包 4 int s2[N2+1] = {0, 3, 5, 3, 2, 8};
5 int length[N1+1][N2+1];
1 const int N = 100, W = 100000; 6 int LCS() {
2 int cost[N], weight[N], number[N], c[W + 1]; 7 for (int i=0; i<=N1; i++) length[i][0] = 0;
3 void knapsack(int n, int w) { 8 for (int j=0; j<=N2; j++) length[0][j] = 0;
4 for (int i = 0; i < n; ++i) { 9 for (int i=1; i<=N1; i++)
5 int num = min(number[i], w / weight[i]); 10 for (int j=1; j<=N2; j++)
6 for (int k = 1; num > 0; k *= 2) { 11 if (s1[i] == s2[j]) length[i][j] = length[
7 if (k > num) k = num; i-1][j-1] + 1;
8 num -= k; 12 else length[i][j] = max(length[i-1][j],
9 for (int j = w; j >= weight[i] * k; --j) length[i][j-1]);
10 c[j] = max(c[j], c[j - weight[i] * k] 13 return length[N1][N2];
+ cost[i] * k); 14 }
11 } 15 // Hunt-Szymanski Algorithm
12 } 16 int LCS(string &s1, string &s2) {
13 cout << "最 高 的 價 值 為" << c[w]; 17 vector<int> p[128]; // 假 設 字 元 範 圍 為 0 ~ 127
14 } 18 for (int i = 0; i < s2.size(); ++i)
19 p[s2[i]].push_back(i);
20 vector<int> v;
21 v.push_back(-1);
3.3 經典零錢問題 22 for (int i = 0; i < s1.size(); ++i)
23 for (int j = p[s1[i]].size() - 1; j >= 0; --j)
1 int price[5] = {5, 2, 6, 11, 17}; {
2 bool c[1000+1]; //int c[1000+1]; 24 int n = p[s1[i]][j];
3 void change(int m) { 25 if (n > v.back()) v.push_back(n);
4 memset(c, false, sizeof(c)); 26 else *lower_bound(v.begin(), v.end(), n) =
5 c[0] = true; n;
6 for (int i = 0; i < 5; ++i) 27 }
7 for (int j = price[i]; j <= m; ++j) 28 return v.size() - 1;
8 c[j] ||= c[j-price[i]]; 29 }
9 // c[j] += c[j-price[i]];
10 if (c[m]) cout << "湊 得 到";
11 else cout << "湊 不 到"; 3.6 TSP
12 // cout << "湊 得 價 位" << m;
13 // cout << "湊 法 總 共" << c[m] << "種";
1 #define MAXN 16
14 }
2 int n;/*點 數*/
3 int dp[MAXN][1<<MAXN];/*DP陣 列*/
4 int g[MAXN][MAXN];/*圖*/
3.4 LIS 5 int dfs(int s,int d){
6 if(dp[d][s])return dp[d][s];
1 // DP 7 if((1<<d)==s)return g[0][d];
2 const int N = 100; 8 dp[d][s]=INT_MAX;
3 int s[N], length[N]; 9 for(int i=0;i<n;++i){
4 int LIS() { 10 if(((1<<i)&s)&&i!=d){
NTNU_import_magic 3
11 dp[d][s]=std::min(dp[d][s],dfs(s^(1<<d),i) 4.2 LCA
+g[i][d]);
12 } 1 #define MAXN 100000
13 } 2 #define MAX_LOG 17
14 return dp[d][s]; 3 typedef vector<int >::iterator VIT;
15 } 4 int pa[MAX_LOG + 1][MAXN + 5], dep[MAXN + 5];
5 vector<int >G[MAXN + 5];
6 void dfs(int x, int p) {
4 Tree 7 pa[0][x] = p;
4.1 MST 8 for(int i = 0; i + 1 < MAX_LOG; ++i) {
9 pa[i + 1][x] = pa[i][pa[i][x]];
4.1.1 Kruskal 10 }
11 for(VIT i = G[x].begin(); i != G[x].end(); ++i) {
12 if(*i == p)continue;
1 struct edge {
13 dep[*i] = dep[x] + 1;
2 int u, v, w;
14 dfs(*i, x);
3 bool operator < (const edge &r) const {
4 return w < r.w; 15 }
5 } 16 }
6 }; 17 inline int find_lca(int a, int b) {
7 int vn, en; // vertex num, edge num 18 if(dep[a] > dep[b]) swap(a, b);
8 vector<edge> ve; 19 for(int i = dep[b] - dep[a], k = 0; i; i /= 2) {
9 vector<int> dsu; 20 if(i & 1)b = pa[k][b];
10 int Find(int x) { 21 ++k;
11 if(x == dsu[x]) return x; 22 }
12 return dsu[x] = x; 23 if(a == b)return a;
13 } 24 for(int i = MAX_LOG; i >= 0; --i) {
14 bool Union(int x, int y) { 25 if(pa[i][a] != pa[i][b]) {
15 int a = Find(x), b = Find(y); 26 a = pa[i][a];
16 if(a != b) { 27 b = pa[i][b];
17 dsu[a] = b; 28 }
18 return true; 29 }
19 } 30 return pa[0][a];
20 return false; 31 }
21 }
22 int Kruskal() {
23 for(int i = 0; i < vn; ++i) dsu.push_back(i); 5 Flow
24 sort(ve.begin(), ve.end()); 5.1 BCC_Tarjan
25 int cnt = 0, ans = 0;
26 for(int i = 0; i < en && cnt < vn; ++i) {
27 if(Union(ve[i].u, ve[i].v)) { 1 void dfs(int u,int pa=-1){//u當 前 點 , pa父 親
28 ans += ve[i].w; 2 int v,child=0;
29 ++cnt; 3 low[u]=vis[u]=++Time;
30 } 4 st[top++]=u;
31 } 5 for(size_t i=0;i<G[u].size();++i){
32 return ans; 6 if(!vis[v=G[u][i]]){
33 } 7 dfs(v,u),++child;
8 low[u]=std::min(low[u],low[v]);
9 if(vis[u]<=low[v]){
4.1.2 prim 10 is_cut[u]=1;
11 bcc[++bcc_cnt].clear();
12 int t;
1 struct edge { 13 do{
2 int idx, w;
14 bcc_id[t=st[--top]]=bcc_cnt;
3 bool operator < (const edge &r) const {
15 bcc[bcc_cnt].push_back(t);
4 return w > r.w;
16 }while(t!=v);
5 }
17 bcc_id[u]=bcc_cnt;
6 };
18 bcc[bcc_cnt].push_back(u);
7 int prim() {
8 int vn; // vertex num 19 }
9 vector<edge> adj[vn]; 20 }
10 int ans = 0; 21 else if(vis[v]<vis[u]&&v!=pa)//反 向 邊
11 priority_queue<edge> pq; 22 low[u]=std::min(low[u],vis[v]);
12 vector<bool> vis(vn, false); 23 }
13 vis[0] = true; 24 if(pa==-1&&child<2) is_cut[u]=0;//u是dfs樹 的 根 要 特
14 for(auto v : adj[0]) pq.emplace(v); 判
15 while(!pq.empty()) { 25 }
16 edge mn = pq.top(); 26 inline void bcc_init(int n){
17 pq.pop(); 27 Time=bcc_cnt=top=0;
18 if(vis[mn.idx]) continue; 28 for(int i=1;i<=n;++i){
19 vis[mn.idx] = true; 29 G[i].clear();
20 ans += mn.w; 30 vis[i]=0;
21 for(auto v : adj[mn.idx]) pq.emplace(v); 31 is_cut[i]=0;
22 } 32 bcc_id[i]=0;
23 } 33 }
34 }
NTNU_import_magic 4