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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

秦皇岛 2019 CCPC区域赛 部分代码

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 秦皇岛 2019 CCPC区域赛 部分代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Decimal Time Limit: 2000/1000 MS (Java/Others) Memory Limit:
131072/131072 K (Java/Others) Total Submission(s): 2010 Accepted
Submission(s): 894

Problem Description 給定一個正整數 n,要求判斷 1n
在十進制下是不是一個無限小數。如果是,輸出“Yes”,否則輸出“No”。

Input 輸入第一行一個正整數 T,表示數據組數。

接下來 T 行,每行一個正整數 n(1≤n≤100)。

Hint

樣例解釋

15=0.2,不是無限小數。

13=0.333?,是無限小數。

Output 輸出 T 行,每行一個字符串,表示對應測試數據的答案。

Sample Input 2 5 3

Sample Output No Yes

1 最多 就當是10 只能被2 和 5 的倍數 整除就好

#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int maxn = 1e5 + 5; const int maxm = 1e6 + 5; int n, m, cas;int main() {ios::sync_with_stdio(false),cin.tie(0);cin >> cas;while(cas --) {cin >> n;while(n % 2 == 0) n /= 2;while(n % 5 == 0) n /= 5;if(n == 1) cout << "No" << endl;else cout << "Yes" << endl;}return 0; }

Forest Program Time Limit: 4000/2000 MS (Java/Others) Memory Limit:
131072/131072 K (Java/Others) Total Submission(s): 1778 Accepted
Submission(s): 126

Problem Description Z 國近年來一直在考慮遏制國土沙漠化的方案。在 Z
國廣闊的疆域上,有著許多的沙漠。沙漠上干旱少雨,荒無人煙,僅有仙人掌能在這種魔鬼環境中生存。經過 Z
國地質探測局的調查,他們得到了沙漠的實地情況。Z 國的地質探測局是一個熱愛 CCPC
的機構,他們喜歡使用圖論的方式來描述看到的景色。在得到的數據中,沙漠中的每一個連通塊都是一棵仙人掌;一個連通塊是一棵仙人掌當且僅當連通塊中不存在重邊和自環,并且每一條邊僅被至多一個簡單環覆蓋。

經過一番評估,Z
國決定通過刪去沙漠中的一些邊,最終將沙漠變為森林。這里我們定義森林滿足:森林中每一個連通塊都是一棵樹,而樹是邊數等于點數減一的連通塊。現在給定一個包含
n 個點的沙漠,請你求出 Z
國一共有多少種滿足要求的沙漠改造方案。兩種方案不同當且僅當方案中被刪去的邊集不同。由于答案可能很大,請將最終答案對 998244353
取模后輸出。

Input 多組數據,每組數據第一行輸入兩個非負整數 n、m,分別表示沙漠中的點數和邊數。沙漠中點的編號為 1, 2, …, n。

對于每組數據的第 2 到第 m+1 行,每行輸入兩個正整數 u、v,表示沙漠中編號為 u 和編號為 v 的兩個點之間有邊相連。

1≤T≤3,1≤n≤3×105,m≤5×105,1≤u, v≤n 并且 u≠v。

Hint

樣例解釋

對于第一組樣例,只需要至少刪去一條邊即可變為森林,故一共有 23?1=7 種方案。

Output 對于每一組數據,輸出一行一個非負整數,表示答案對 998244353 取模后的值。

Sample Input 2 3 3 1 2 2 3 3 1 6 6 1 2 2 3 3 1 2 4 4 5 5 2

Sample Output 7 49

我們刪一個邊 讓他變成樹 考慮 既然仙人掌樹 必然要刪環的邊 這時 它的選邊可有的數量是 pow(2,totcnt)?1pow(2,totcnt)- 1pow2totcnt?1個(1是一個也不刪) 而樹邊 可以隨便刪的 貢獻度是pow(2,totsum?totcnt)pow(2,totsum - totcnt)pow(2totsum?totcnt)
然后陳起來就好

