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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

“玲珑杯”ACM比赛 Round #4

發(fā)布時(shí)間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “玲珑杯”ACM比赛 Round #4 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

運(yùn)氣不錯(cuò)有個(gè)抱枕。
1046 - chess play

題意:

一個(gè)n*m的數(shù)組,初始全部是’.’,然后3種操作,把一個(gè)位置變成’w’,或者把一個(gè)位置變成’r’,或者交換兩行。

思路:

vector的swap是O(1)的,直接模擬就行。

// // main.cpp // chess play // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <vector> #include <algorithm> using namespace std; vector<int>c[1005]; int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {int n, m;scanf("%d%d", &n, &m);int q;scanf("%d", &q);for(int i = 1; i <= n; ++i) {c[i].clear();for(int j = 1; j <= m; ++j)c[i].push_back(0);}while(q--) {int t, tt, x, y;scanf("%d", &t);if(t == 1) {scanf("%d%d%d", &tt, &x, &y);if(tt == 1) c[x][y] = 1;else c[x][y] = 2;}else {scanf("%d%d", &x, &y);swap(c[x], c[y]);}}for(int i = 1; i <= n; ++i) {for(int j = 1; j <= m; ++j) {if(c[i][j] == 0) putchar('.');else if(c[i][j] == 1) putchar('w');else putchar('b');}puts("");}}return 0; }

Best couple

題意:

n個(gè)男生,m個(gè)女生,然后給一個(gè)鄰接表L[i][j],男生和女生配對(duì)的貢獻(xiàn)是他們之間的最短路,問(wèn)配對(duì)的最大貢獻(xiàn)是多少。

思路:

先跑個(gè)floyd最短路,本來(lái)最大貢獻(xiàn)是不一定是最大匹配的,但是因?yàn)榻o的鄰接表是無(wú)向圖,不存在這種反例,所以直接費(fèi)用流就行。

// // main.cpp // Best couple // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; const int N = 505; const int inf = ~0u>>2; int maz[N][N];const int M = 10005; struct eg{int u, v, cap, cost;eg(){}eg(int a, int b, int c, int d){ u = a, v = b, cap = c, cost = d; }; }edg[M<<2]; int fir[M], nex[M<<2]; int s, t, ecnt;void add(int a, int b, int c, int d){edg[ecnt] = eg(a, b, c, d);nex[ecnt] = fir[a], fir[a] = ecnt++;edg[ecnt] = eg(b, a, 0, -d);nex[ecnt] = fir[b], fir[b] = ecnt++; }int pre[M], dis[N]; int spfa(int s, int t, int n){ //spfa求最小花費(fèi)增廣路queue<int>q;bool vis[N]={0};memset(pre, -1, sizeof(pre));for(int i = 0; i <= n; ++i) dis[i] = inf;dis[s] = 0; vis[s] = 1;q.push(s);while( !q.empty() ){int u = q.front(); q.pop(); vis[u] = 0;for(int k = fir[u]; k != -1; k = nex[k]){int v = edg[k].v;if( edg[k].cap && dis[u] + edg[k].cost < dis[v]){dis[v] = edg[k].cost + dis[u];pre[v] = k;if(!vis[v]){q.push(v);vis[v] = 1;}}}}return dis[t] != inf; } int mincostEK(int s, int t, int n){ //源點(diǎn) 匯點(diǎn) 總點(diǎn)數(shù)int res = 0, minflow;while( spfa(s, t, n)){minflow = inf;for(int k = pre[t]; k != -1; k = pre[edg[k].u]){minflow = min(minflow, edg[k].cap); //找到增廣路上的最大可增廣量}for(int k = pre[t]; k != -1; k = pre[edg[k].u]){edg[k].cap -= minflow;edg[k^1].cap += minflow;}res += dis[t] * minflow; //根據(jù)題目修改}return res; }int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {memset(fir, -1, sizeof(fir)); ecnt = 0;int n, m;scanf("%d%d", &n, &m);for(int i = 1; i <= n+m; ++i) {for(int j = 1 ; j <= n+m; ++j) {scanf("%d", &maz[i][j]);if(maz[i][j] == -1) maz[i][j] = inf;}}s = 0, t = n+m+1;for(int k = 1; k <= n+m; ++k) {for(int i = 1; i <= n+m; ++i) {for(int j = 1; j <= n+m; ++j) {maz[i][j] = min(maz[i][j], maz[i][k]+maz[k][j]);}}}for(int i = 1; i <= n+m; ++i) {for(int j = 1; j <= n+m; ++j) {printf("%d ", maz[i][j]);}puts("");}for(int i = 1; i <= n; ++i) {add(s, i, 1, 0);for(int j = n+1; j <= n+m; ++j) {if(maz[i][j] == inf) continue;add(i, j, 1, -maz[i][j]);}}for(int j = n+1; j <= n+m; ++j) {add(j, t, 1, 0);}int ans = -mincostEK(s, t, t+5);printf("%d\n", ans);}return 0; }

