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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【AtCoder】ARC078

發布時間:2023/12/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【AtCoder】ARC078 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C - Splitting Pile

枚舉從哪里開始分的即可

#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define MAXN 200005 #define eps 1e-12 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) {res = 0;T f = 1;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f; } template<class T> void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10); } int N; int64 s[MAXN]; void Solve() {read(N);for(int i = 1 ; i <= N ; ++i) read(s[i]);for(int i = 1 ; i <= N ; ++i) s[i] += s[i - 1];int64 ans = abs(s[N] - 2 * s[1]);for(int i = 1 ; i < N ; ++i) {ans = min(ans,abs(s[N] - 2 * s[i]));}out(ans);enter; } int main() { #ifdef ivorysifreopen("f1.in","r",stdin); #endifSolve(); }

D - Fennec VS. Snuke

看樹上這段鏈從Fennec開始數第K / 2和K / 2+1的邊斷開之后,分成的兩個子樹哪個結點多
Fennec只有當節點數大于Snuke才會勝利

#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define MAXN 100005 #define eps 1e-12 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) {res = 0;T f = 1;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f; } template<class T> void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10); } struct node {int to,next; }E[MAXN * 2]; int head[MAXN],sumE,N; int dep[MAXN],fa[MAXN],siz[MAXN]; void add(int u,int v) {E[++sumE].to = v;E[sumE].next = head[u];head[u] = sumE; } void dfs(int u) {dep[u] = dep[fa[u]] + 1;siz[u] = 1;for(int i = head[u] ; i ; i = E[i].next) {int v = E[i].to;if(v != fa[u]) {fa[v] = u;dfs(v);siz[u] += siz[v];}} } void Solve() {read(N);int u,v;for(int i = 1 ; i < N ; ++i) {read(u);read(v);add(u,v);add(v,u);}dfs(1);int t = dep[N] / 2 - 1;u = N;while(t--) {u = fa[u];}if(N - siz[u] > siz[u]) puts("Fennec");else puts("Snuke"); } int main() { #ifdef ivorysifreopen("f1.in","r",stdin); #endifSolve(); }

E - Awkward Response

如果不為1后面接的只有0的形式,那么問出第一個\(10^k\)為N則證明數字有k位,然后可以通過二分,判斷中間值是否小于當前值可以把mid擴大10倍,這樣可以知道中間值的字典序是否大于還是小于n,因為長度相等字典序順序就是大小順序,所以可行
如果是1后面接的只有0,那么問出第一個合法的k個9,這個數就是\(10^{k - 1}\)

#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define MAXN 100005 #define eps 1e-12 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) {res = 0;T f = 1;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f; } template<class T> void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10); } bool Query(int64 t) {putchar('?');space;out(t);enter;fflush(stdout);char s[5];scanf("%s",s);return s[0] == 'Y'; } void Solve() {int64 v = 1;bool f = 0;for(int i = 1 ; i <= 10 ; ++i) {if(!Query(v)) {f = 1;v /= 10;break;}v *= 10;}if(!f) {v = 1;for(int i = 1 ; i <= 10 ; ++i) {if(Query(v * 10 - 1)) {putchar('!');space;out(v);enter;return;}v *= 10;}}int64 L = v,R = min(v * 10 - 1,(int64)1e9);while(L < R) {int64 mid = (L + R + 1) >> 1;if(!Query(mid * 10)) L = mid;else R = mid - 1;}putchar('!');space;out(L + 1);enter; } int main() { #ifdef ivorysifreopen("f1.in","r",stdin); #endifSolve(); }

F - Mole and Abandoned Mine

為啥算完2s跑出來不到0.1s???
atc擴充我的想象力系列???
這個就是把這唯一一條路徑挑出來,肯定是希望這條路徑和路徑上每個點上掛的一個聯通塊價值最大,然后用總路徑價值減掉
然后dp[i][S]表示當前走到第i個點,已經擴充的點集是S,就是每次路徑往下走一個點,或者擴充一個包括i其余的點不在S中的點集即可,復雜度\(O(N\times 3^{N})\)
然后我過于智障寫錯了好幾遍,cao

#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define MAXN 10005 #define eps 1e-12 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) {res = 0;T f = 1;char c = getchar();while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f; } template<class T> void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10); } int N,M; struct node {int to,next,val; }E[1005]; int sumE,head[25],pos[(1 << 15) + 5]; int f[16][(1 << 15) + 5],h[16][(1 << 15) + 5],sum[(1 << 15) + 5]; void add(int u,int v,int c) {E[++sumE].to = v;E[sumE].next = head[u];E[sumE].val = c;head[u] = sumE; } inline int lowbit(int x) {return x & (-x); } void Init() {read(N);read(M);int u,v,c;for(int i = 1 ; i <= M ; ++i) {read(u);read(v);read(c);add(u,v,c);add(v,u,c);h[u][1 << v - 1] = c;h[v][1 << u - 1] = c;}for(int i = 1 ; i <= N ; ++i) {for(int j = 1 ; j < (1 << N) ; ++j) {if(lowbit(j) == j) continue;h[i][j] = h[i][j - lowbit(j)] + h[i][lowbit(j)];}}for(int i = 1 ; i <= N ; ++i) pos[(1 << i - 1)] = i;for(int i = 1 ; i < (1 << N) ; ++i) {sum[i] = sum[i - lowbit(i)] + h[pos[lowbit(i)]][i - lowbit(i)];} } void Solve() {for(int i = 1 ; i <= N ; ++i) {for(int j = 0 ; j < (1 << N) ; ++j) {f[i][j] = -1e9;}}f[1][1] = 0;for(int j = 0 ; j < (1 << N - 1) ; ++j) {for(int i = 1 ; i <= N ; ++i) {int S = j << 1 | 1;if(!(S & (1 << i - 1))) continue;int L = S ^ (1 << i - 1);for(int T = L; T ; T = (T - 1) & L) {if(f[i][S ^ T] >= 0)f[i][S] = max(f[i][S],f[i][S ^ T] + sum[T ^ (1 << i - 1)]);}if(f[i][S] >= 0) {for(int k = head[i] ; k ; k = E[k].next) {int v = E[k].to;if(!(S & (1 << v - 1))) {f[v][S ^ (1 << v - 1)] = max(f[v][S ^ (1 << v - 1)],f[i][S] + E[k].val);}}}}}out(sum[(1 << N) - 1] - f[N][(1 << N) - 1]);enter; } int main() { #ifdef ivorysifreopen("f1.in","r",stdin); #endifInit();Solve(); }

轉載于:https://www.cnblogs.com/ivorysi/p/10507718.html

總結

以上是生活随笔為你收集整理的【AtCoder】ARC078的全部內容,希望文章能夠幫你解決所遇到的問題。

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