#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> pii; const long long INF = 0x3f3f3f3f3f3f3f3f; const int maxn = 5e5 + 5; const int maxm = 1e6 + 5; const int mod = 998244353; int n, m, cas;int pow_mod(int a, int b) {int res = 1;for(; b; b >>= 1) {if(b & 1)res = res * a % mod;a = a * a % mod;}return res; }int head[maxn], cnt; int to[maxn << 1], nxt[maxn << 1]; int f[maxn]; long long tp; void ade(int a, int b) {to[++ cnt] = b;nxt[cnt] = head[a], head[a] = cnt; }bool vis[maxn]; int dep[maxn]; int totcnt = 0, totedge = 0;void dfs(int u, int f) {if(vis[u]) return ;vis[u] = 1;dep[u] = dep[f] + 1;for(int i = head[u]; i; i = nxt[i]) {int v = to[i];if(v == f) continue;if(vis[v]) {if(dep[u] + 1 > dep[v]) {totedge ++;totcnt += dep[u] - dep[v] + 1;// cout << dep[u] - dep[v] + 1 << endl;tp = (tp * (pow_mod(2, dep[u] - dep[v] + 1) - 1)%mod);}} else {totedge ++;dfs(v, u);}} }signed main() {f[0] = f[1] = 1;for(int i = 2; i <= maxn; i ++) f[i] = (f[i - 1] * i) % mod;cin >> n >> m;for(int i = 1, a, b; i <= m; i ++) {cin >> a >> b;ade(a, b), ade(b, a);}long long ans = 1;for(int i = 1; i <= n; i ++) {if(!vis[i]) {totedge = 0, totcnt = 0;tp = 1;dfs(i, 0);int totsy = totedge - totcnt;ans = ans * pow_mod(2, totsy) % mod * tp % mod;}}cout << ans << endl;return 0; }

Invoker Time Limit: 15000/12000 MS (Java/Others) Memory Limit:
131072/131072 K (Java/Others) Total Submission(s): 586 Accepted
Submission(s): 100

Problem Description 在 dota2
中有一個叫做祈求者(Invoker)的英雄,在游戲中他有三個基礎技能:冰(Quas),雷(Wex),火(Exort),每施展一個技能就可以獲得相應屬性的一個法球(element)。

但是祈求者同時最多只能有三個法球,即如果他在有三個法球的狀態下又使用了某個法球技能,那么他會獲得該法球,并失去之前三個法球中最先獲得的一個。