1048 - Best substring

題意:

給一個(gè)字符串,然后val[i]表示以i為中心的最長(zhǎng)回文子串的長(zhǎng)度,然后求一個(gè)子串,滿(mǎn)足leni=1(?1)k+1?i?val[k]最大,其中k是i在原串中的位置。
簡(jiǎn)單的說(shuō)就是給一個(gè)數(shù)組,然后去掉一個(gè)前綴和后綴(可能為空),要求leni=1i?a[i]最大。

思路:

先跑馬拉車(chē)求出val數(shù)組,然后推一下發(fā)現(xiàn)可以斜率優(yōu)化,就是這個(gè)題。

// // main.cpp // Best substring // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef long long ll; const int N = 2e5+5; char str[N]; char s[N*2]; int sl[N*2]; //p[i]表示以i為中軸的最長(zhǎng)回文長(zhǎng)度 void manacher(char *str, int len){memset(sl, 0, sizeof(sl));int id = 0;for(int i = len; i >= 0; --i){s[2*i+2] = str[i];s[2*i+1] = '#';}s[0] = '$', s[2*len+2] = '\0';int up = 2*len+1;for(int i = 2; i < up; ++i){if(sl[id] + id > i) sl[i] = min(sl[2*id-i], sl[id]+id-i);else sl[i] = 1;while(s[i-sl[i]] == s[i+sl[i]]) ++sl[i];if(id+sl[id] < i+sl[i]) id = i;} } ll val[N], sum[N], p[N]; int q[N], tail, top; inline ll y(int x){ return p[x] - x*sum[x]; } double g(int j, int k){double dy = y(j) - y(k);double dx = j - k;return dy/dx; } inline ll getans(int i, int j){return p[i] - p[j] - j*(sum[i] - sum[j]); } int solve(ll x){int l = top, r = tail-1, mid, res = l;while(l <= r){mid = (l+r) >> 1;if(g(q[mid], q[mid-1]) < -x) l = mid+1, res = mid;else r = mid-1;}return q[res]; } int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {int n;scanf("%d %s", &n, str);manacher(str, n);for(int i = 1; i <= n; ++i) {val[i] = sl[i*2]-1;if(i%2 == 0) val[i] *= -1;}for(int i = 1; i <= n; ++i) {sum[i] = sum[i-1]+val[i];p[i] = p[i-1] + i*val[i];}top = tail = 0;q[tail++] = 0;ll ans = 0;for(int i = 1; i <= n; ++i){int j = solve(sum[i]);ans = max(ans, getans(i,j));while(top < tail-1 && g(i, q[tail-1]) < g(q[tail-1], q[tail-2])) tail--;q[tail++] = i;}printf("%lld\n", ans);}return 0; }

1049 - Deg-route

題意:

求從(0,0)走到(x,y),其中x>=y,且不穿過(guò)y=x的方案數(shù)。

思路:

考慮從(0,0)走到(x,y)且穿過(guò)y=x的方案數(shù),設(shè)為l(x,y)。
那么考慮第一次穿過(guò)的位置,設(shè)為(q,q)。
當(dāng)遍歷q從0到y(tǒng)-1時(shí),方案數(shù)是不重不漏的,因?yàn)槊糠N方案必然有第一次穿過(guò)的位置,且位置唯一。
設(shè)Cat(i)表示第i個(gè)卡特蘭數(shù),我們知道卡特蘭數(shù)是(0,0)走到(i,i)不經(jīng)過(guò)y=x的路徑數(shù),那么就可以表示出l(x,y)了。

l(x,y)=i=0y?1Cat(i)?Cx?ix?i+y?i?1
這個(gè)式子的意思是枚舉第一次穿過(guò)的點(diǎn)(i,i)然后走到這個(gè)點(diǎn)的方案數(shù)乘上這個(gè)點(diǎn)往上走了一步之后,再任意走到(x,y)的方案數(shù)。
這個(gè)式子的解:
l(x,y)=Cx+1x+1+y?1
也就是說(shuō)等價(jià)于從(-1,1)走到(x,y)的方案數(shù),我們來(lái)從組合學(xué)分析一下就知道,這是個(gè)十分優(yōu)美的結(jié)論。

