日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Weekly Challenges - Week 11

發布時間:2024/4/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Weekly Challenges - Week 11 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一拖再拖,忍無可忍,自己懶的沒救了。

一周前就結束的比賽,到現在才想起來補。

最后一題貌似又遇到了splay。。。還是不會!!!shit

題目鏈接

A題--快速冪

1 #include <cmath> 2 #include <cstdio> 3 #include <vector> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int MOD = 1e9 + 7; 9 10 int mod_pow(int a, int b) { 11 int res = 1; 12 while (b) { 13 if (b & 1) res = (res * (long long)a) % MOD; 14 a = (a * (long long)a) % MOD; 15 b >>= 1; 16 } 17 return res; 18 } 19 20 int main() { 21 /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 22 int T; 23 ios::sync_with_stdio(false); 24 cin >> T; 25 while (T--) { 26 int t; 27 cin >> t; 28 cout << (2 + mod_pow(2, t + 1)) % MOD << endl; 29 } 30 return 0; 31 }

B題

如果說這題的困難之處,那就是要看出來其實這種數的個數很少。所以先把所有的范圍之內的數打表出來。

1 #include <cmath> 2 #include <cstdio> 3 #include <vector> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 typedef long long LL; 9 #define rep(i, n) for (int i = (1); i <= (n); i++) 10 LL pw10[20]; 11 const LL MAX_N = (LL)1e18; 12 13 int main() { 14 pw10[0] = 1LL; 15 rep (i, 19) pw10[i] = pw10[i - 1] * 10; 16 vector<LL> ans; 17 rep (i, 9) ans.push_back(i); 18 int cur = 0, cur_len = 2, next = -1; 19 while (true) { 20 if (next == - 1 && ans[cur] * (cur_len + 1) >= pw10[cur_len]) { 21 next = cur; 22 } 23 LL x = ans[cur] * cur_len; 24 if (x >= MAX_N) break; 25 if (pw10[cur_len - 1] <= x && x < pw10[cur_len]) { 26 ans.push_back(x); 27 } else if (x >= pw10[cur_len]) { 28 cur = next; 29 next = -1; 30 cur_len++; 31 continue; 32 } 33 cur++; 34 } 35 //rep (i, 25) cerr << ans[i] << endl; 36 int T; 37 cin >> T; 38 while (T--) { 39 LL A, B; 40 cin >> A >> B; 41 LL rgt = upper_bound(ans.begin(), ans.end(), B) - ans.begin(); 42 LL lft = lower_bound(ans.begin(), ans.end(), A) - ans.begin(); 43 LL res = rgt - lft; 44 if (A == 0) res++; 45 cout << res << endl; 46 } 47 48 return 0; 49 }

C題

題意:給出N個結點的樹,每個結點有一個權值,在樹上有一種操作,可以任選一個結點,然后刪除以該結點為根的子樹。最多執行K次這種操作

   使得樹上的權值總和最大。

首先,如果按照前序遍歷訪問每個結點的順序給結點做標記,那么以某個結點為根的子樹中所有結點的標記一定該結點的后面。

dfs時順便維護一下以每個結點為根的子樹中結點的個數tot[i]。

dp[i][j]表示到dfs中第i個遍歷的結點為止操作了j次可以獲得的最大權值。

這樣當到達第i個結點時,dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + value[i]) ? //不刪除

            dp[i + tot[i]][j + 1] = max(dp[i + tot[i]][j + 1], dp[i][j]) //刪除