不難得出,祈求者身上的三個法球的無順序組合有 10 種,每一種都對應著一個組合技能:

  • 急速冷卻(Cold Snap),無序組合 QQQ,用 Y 表示
  • 幽靈漫步(Ghost Walk),無序組合 QQW,用 V 表示
  • 寒冰之墻(Ice Wall),無序組合 QQE,用 G 表示
  • 電磁脈沖(EMP),無序組合 WWW,用 C 表示
  • 強襲颶風(Tornado),無序組合 QWW,用 X 表示
  • 靈動迅捷(Alacrity),無序組合 WWE,用 Z 表示
  • 陽炎沖擊(Sun Strike),無序組合 EEE,用 T 表示
  • 熔爐精靈(Forge Spirit),無序組合 QEE,用 F 表示
  • 混沌隕石(Chaos Meteor),無序組合 WEE,用 D 表示
  • 超震聲波(Deafening Blast),無序組合 QWE,用 B 表示
  • 當祈求者擁有三個法球的時候,使用元素祈喚(Invoke)技能,用 R
    表示,便可獲得當前法球組合所對應的技能,同時原有的三個法球也不會消失,先后順序的狀態也不會改變。

    現在給定一個技能序列,你想按照給定的順序將他們一個一個地祈喚出來,同時你想用最少的按鍵來達到目標,所以你想知道對于給定的一個技能序列,最少按多少次鍵才能把他們都祈喚出來。

    注意:游戲開始的時候,祈求者是沒有任何法球的。

    Input 僅一行一個字符串 s,表示技能序列。其中所有字母都是大寫,且在 {B,C,D,F,G,T,V,X,Y,Z} 內。

    1≤|s|≤105

    Output 僅一行一個正整數,表示最少按鍵次數。

    Sample Input XDTBV

    Sample Output 14

    Hint

    一種按鍵最少的方案為:QWWREERERWQRQR

    就是特蛋疼的DP 情況多的難受 DP還是好像的
    109ms timerank 5…

    //#include <iostream> //#include <map> //#include <algorithm> //#include <cstring> //#include <cstdio> //const int maxn = 1e5 + 100; //const int INF = 0x3f3f3f3f; //using namespace std; //int s[maxn]; //char dic[10][6][4] = { // {"QQQ", "QQQ", "QQQ", "QQQ", "QQQ", "QQQ"}, // {"QQW", "QWQ", "WQQ", "WQQ", "WQQ", "WQQ"}, // {"QQE", "QEQ", "EQQ", "EQQ", "EQQ", "EQQ"}, // {"WWW", "WWW", "WWW", "WWW", "WWW", "WWW"}, // {"QWW", "WQW", "WWQ", "WWQ", "WWQ", "WWQ"}, // {"WWE", "WEW", "EWW", "EWW", "EWW", "EWW"}, // {"EEE", "EEE", "EEE", "EEE", "EEE", "EEE"}, // {"QEE", "EQE", "EEQ", "EEQ", "EEQ", "EEQ"}, // {"WEE", "EWE", "EEW", "EEW", "EEW", "EEW"}, // {"QWE", "QEW", "EQW", "EWQ", "WEQ", "WQE"}, //}; // //int cons(int y1, int i, int y2, int j) { // int res = 3; // for(int k1 = 0, k2 = 2; k1 < 3; k2 --, k1 ++) { // if(dic[y1][i][k2] == dic[y2][j][k1]) res --; // else break; // } // return res; //} // //int dp[6][maxn]; // dp數組 // //int dif(int a, int pos1, int b, int pos2) { // if (dic[a][pos1][0] == dic[b][pos2][0] && dic[a][pos1][1] == dic[b][pos2][1] && dic[a][pos1][2] == dic[b][pos2][2]) // return 0; // if (dic[a][pos1][1] == dic[b][pos2][0] && dic[a][pos1][2] == dic[b][pos2][1]) // return 1; // if (dic[a][pos1][2] == dic[b][pos2][0]) // return 2; // return 3; //} // //int reid(char s) { // if(s == 'Y') return 0; // if(s == 'V') return 1; // if(s == 'G') return 2; // if(s == 'C') return 3; // if(s == 'X') return 4; // if(s == 'Z') return 5; // if(s == 'T') return 6; // if(s == 'F') return 7; // if(s == 'D') return 8; // if(s == 'B') return 9; //} //char s1[maxn]; // //int main() { init(); // char tmp; // int ans = 0; // while(~scanf("%s", s1)) { // ans = 0; // int len = strlen(s1); // for(int i = 0 ; i < len; i ++) // s[i] = reid(s1[i]); // // for(int i = 1; i <= len ; i ++) for(int j = 0 ; j < 6 ; j ++) // dp[j][i] = INF; // // ans += len; // dp[0][0] = dp[1][0] = dp[2][0] = dp[3][0] = dp[4][0] = dp[5][0] = 3; // for(int i = 1; i < len ; i ++) // for(int j = 0 ; j < 6 ; j ++) // for(int k = 0 ; k < 6 ; k ++) // dp[j][i] = min(dp[j][i], dp[k][i - 1] + cons(s[i - 1], k, s[i], j)); // int mi = INF; // for(int k = 0 ; k < 6 ; k ++) // mi = min(dp[k][len - 1], mi); // cout << mi + ans << endl; // } // return 0; //}#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int INF = 0x3f3f3f3f; const int maxn = 1e5 + 5; const int mod = 998244353; int n, m, cas;int dp[15][maxn]; char s[maxn];struct node {string s1;string s[10];int siz; } a[15];int reid(char s) {if(s == 'Y') return 1;if(s == 'V') return 2;if(s == 'G') return 3;if(s == 'C') return 4;if(s == 'X') return 5;if(s == 'Z') return 6;if(s == 'T') return 7;if(s == 'F') return 8;if(s == 'D') return 9;if(s == 'B') return 10;if(s == '*') return 11; }void init() {a[1].s1 = "QQQ";a[2].s1 = "QQW";a[3].s1 = "QQE";a[4].s1 = "WWW";a[5].s1 = "QWW";a[6].s1 = "WWE";a[7].s1 = "EEE";a[8].s1 = "QEE";a[9].s1 = "WEE";a[10].s1 = "QWE";a[11].s[1] = "***";a[11].siz = 1;for(int i = 1; i <= 10; i ++) {sort(a[i].s1.begin(), a[i].s1.end());int t = 0;do {a[i].s[++ t] = a[i].s1;} while(next_permutation(a[i].s1.begin(), a[i].s1.end()));a[i].siz = t;} }int cons(int y1, int pos1, int y2, int pos2) {if (a[y1].s[pos1][0] == a[y2].s[pos2][0] && a[y1].s[pos1][1] == a[y2].s[pos2][1] && a[y1].s[pos1][2] == a[y2].s[pos2][2])return 0;if (a[y1].s[pos1][1] == a[y2].s[pos2][0] && a[y1].s[pos1][2] == a[y2].s[pos2][1])return 1;if (a[y1].s[pos1][2] == a[y2].s[pos2][0])return 2;return 3; }void sol(int y1, int y2, int k) {for(int i = 1; i <= a[y2].siz; i ++) {for(int j = 1; j <= a[y1].siz; j ++) {dp[i][k + 1] = min(dp[i][k + 1], dp[j][k] + cons(y1, j, y2, i));}} }signed main() {init();while(~scanf("%s", s + 1)) {s[0] = '*';memset(dp, 0x3f, sizeof(dp));n = strlen(s);for(int i = 1; i <= 11; i ++) dp[i][0] = 0;for(int i = 1; i < n; i ++)sol(reid(s[i - 1]), reid(s[i]), i - 1);int ans = INF;for(int i = 1; i <= 6; i ++) ans = min(ans, dp[i][n - 1]);printf("%lld\n", ans + n - 1);}return 0; }

    MUV LUV EXTRA Time Limit: 2000/1500 MS (Java/Others) Memory Limit:
    262144/262144 K (Java/Others) Total Submission(s): 0 Accepted
    Submission(s): 0

    Problem Description
    鑒純夏是一名成績不太好的高中生。一天她在數學考試中碰到了一道求某條線段長度的問題。因為她并不會做這道題,所以她準確地作圖后用尺子量出了這條線段的長度。不幸的是,答案在10進制下為一個無限小數,純夏只量出了這個無限小數在10進制表示下的前若干位。

    純夏猜測問題的答案為一個有理數,所以答案為一個無限循環小數,如13=0.333?,3635=1.0285714285714?。純夏希望從這個無限小數的前n位猜出原本的數字。純夏意識到,猜測的循環節太長或循環節已經開始出現的部分長度太短是不可信的。舉個例子,若她量出的小數為1.0285714285714,顯然假設循環節為0285714285714(長度為13)或假設循環節為428571(已經開始出現的部分長度為7)都不如假設循環節為285714(長度為6,已經開始出現的部分長度為12)可靠。因此她定義一個循環節的可靠程度為a×循環節已經開始出現的部分長度?b×循環節長度。請你幫她求出最可靠的循環節的可靠程度為多少。

    Input 第1行兩個正整數a,b,含義如題目描述。

    第2行一個字符串s表示純夏量出的小數。

    1≤a,b≤109

    1≤|s|≤107

    Hint

    樣例解釋

    對于第1組樣例:

    若猜測循環節為0,則可靠度=5×1?3×1=2;

    其中,我們把以 0 為循環節的小數也看作無限循環小數。

    若猜測循環節為20,則可靠度=5×2?3×2=4;

    若猜測循環節為02,則可靠度=5×3?3×2=9;

    若猜測循環節為020,則可靠度=5×3?3×3=6;

    若猜測循環節為1020,則可靠度=5×4?3×4=8。

    對于第2組樣例:

    若猜測循環節為2,則可靠度=2×1?1×1=1;

    若猜測循環節為12,則可靠度=2×4?1×2=6;

    若猜測循環節為21,則可靠度=2×3?1×2=4;

    若猜測循環節為212,則可靠度=2×3?1×3=3;

    若猜測循環節為1212,則可靠度=2×4?1×4=4。

    注意,計算循環節可靠度的時候不考慮整數部分。輸入中給出的整數部分只是為了還原純夏見到的數字。

    Output 一個整數表示最可靠的循環節的可靠程度。

    怎么說啊 沒有想到有負數 唉 第一發就應該過的 寫的拓展KMP
    過不去有推出了 KMP寫法 在然后發現 是負數的問題 第一發也能過
    拓展KMP

    #include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> pii; const int INF = 0x3f3f3f3f3f3f3f3f; const int maxn = 1e7 + 5; const int maxm = 1e6 + 5; int n, m, cas;char s[maxn]; int z[maxn];void get_z() {int l = 0, r = 0;for(int i = l; i < n; i ++) {if(i > r) {l = i, r = i;while(r < n && s[r - l] == s[r]) r ++;z[i] = r - l, r --;} else {int k = i - l;if(z[k] < r - i + 1) z[i] = z[k];else {l = i;while(r < n && s[r - l] == s[r]) r ++;z[i] = r - l, r --;}}} }signed main() {//ios::sync_with_stdio(false),cin.tie(0);long long a, b;while(~scanf("%lld %lld", &a, &b)) {scanf("%[^.]",s);getchar();scanf("%s", s);n = strlen(s);reverse(s, s + n);get_z(); // for(int i = 0; i <= n; i ++) { // cout << z[i] << " "; // }cout << endl;int len = 1;long long ans = -INF;for(int i = 0; i < n; i ++) {if(z[i] == 0) {//cout << "0 "<< i + 1 << " " << i + 1<< endl;ans = max(ans, a * (i + 1) - b * (i + 1));} else {// cout << "1 "<< i + z[i] << " " << i << endl;ans = max(ans, a * (i + z[i]) - b * (i));}}printf("%lld\n", ans);}return 0; }

    KMP

    #include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> pii; const long long INF = 0x3f3f3f3f3f3f3f3f; const int maxn = 1e7 + 5; const int maxm = 1e6 + 5; int n, m, cas;char s[maxn]; int nxt[maxn];void get_z(){nxt[0] = -1;int i = 0, j = -1;while(i < n){if(j == -1 || s[j] == s[i]){i++, j++;nxt[i] = j;}else j = nxt[j];} }signed main() {long long a, b;while(~scanf("%lld %lld", &a, &b)) {scanf("%s", s);n = strlen(s);int f = 0, t = 0;for(int i = 0; i < n; i ++) {if(s[i] == '.') {f = 1;continue;}if(f) s[t ++] = s[i];}s[t] = '\0';n = t;reverse(s, s + n);get_z();long long ans = -INF;for(int i = 1; i <= n; i ++) {ans = max(ans, i * a - b * (i - nxt[i]));}printf("%lld\n", ans);}return 0; }

    總結

    以上是生活随笔為你收集整理的秦皇岛 2019 CCPC区域赛 部分代码的全部內容,希望文章能夠幫你解決所遇到的問題。

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