首先條件是只能往x和y的正半軸走,并且要求穿過(guò)y=x。
穿過(guò)y=x并不是直觀的條件,考慮到穿過(guò)的那一步必須是往上走的,那么穿過(guò)y=x就等價(jià)于與y=x+1相交或者相接觸,此時(shí)根據(jù)x>=y,(x,y)是與y=x+1相離的。
注意到(-1,1)與(0,0)關(guān)于y=x+1對(duì)稱(chēng),那么從(-1,1)走到(x,y),是必然接觸y=x+1的,因?yàn)?-1,1)與(x,y)分別處于y=x+1分割的兩個(gè)半平面內(nèi),假設(shè)一條路徑與y=x+1的交點(diǎn)是(p,p+1),在相交之前走的路徑,我們總可以找到一條從(0,0)到(p,p+1)的路徑與之對(duì)應(yīng),根據(jù)對(duì)稱(chēng)性:
當(dāng)(-1,1)出發(fā)的路徑往上走,那么(0,0)出發(fā)的路徑就往右走。
當(dāng)(-1,1)出發(fā)的路徑往右走,那么(0,0)出發(fā)的路徑就往上走。
當(dāng)(0,0)走到了(p,p+1),之后的路就按照(-1,1)的走法走就行了。
容易證明這是不重不漏,一一對(duì)應(yīng)的,這樣我們就給出了一個(gè)組合學(xué)的解釋,從(0,0)走到(x,y)穿過(guò)y=x的方案數(shù)等價(jià)于從(-1,1)走到(x,y)的方案數(shù)。

那么最后答案就是總的減去不合法的:

ans=Cxx+y?Cx+1x+1+y?1
因?yàn)槟?shù)較小,lucas即可。

// // main.cpp // Deg-route // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef long long ll; const int MX = 1e5; const ll mod = 1e4+7; ll fac[MX]; ll pow_mod(ll a, ll k) {ll res = 1;while(k) {if(k&1) res = (res*a)%mod;a = (a*a)%mod;k >>= 1;}return res; } ll C(ll n, ll k){if(n < k || n < 0 || k < 0) return 0;return fac[n]*pow_mod(fac[n-k]*fac[k]%mod, mod-2)%mod; } ll lucas(ll a, ll b){if(b == 0) return 1;return lucas(a/mod, b/mod) * C(a%mod, b%mod) % mod; } void init(){ //初始化階乘fac[0] = fac[1] = 1;for(int i = 2; i <= mod; ++i) fac[i] = fac[i-1]*i%mod; }int main(int argc, const char * argv[]) {init();int T;scanf("%d", &T);while(T--) {int x, y;scanf("%d %d", &x, &y);printf("%lld\n", (lucas(x+y, x)-lucas(x+y, x+1)+mod)%mod);}return 0; }

1050 - array

題意:

給一個(gè)數(shù)組a,問(wèn)有多少個(gè)子序列滿(mǎn)足第一個(gè)數(shù)是1,后一個(gè)是前一個(gè)的兩倍。

思路:

直接dp,dp[i]表示以i結(jié)尾的子序列個(gè)數(shù),另外用個(gè)pre[i]表示2^i的個(gè)數(shù)。

// // main.cpp // array // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <map> using namespace std; typedef long long ll; const int N = 1e5+5; const ll mod = 1e9+7; ll a[N]; ll dp[N], pre[35]; int aa[N]; map<ll, int>cnt; int check(ll x) {if((x&(x-1)) != 0) return -1;return cnt[x]; } int main(int argc, const char * argv[]) {cnt[1] = 0;for(int x = 1, i = 2; i <= 1000000000; i <<= 1, ++x) {cnt[i] = x;}int T;scanf("%d", &T);while(T--) {memset(dp, 0, sizeof(dp));memset(pre, 0, sizeof(pre));int n;scanf("%d", &n);for(int i = 1; i <= n; ++i) {scanf("%lld", a+i);aa[i] = check(a[i]);}ll ans = 0;for(int i = 1; i <= n; ++i) {int tmp = aa[i];if(tmp == 0) dp[i] = 1;else dp[i] = pre[tmp-1];pre[tmp] = (pre[tmp]+dp[i])%mod;ans = (ans+dp[i])%mod;}printf("%lld\n", ans);}return 0; }