1 #include <cmath> 2 #include <cstdio> 3 #include <vector> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int MAX_N = 100050; 9 typedef long long LL; 10 const LL INF = (LL)1e19; 11 vector<int> G[MAX_N]; 12 int w[MAX_N], vs[MAX_N], tot[MAX_N], cnt; 13 LL dp[MAX_N][205]; 14 15 void dfs(int u, int fa) { 16 int sz = (int)G[u].size(); 17 vs[++cnt] = u; 18 tot[u] = 1; 19 if (sz == 1) { 20 return ; 21 } 22 for (int i = 0; i < sz; i++) { 23 int v = G[u][i]; 24 if (v == fa) continue; 25 dfs(v, u); 26 tot[u] += tot[v]; 27 } 28 } 29 30 void read(int &res) { 31 res = 0; 32 int sign = 1; 33 char c = ' '; 34 while (c < '0' || c > '9') { 35 if (c == '-') sign = -1; 36 c = getchar(); 37 } 38 while (c >= '0' && c <= '9') res = (res<<3) + (res<<1) + c - '0', c = getchar(); 39 if (sign == -1) res = -res; 40 } 41 42 int main() { 43 ios::sync_with_stdio(false); 44 int N, K; 45 cin >> N >> K; 46 //read(N); read(K); 47 for (int i = 1; i <= N; i++) cin >> w[i];//read(w[i]); 48 for (int i = 1; i < N; i++) { 49 int u, v; 50 cin >> u >> v; 51 //read(u), read(v); 52 G[u].push_back(v); 53 G[v].push_back(u); 54 } 55 cnt = 0; 56 dfs(1, -1); 57 for (int i = 0; i <= K; i++) for (int j = 1; j <= N; j++) dp[j][i] = -INF; 58 //for (int i = 0; i <= K; i++) dp[0][i] = 0; 59 dp[1][0] = 0; 60 for (int i = 1; i <= N; i++) { 61 int u = vs[i]; 62 for (int j = 0; j <= K; j++) if (dp[i][j] != -INF) { 63 dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + w[u]); 64 if (j < K) 65 dp[i + tot[u]][j + 1] = max(dp[i + tot[u]][j + 1], dp[i][j]); 66 } 67 } 68 LL res = -INF; 69 for (int i = 0; i <= K; i++) res = max(res, dp[N + 1][i]); 70 cout << res << endl; 71 72 return 0; 73 }

D題

題意:N種技能,第i種技能有ci個人學會,有T個巫師,每個巫師有兩個集合A和B,他可以把一個擁有A集合中的技能的人轉移到集合B中的某個技能中去。

問最多可以使多少個技能至少有一個人學會。

增加一個源點和匯點,源點到N種技能連一條容量為ci的邊,從N種技能到匯點連一條容量為1的邊。

對于每個巫師,從A集合中的技能連一條容量為1的邊到該巫師,從該巫師連一條容量為1的邊到B集合中的每種技能。

最大流即為答案。。。