1051 - My-graph

題意:

問(wèn)n個(gè)點(diǎn)的圖能不能構(gòu)造出原圖和補(bǔ)圖同構(gòu)的圖。

思路:

滿(mǎn)圖有n*(n-1)/2條邊,至少邊數(shù)要是偶數(shù),猜了一發(fā)過(guò)了,實(shí)際上這是個(gè)充要條件。

// // main.cpp // My-graph // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {int n;scanf("%d", &n);if((n*(n-1)/2)%2 == 1) puts("no");else puts("yes");}return 0; }

1052 - See car

題意:

一個(gè)人站在(a,b),然后他的右下方有一些點(diǎn),問(wèn)你能看到的點(diǎn)的數(shù)量。

思路:

存下斜率就行。

// // main.cpp // See car // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <algorithm> #include <stdio.h> #include <set> using namespace std; typedef long long ll; ll gcd(ll a, ll b) { return b? gcd(b, a%b) : a; } struct dom{ll up, down;void loli() {ll tmp = gcd(up, down);up /= tmp, down /= tmp;}dom(ll a, ll b) { up = a, down = b; loli(); }bool operator < (const dom& z) const {return up*z.down < z.up*down;} }; set<dom>st; int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {ll a, b, n;scanf("%lld%lld%lld", &a, &b, &n);st.clear();for(ll x, y, i = 1; i <= n; ++i) {scanf("%lld %lld", &x, &y);st.insert(dom(y-b, x-a));}printf("%lld\n", (ll)st.size());}return 0; }

1053 - Gemstone digger

題意:

n個(gè)寶藏,去第i個(gè)地方有a[i]個(gè)寶藏,在i采寶藏的死的概率是pi,每個(gè)地方相互獨(dú)立,問(wèn)存活率>0.19的情況下最多采多少個(gè)寶藏。

思路:

dp[i][j]表示前i個(gè)寶藏中一共采了j個(gè)時(shí)最大的存活率是多少。
dp[i][j] = dp[i-1][j];
if(j >= a[i]) dp[i][j] = max(dp[i][j], dp[i-1][j-a[i]]*(1-pi))
跑完后掃一遍找存活率大于0.19的最多寶藏。

// // main.cpp // Gemstone digger // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int a[1005]; double p[1005]; double dp[105][50005]; int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {int n;int tot = 0;scanf("%d", &n);for(int i = 1; i <= n; ++i) {scanf("%d", a+i);tot += a[i];}for(int i = 1; i <= n; ++i) {scanf("%lf", p+i);}memset(dp, 0, sizeof(dp));dp[0][0] = 1;for(int i = 1; i <= n; ++i) {for(int j = 0; j <= tot; ++j) {if(j >= a[i]) dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i]]*(1-p[i]));else dp[i][j] = dp[i-1][j];}}int ans = 0;for(int i = 1; i <= n; ++i) {for(int j = 0; j <= tot; ++j) {if(dp[i][j] > 0.19) ans = max(ans, j);}}printf("%d\n", ans);}return 0; }

1054 - String cut

題意:

給一個(gè)字符串,可以刪一個(gè)字符,刪完后要求串是由一個(gè)子串重復(fù)k次構(gòu)成的,求最大的k。

思路:

字符串不會(huì)做,待隊(duì)友補(bǔ)。

1055 - Ball-box

題意:

一個(gè)盒子一開(kāi)始有n個(gè)球,每個(gè)球標(biāo)號(hào)唯一,先執(zhí)行操作1,如果兩個(gè)球x,y滿(mǎn)足|x-y|不在盒子里,那么久把|x-y|放進(jìn)去,設(shè)操作次數(shù)為p1,然后執(zhí)行操作2,不斷摸球,直到所有球都被摸過(guò),設(shè)操作次數(shù)為p2,求p1+p2的期望。

思路:

如果兩個(gè)球x,y在盒子里,設(shè)x>=y,那么gcd(x,y) == gcd(x,x-y),可以推出最后所有數(shù)的gcd等價(jià)于一開(kāi)始所有數(shù)的gcd,那么操作1的次數(shù)就是最大的數(shù)/gcd。
操作2的次數(shù)容易推導(dǎo),設(shè)dp[i]表示已經(jīng)摸了i個(gè)球,直到摸完所有球的期望次數(shù)。顯然有dp[n]=0dp[i]=i/n?dp[i]+(n?i)/n?dp[i+1]+1
化簡(jiǎn)下dp[n] = 0, dp[i] = dp[i+1]+n/i。
那么dp[0] = n*Hn,其中Hn是調(diào)和級(jí)數(shù)。
然后算就行了。
注意需要特判0。