1 #include <queue> 2 #include <cmath> 3 #include <cstdio> 4 #include <vector> 5 #include <cstring> 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 10 struct edge { 11 int to, cap, rev; 12 edge() {} 13 edge(int _to, int _cap, int _rev):to(_to), cap(_cap), rev(_rev) {} 14 }; 15 const int INF = 0x3f3f3f3f; 16 const int MAX_V = 250; // ????` 17 vector<edge> G[MAX_V]; // ????? 18 int level[MAX_V]; // ?????????? 19 int iter[MAX_V]; // ???????????????? 20 int Q[MAX_V]; // BFS?? 21 22 void add_edge(int from, int to, int cap) { 23 G[from].push_back(edge(to, cap, G[to].size())); 24 G[to].push_back(edge(from, 0, G[from].size() - 1)); 25 } 26 27 // ????????????????? 28 void bfs(int s) { 29 memset(level, -1, sizeof(level)); 30 int ini = 0, end = 0; 31 Q[end++] = s; 32 level[s] = 0; 33 while (end > ini) { 34 int v = Q[ini++]; 35 for (int i = 0; i < G[v].size(); i++) { 36 edge &e = G[v][i]; 37 if (e.cap > 0 && level[e.to] < 0) { 38 level[e.to] = level[v] + 1; 39 Q[end++] = e.to; 40 } 41 } 42 } 43 } 44 45 // ?????????? 46 int dfs(int v, int t, int f) { 47 if (v == t) return f; 48 for (int &i = iter[v]; i < G[v].size(); i++) { 49 edge &e = G[v][i]; 50 if (e.cap > 0 && level[v] < level[e.to]) { 51 int d = dfs(e.to, t, min(f, e.cap)); 52 if (d > 0) { 53 e.cap -= d; 54 G[e.to][e.rev].cap += d; 55 return d; 56 } 57 } 58 } 59 return 0; 60 } 61 62 // ?????????? 63 int Dinic(int s, int t) { 64 int flow = 0; 65 for (;;) { 66 bfs(s); 67 if (level[t] < 0) return flow; 68 memset(iter, 0, sizeof(iter)); 69 int f; 70 while ((f = dfs(s, t, INF)) > 0) { 71 flow += f; 72 } 73 } 74 } 75 76 int main() { 77 ios_base::sync_with_stdio(false); 78 79 int N, T; 80 cin >> N >> T; 81 int s = 0, t = N + T + 1; 82 83 for (int i = 1; i <= N; i++) { 84 int C; 85 cin >> C; 86 add_edge(s, i, C); 87 add_edge(i, t, 1); 88 } 89 for (int i = 1; i <= T; i++) { 90 int A, B; 91 cin >> A; 92 for (int j = 1; j <= A; j++) { 93 int x; 94 cin >> x; 95 add_edge(x, N + i, 1); 96 } 97 cin >> B; 98 for (int j = 1; j <= B; j++) { 99 int x; 100 cin >> x; 101 add_edge(N + i, x, 1); 102 } 103 } 104 105 cout << Dinic(s, t) << endl; 106 return 0; 107 } 1 #include <queue> 2 #include <cmath> 3 #include <cstdio> 4 #include <vector> 5 #include <cstring> 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 10 struct edge { 11 int to, cap, rev; 12 edge() {} 13 edge(int _to, int _cap, int _rev):to(_to), cap(_cap), rev(_rev) {} 14 }; 15 const int INF = 0x3f3f3f3f; 16 const int MAX_V = 250; // ????` 17 vector<edge> G[MAX_V]; // ????? 18 int level[MAX_V]; // ?????????? 19 int iter[MAX_V]; // ???????????????? 20 int Q[MAX_V]; // BFS?? 21 22 void add_edge(int from, int to, int cap) { 23 G[from].push_back(edge(to, cap, G[to].size())); 24 G[to].push_back(edge(from, 0, G[from].size() - 1)); 25 } 26 27 // ????????????????? 28 void bfs(int s) { 29 memset(level, -1, sizeof(level)); 30 int ini = 0, end = 0; 31 Q[end++] = s; 32 level[s] = 0; 33 while (end > ini) { 34 int v = Q[ini++]; 35 for (int i = 0; i < G[v].size(); i++) { 36 edge &e = G[v][i]; 37 if (e.cap > 0 && level[e.to] < 0) { 38 level[e.to] = level[v] + 1; 39 Q[end++] = e.to; 40 } 41 } 42 } 43 } 44 45 // ?????????? 46 int dfs(int v, int t, int f) { 47 if (v == t) return f; 48 for (int &i = iter[v]; i < G[v].size(); i++) { 49 edge &e = G[v][i]; 50 if (e.cap > 0 && level[v] < level[e.to]) { 51 int d = dfs(e.to, t, min(f, e.cap)); 52 if (d > 0) { 53 e.cap -= d; 54 G[e.to][e.rev].cap += d; 55 return d; 56 } 57 } 58 } 59 return 0; 60 } 61 62 // ?????????? 63 int Dinic(int s, int t) { 64 int flow = 0; 65 for (;;) { 66 bfs(s); 67 if (level[t] < 0) return flow; 68 memset(iter, 0, sizeof(iter)); 69 int f; 70 while ((f = dfs(s, t, INF)) > 0) { 71 flow += f; 72 } 73 } 74 } 75 76 int main() { 77 ios_base::sync_with_stdio(false); 78 79 int N, T; 80 cin >> N >> T; 81 int s = 0, t = N + T + 1; 82 83 for (int i = 1; i <= N; i++) { 84 int C; 85 cin >> C; 86 add_edge(s, i, C); 87 add_edge(i, t, 1); 88 } 89 for (int i = 1; i <= T; i++) { 90 int A, B; 91 cin >> A; 92 for (int j = 1; j <= A; j++) { 93 int x; 94 cin >> x; 95 add_edge(x, N + i, 1); 96 } 97 cin >> B; 98 for (int j = 1; j <= B; j++) { 99 int x; 100 cin >> x; 101 add_edge(N + i, x, 1); 102 } 103 } 104 105 cout << Dinic(s, t) << endl; 106 return 0; 107 }

E題

轉載于:https://www.cnblogs.com/Stomach-ache/p/4031912.html

總結

以上是生活随笔為你收集整理的Weekly Challenges - Week 11的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人看片在线观看 | 黄色视屏在线播放 | 尤物网站在线观看 | 国产日韩欧美精品一区 | 激情综合五月网 | 国产无遮挡又黄又爽又色 | 99福利视频 | 中文字幕永久在线播放 | a√在线观看 | 奇米影视播放器 | 先锋影音av资源在线 | 亚洲一区精品在线观看 | 亚洲国产精品区 | 在线免费观看黄视频 | 特级西西444www高清大胆免费看 | 夫妻性生活黄色大片 | 日本一区二区三区网站 | 秋霞一区 | 白丝女仆被免费网站 | 精品视频入口 | 国产喷水吹潮视频www | 性视频一区 | 亚洲天堂男人av | 中文字幕一区二区久久人妻网站 | 女人裸体无遮挡 | 五月天天 | 国产精品看片 | 精品一区二区人妻 | 亚洲图区欧美 | 国产91小视频 | 成人28深夜影院 | 永久免费未网 | 欧美精品a区 | 国产在线观看免费视频今夜 | 日韩久久一区二区三区 | 久久久国产精品黄毛片 | 欧美疯狂做受xxxxx高潮 | 国产一区,二区 | 欧美福利一区二区 | 久久精品国产99精品国产亚洲性色 | 欧美一级片网站 | 精品国产成人亚洲午夜福利 | 国产一区h | 亚洲美女一级片 | 亚洲国产精品视频在线观看 | 亚洲视频在线观看网站 | 久久伊人色 | 熟女人妇 成熟妇女系列视频 | 高清国产午夜精品久久久久久 | 国产精品99久久久久久一二区 | 亚洲风情av| 国产精品激情偷乱一区二区∴ | 男女免费视频网站 | 精品国产乱码一区二区 | 日本特级黄色片 | 成人交配视频 | 日本精品二区 | 青青草成人在线 | 欧美极品少妇xxxxⅹ裸体艺术 | 国产免费中文字幕 | 男男做爰猛烈叫床爽爽小说 | 婷婷射丁香 | 性欧美一级 | 日本一区精品视频 | 日韩精品国产一区二区 | 久久久精品久久久 | 国产精久久久久久 | 人妻无码中文字幕免费视频蜜桃 | 黄色国产网站 | 国产精品中文字幕在线观看 | 国产剧情在线一区 | 黄色在线网站 | 国产日韩欧美日韩大片 | 97国产成人无码精品久久久 | 欧美性生交xxxxx久久久 | 自拍视频在线 | 黄色免费在线网站 | 成人午夜视频网站 | 亚洲精品视频在线观看免费视频 | 伊在线久久丫 | 亚洲乱码国产乱码精品精的特点 | 欧美手机在线视频 | 一区二区三区日韩欧美 | 国产精品99精品久久免费 | 国产不卡在线观看视频 | 亚洲国产视频在线 | 欧美性大交 | 人人射人人干 | 51精品国产| 日本女人毛片 | 国产高潮流白浆喷水视频 | 国产精品99久久久久久一二区 | 很黄的性视频 | 亚洲国产精品福利 | 丰满岳乱妇一区二区 | 国产免费一区二区三区最新不卡 | 99热在线免费观看 | 亚洲久久天堂 | 性插视频在线观看 |