// // main.cpp // Ball-box // // Created by 翅膀 on 16/11/5. // Copyright ? 2016年 kg20006. All rights reserved. //#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int N = 60005; int gcd(int a, int b) { return b? gcd(b, a%b) : a; } int a[N]; int main(int argc, const char * argv[]) {int T;scanf("%d", &T);while(T--) {int n, mx = -1, zr = 0;scanf("%d", &n);for(int i = 1; i <= n; ++i) {scanf("%d", a+i); mx = max(mx, a[i]);if(a[i] == 0) zr = 1;}int tmp = a[1];for(int i = 2; i <= n; ++i) {tmp = gcd(tmp, a[i]);}int tot = mx/tmp+zr;double ans = 0;for(int i = 1; i <= tot; ++i) {ans += 1.0*tot/i;}ans += (tot-n);printf("%d\n", (int)ans);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的“玲珑杯”ACM比赛 Round #4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚州一区二区 | 在线观看黄网址 | 国产学生美女无遮拦高潮视频 | 黄色录象片 | 激情内射亚洲一区二区三区爱妻 | 秋霞欧美在线观看 | 精品一卡二卡 | 日韩免费一二三区 | 欧美老熟妇乱大交xxxxx | 天天久久综合网 | 91免费小视频 | 国产1区在线 | 无码一区二区三区免费 | 国产主播中文字幕 | 亚洲av无码一区二区三区性色 | 中文免费在线观看 | 欧美在线播放一区 | 一级绝黄 | 神马午夜dy888| 亚州国产 | 欧美乱做爰xxxⅹ久久久 | 国产又黄又爽又色 | 欧洲一区二区视频 | av观看免费 | 人妻夜夜爽天天爽三区麻豆av网站 | 精品国偷自产一区二区三区 | 日日噜噜噜噜久久久精品毛片 | 日韩色中色| 夜夜躁狠狠躁日日躁 | 看特级毛片 | 水果视频污 | 欧美亚洲另类视频 | 热99这里只有精品 | 91av日本| 国产精品一区二区小说 | 色妞av | 一区二区视频免费在线观看 | 国产欧美在线视频 | 国产黑丝av| 在线观看免费观看 | 精品成人免费视频 | 国产露出视频 | 亚洲一级大片 | 日韩欧美中出 | 日韩中文字幕第一页 | 国产美女作爱全过程免费视频 | 打屁股疼的撕心裂肺的视频 | 久久久久久久亚洲 | 精品自拍偷拍 | 一卡二卡三卡四卡五卡 | 亚洲女优在线播放 | 黄色大片a级 | 午夜神器在线观看 | 97久久精品 | 男女黄床上色视频免费的软件 | 欧美一a| 亚洲精品无码久久久 | 国产一区二区亚洲 | 国产精品一二区 | 日韩五十路 | 国产福利在线视频观看 | 亚洲爽爆av | 黄色av网址大全 | 电影一区二区三区 | 亚洲欧美校园春色 | 五月天欧美 | 91久久综合精品国产丝袜蜜芽 | 国产又粗又长又黄的视频 | 中文字幕丰满人伦在线 | 国产一级网站 | 亚洲一二三四视频 | 性高潮影院 | 欧美一区二区三区成人精品 | 日韩精品电影 | 午夜久久电影 | 日本黄网站色大片免费观看 | 少妇特黄一区二区 | 精品中文字幕一区二区三区 | 少妇精品高潮欲妇又嫩中文字幕 | 97在线免费公开视频 | 婷婷综合五月 | 脱裤吧导航 | 国产精品人妻一区二区三区 | 三上悠亚中文字幕在线播放 | 国产91综合 | 欧美在线一 | 8x国产一区二区三区精品推荐 | 丝袜国产视频 | 欧美日韩国产免费一区二区三区 | 国产视频在线观看一区 | 欧洲精品码一区二区三区免费看 | 天堂а√在线最新版中文在线 | 看一级大片| 欧美黄色大片在线观看 | 少妇又紧又色又爽又刺激 | 俄罗斯精品一区二区三区 | av网址观看 | 传媒一区二区 | 国产美女无遮挡免费视频 |