【网络流专练一】UVA五题(UVA12125,UVA11082,UVA10983,UVA1306,UVA10735)

网络流专练

  • March of the Penguins
  • 矩阵解压 Matrix Decompressing
  • Buy one, get the rest free
  • The K-League
  • 混合图的欧拉回路 Euler Circuit

什么破网站,多余空格换行都不能有,还nm不报PE/RE只报WA。
少一行换行也不行,这是什么垃圾文本比较。

March of the Penguins

problem

UVA12125


solution

枚举冰块,然后判断被枚举冰块是否符合条件。

将冰块拆成两个点,左点和右点,之间流量是可跳跃次数。

超级源点和左点连边,流量为该冰块上的初始企鹅数。

然后两两冰块枚举能否互跳,分别右点连向左点,流量无穷。

最后连一条最后的冰块左点和超级汇点的边,流量无穷。


code

#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 205
#define maxm 40005
#define inf 0x7f7f7f7f
queue < int > q;
struct node { int to, nxt, flow, ori; }E[maxm];
int T, n, cnt, tot, s, t;
double d;
double x[maxn], y[maxn];
int dep[maxn], cur[maxn], head[maxn], num[maxn], lim[maxn];double dis( int i, int j ) { return sqrt( ( x[i] - x[j] ) * ( x[i] - x[j] ) + ( y[i] - y[j] ) * ( y[i] - y[j] ) ); }void addedge( int u, int v, int w ) {E[cnt] = { v, head[u], w, w };head[u] = cnt ++;E[cnt] = { u, head[v], 0, 0 };head[v] = cnt ++;
}bool bfs() {for( int i = 0;i <= t;i ++ ) dep[i] = 0;dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to; if( ! dep[v] and E[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];
}int dfs( int u, int cap ) {if( u == t or ! cap ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int dinic() {int ans = 0;while( bfs() ) ans += dfs( s, inf );return ans;
}void build( int now ) {memset( head, -1, sizeof( head ) ); cnt = 0;for( int i = 1;i <= n;i ++ ) {addedge( s, i, num[i] );addedge( i, i + n, lim[i] );for( int j = i + 1;j <= n;j ++ )if( dis( i, j ) <= d ) {addedge( i + n, j, inf );addedge( j + n, i, inf );}}addedge( now, t, inf );
}int main() {scanf( "%d", &T );while( T -- ) {memset( head, -1, sizeof( head ) );cnt = tot = 0;scanf( "%d %lf", &n, &d );t = n << 1 | 1;for( int i = 1;i <= n;i ++ ) {scanf( "%lf %lf %d %d", &x[i], &y[i], &num[i], &lim[i] );tot += num[i];}bool flag = 0;for( int i = 1;i <= n;i ++ ) {build( i );if( dinic() == tot ) {if( flag ) printf( " " );printf( "%d", i - 1 );flag = 1;}}if( ! flag ) printf( "-1" ); printf( "\n" );}return 0;
}

矩阵解压 Matrix Decompressing

problem

UVA11082


solution

显然可以解出每行每列的和。

然后将行列分成左右点两部分(类似二分图)。

超级源点和行连边,流量为行的和。

列和超级汇点两边,流量为列的和。

然后两两行列点之间流量为 191919

当超级源点和超级汇点的边都满流时,iiijjj 列之间的边流过的流量 +1+1+1 就是 a[i,j]a[i,j]a[i,j] 的值。

解释:

  • 每个数大小在 [1,20][1,20][1,20],所以不用太大。
  • 可能出现零流的状况(因为同是最大流但流法不太一样导致有些边代表的位置值计算出来是 000,不符合范围)所以提前 −1-11

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 100
#define inf 0x7f7f7f7f
struct node { int to, nxt, flow; }E[maxn * maxn];
int T, n, m, s, t, cnt;
int r[maxn], c[maxn], head[maxn], cur[maxn], dep[maxn];
int ans[maxn][maxn];queue < int > q;void addedge( int u, int v, int w ) {E[cnt] = { v, head[u], w };head[u] = cnt ++;E[cnt] = { u, head[v], 0 };head[v] = cnt ++;
}bool bfs() {memset( dep, 0, sizeof( dep ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];
}int dfs( int u, int cap ) {if( u == t or ! cap ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int main() {scanf( "%d", &T );for( int Case = 1;Case <= T;Case ++ ) {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%d", &r[i] );for( int i = 1;i <= m;i ++ ) scanf( "%d", &c[i] );for( int i = n;i;i -- ) r[i] = r[i] - r[i - 1];for( int i = m;i;i -- ) c[i] = c[i] - c[i - 1];cnt = s = 0, t = n + m + 1;memset( head, -1, sizeof( head ) );for( int i = 1;i <= n;i ++ ) addedge( s, i, r[i] - m );for( int i = 1;i <= m;i ++ ) addedge( i + n, t, c[i] - n );for( int i = 1;i <= n;i ++ ) for( int j = 1;j <= m;j ++ ) addedge( i, j + n, 19 );while( bfs() ) dfs( s, inf );for( int i = 1;i <= n;i ++ ) for( int j = head[i];~ j;j = E[j].nxt ) ans[i][E[j].to - n] = 20 - E[j].flow;printf( "Matrix %d\n", Case );for( int i = 1;i <= n;i ++ ) { for( int j = 1;j <= m;j ++ ) printf( "%d ", ans[i][j] ); printf( "\n" ); }}return 0;
}

Buy one, get the rest free

problem

UVA10983


solution

观察到总天数 d≤10d\le 10d10,非常小,很套路的拆点。

将一个城市拆成 ddd 个点,表示第 ddd 天的城市。

一架航班就连对应两座城的两个时间代表点。

一座城市之间也有天数小的与天数大的点连边。

超级源点和每座城市的第 000 点代表点连边,流量为该城市人数。


code

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 2005
#define inf 0x7f7f7f7f
struct node { int u, v, c, p, e; }flight[maxn];
struct edge { int to, nxt, flow; }E[maxn << 3];
int T, n, m, d, cnt, tot, s, t;
int head[maxn], dep[maxn], cur[maxn], w[maxn];
queue < int > q;void addedge( int u, int v, int w ) {E[cnt] = { v, head[u], w };head[u] = cnt ++;E[cnt] = { u, head[v], 0 };head[v] = cnt ++;
}bool bfs() {memset( dep, 0, sizeof( dep ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[( d + 1 ) * n];
}int dfs( int u, int cap ) {if( u == n * ( d + 1 ) or ! cap ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int dinic() {int ans = 0;while( bfs() ) ans += dfs( s, inf );return ans;
}bool check( int pos ) {memset( head, -1, sizeof( head ) ); cnt = 0;for( int i = 1;i <= n;i ++ ) {addedge( s, i, w[i] );for( int j = 0;j < d;j ++ )addedge( i + j * n, i + ( j + 1 ) * n, inf );}for( int i = 1;i <= pos;i ++ ) {int u = flight[i].u, v = flight[i].v, c = flight[i].c, e = flight[i].e;addedge( u + e * n, v + ( e + 1 ) * n, c );}return dinic() == tot;
}int main() {scanf( "%d", &T );for( int Case = 1;Case <= T;Case ++ ) {scanf( "%d %d %d", &n, &d, &m );for( int i = 1, u, v, c, p, e;i <= m;i ++ ) {scanf( "%d %d %d %d %d", &u, &v, &c, &p, &e );flight[i] = { u, v, c, p, e };}tot = 0;for( int i = 1;i <= n;i ++ ) scanf( "%d", &w[i] ), tot += w[i];sort( flight + 1, flight + m + 1, []( node x, node y ) { return x.p < y.p; } );int l = 1, r = m, ans = -1;while( l <= r ) {int mid = ( l + r ) >> 1;if( check( mid ) ) ans = flight[mid].p, r = mid - 1;else l = mid + 1;}if( ~ ans ) printf( "Case #%d: %d\n", Case, ans );else printf( "Case #%d: Impossible\n", Case );}return 0;
}

The K-League

problem

UVA1306


solution

枚举每个队伍成为最后的冠军,然后钦定其剩余的比赛肯定都是这个队伍赢。

然后就是剩下队伍之间的比赛。

比赛建立 n∗nn*nnn 个点(两个队伍之间的比赛),队伍 nnn 个点。

超级源点和比赛连边,流量为两个队伍之间要进行的比赛场数。

比赛和比赛的两个队伍连边,流量为无穷。

队伍和超级汇点连边,流量为冠军队伍赢的场数减去本队伍已经赢的场数(保证所有队伍赢的场数不能超过冠军队伍)。

当超级源点的边都满流时,证明合法。


#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 700
#define inf 0x7f7f7f7f
int T, n, cnt, s, t;
int w[maxn], d[maxn], head[maxn], dep[maxn], cur[maxn];
int a[maxn][maxn];
struct node { int to, nxt, flow; }E[maxn * maxn];
queue < int > q;void addedge( int u, int v, int w ) {E[cnt] = { v, head[u], w };head[u] = cnt ++;E[cnt] = { u, head[v], 0 };head[v] = cnt ++;
}int build( int x ) {memset( head, -1, sizeof( head ) ); cnt = 0;int tot = w[x];for( int i = 1;i <= n;i ++ ) tot += a[x][i];for( int i = 1;i <= n;i ++ ) if( w[i] > tot ) return -1;for( int i = 1;i <= n;i ++ )for( int j = i + 1;j <= n;j ++ )if( i ^ x and j ^ x and a[i][j] ) {addedge( s, ( i - 1 ) * n + j, a[i][j] );addedge( ( i - 1 ) * n + j, i + n * n, inf );addedge( ( i - 1 ) * n + j, j + n * n, inf );}for( int i = 1;i <= n;i ++ ) if( i ^ x ) addedge( i + n * n, t, tot - w[i] );return tot - w[x];
}bool bfs() {memset( dep, 0, sizeof( dep ) );dep[s] = 1; q.push( s );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[t];
}int dfs( int u, int cap ) {if( u == t or ! cap ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int dinic() {int ans = 0;while( bfs() ) ans += dfs( s, inf );return ans;
}int main() {scanf( "%d", &T );while( T -- ) {scanf( "%d", &n ); s = 0, t = n * ( n + 1 ) + 1;for( int i = 1;i <= n;i ++ ) scanf( "%d %d", &w[i], &d[i] );int tot = 0;for( int i = 1;i <= n;i ++ ) for( int j = 1;j <= n;j ++ ) scanf( "%d", &a[i][j] ), tot += a[i][j];tot >>= 1;for( int i = 1, flag = 0;i <= n;i ++ ) {int win = build( i );if( win == -1 ) continue;if( dinic() + win == tot ) {if( flag ) printf( " %d", i );else printf( "%d", i );flag = 1;}}printf( "\n" );}return 0;
}

混合图的欧拉回路 Euler Circuit

problem

UVA10735


solution

欧拉回路的条件就是出边数等于入边数。

不妨设 di:id_i:idi:i 点的出边减去入边的数量。

当所有的 ddd 都为 000 的时候,证明是一个欧拉回路。

给所有无向边随意钦定一个方向。

改变一条边的顺序就是一个点度数 −1/+1-1/+11/+1 的区别。

可以看作是流量 111 的流通。

d>0d>0d>0 的归入左边点,d<0d<0d<0 的归入右边点。

超级源点和左边点连边,流量为左边点多出的数量。

右边点和超级汇点连边,流量为右边点少掉的数量。

无向边就成为左边点和右边点之间流量为 111 的边。

当超级源点超级汇点都满流时,证明欧拉回路出现。

最后根据左右点之间边流量为 1/01/01/0 判断方向是否改变,输出这个欧拉回路即可。


code

#include <bits/stdc++.h>
using namespace std;
#define maxn 2000
#define inf 0x7f7f7f7f
struct node { int to, nxt, flow; }E[maxn];
pair < int, int > edge[maxn];
vector < int > G[maxn];
queue < int > q;
int n, m, cnt, S, T, sum;
int head[maxn], cur[maxn], dep[maxn], d[maxn], id[maxn];void addedge( int u, int v, int w ) {E[cnt] = { v, head[u], w };head[u] = cnt ++;E[cnt] = { u, head[v], 0 };head[v] = cnt ++;
}bool bfs() {memset( dep, 0, sizeof( dep ) );dep[S] = 1; q.push( S );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = cur[u] = head[u];~ i;i = E[i].nxt ) {int v = E[i].to;if( ! dep[v] and E[i].flow ) {dep[v] = dep[u] + 1;q.push( v );}}}return dep[T];
}int dfs( int u, int cap ) {if( u == T or ! cap ) return cap;int flow = 0;for( int i = cur[u];~ i;i = E[i].nxt ) {cur[u] = i; int v = E[i].to;if( dep[v] == dep[u] + 1 ) {int w = dfs( v, min( cap, E[i].flow ) );if( ! w ) continue;E[i ^ 1].flow += w;E[i].flow -= w;flow += w;cap -= w;if( ! cap ) break;}}return flow;
}int dinic() {int ans = 0;while( bfs() ) ans += dfs( S, inf );return ans;
}void dfs( int u ) {while( ! G[u].empty() ) {int v = G[u].back();G[u].pop_back();dfs( v );printf( " %d", u );}
}bool init() {scanf( "%d %d", &n, &m );cnt = sum = S = 0, T = n + 1;memset( head, -1, sizeof( head ) );memset( d, 0, sizeof( d ) );for( int i = 1;i <= n;i ++ ) G[i].clear();for( int i = 1, u, v;i <= m;i ++ ) {char ch[5];scanf( "%d %d %S", &u, &v, ch );edge[i] = { u, v };d[u] ++, d[v] --;if( ch[0] == 'U' ) id[i] = cnt, addedge( u, v, 1 );else id[i] = -1;}for( int i = 1;i <= n;i ++ ) {if( d[i] & 1 ) return 0;d[i] >>= 1;if( d[i] > 0 ) sum += d[i], addedge( S, i, d[i] );else addedge( i, T, -d[i] );}return 1;
}void solve() {if( dinic() != sum ) { printf( "No euler circuit exist\n" ); return; }#define u edge[i].first#define v edge[i].secondfor( int i = 1;i <= m;i ++ )if( id[i] >= 0 and ! E[id[i]].flow ) G[u].push_back( v );else G[v].push_back( u );#undef u#undef vprintf( "1" );dfs( 1 );puts( "" );
}int main() {int T;scanf( "%d", &T );while( T -- ) {if( ! init() ) printf( "No euler circuit exist\n" );else solve();if( T ) printf( "\n" );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

采用.NET CORE的全异步模式打造一款免费的内网穿透工具--NSmartProxy

什么是NSmartProxy&#xff1f;NSmartProxy是一款免费的内网穿透工具。特点跨平台&#xff0c;客户端和服务端均可运行在MacOS&#xff0c;Linux&#xff0c;Windows系统上&#xff1b;使用方便&#xff0c;配置简单&#xff1b;多端映射&#xff0c;一个NSmart Proxy客户端可以…

Acwing 236. 格鲁吉亚和鲍勃(博弈论妙题)

Acwing 236. 格鲁吉亚和鲍勃 题意&#xff1a; 一排网格&#xff0c;将网格从左到右依次编号 1,2,3&#xff0c;…&#xff0c;并将 N 个西洋棋棋子放在不同的网格上&#xff0c;如下图所示&#xff1a; 两个人轮流移动棋子 每次玩家选择一个棋子&#xff0c;并将其向左移动…

.NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯

1&#xff0c;前言开发环境&#xff1a;在 Visual Studio 2017&#xff0c;.NET Core 2.x串口通讯用于设备之间&#xff0c;传递数据&#xff0c;物联网设备中广泛使用串口方式连接通讯&#xff0c;物联网通讯协议 &#xff1a;Modbus 协议 ASCII、RTU、TCP模式是应用层的协议&…

洛谷P1173:[NOI2016] 网格(tarjan、离散化)

解析 看起来很不码农但写起来其实还行的一道题。 主要也是因为我贺题解把所有的雷都避过去了 首先一个比较显然的结论是&#xff1a;通过堵角上的&#xff0c;答案不超过2。 所以本题只要把答案是-1&#xff0c;0&#xff0c;1&#xff0c;2的情况判出来即可。 -1是只有一个…

【无码专区5】01串(大讨论+构造)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

Game of Cards Gym - 102822G

Game of Cards Gym - 102822G 题意&#xff1a; 小兔子和小马喜欢玩奇怪的纸牌游戏。现在&#xff0c;他们正在玩一种叫做0123游戏的纸牌游戏。桌子上有几张牌。其中c0标记为0&#xff0c;c1标记为1&#xff0c;c2标记为2&#xff0c;c3标记为3。小兔子和小马轮流玩游戏&…

开源组件ExcelReport 3.x.x 使用手册(为.netcore而来

ExcelReport转眼已经开源4年了&#xff0c;期间有很长时间也停止了对它的维护。18年年末有人联系到我&#xff0c;说“兄弟&#xff0c;ExcelReport不错&#xff0c;但什么时候支持.netcore呢&#xff1f;”。我寥寥的回了几句搪塞的话&#xff0c;也没当回事。后来这兄弟又来问…

洛谷P4007:小 Y 和恐怖的奴隶主(期望、矩阵快速幂)

解析 不难发现有效的状态只有 SC113165SC_{11}^3165SC113​165 种。 同时&#xff0c;能支持 n1018n10^{18}n1018 的算法也不剩啥了&#xff0c;要么拉插&#xff0c;要么矩乘。 本题当然就是矩乘了&#xff0c;转移矩阵也较为显然。 然而&#xff0c;直接做的话复杂度是 O(T…

集合均值(逆元+数学)

problem 题目描述 有两个可重集合 nnn&#xff0c;初始时 mmm 只包含一个 000&#xff0c;是给定的。 执行以下操作&#xff1a; 在 BBB 中随机选一个数 yyy&#xff0c;把 yyy 从 BBB 移动到 AAA。给答案加上 AAA 的平均值。若 BBB 非空&#xff0c;回到步骤 111。 求最后答…

《.NET Core 和前后端那些事儿》技术交流活动纪实

长沙.NET技术社区.NET Core和前后端那些事儿技术交流纪实2019年3月10日&#xff0c;下午&#xff0c;在位于沁园春御院的长沙市互联网活动基地&#xff0c;在长沙市.NET技术社区的组织下&#xff0c;长沙市.NET技术圈第一次纯粹的技术沙龙在这里召开。这次活动总共参加人数超过…

CF 1529C Parsa‘s Humongous Tree

CF 1529C Parsa’s Humongous Tree 题意&#xff1a; 给你一颗n个点&#xff0c;n-1个边的树&#xff0c;每个点的点权为一个区间值&#xff0c;树的值为边权和。 边权为该边的两个端点的点权差的绝对值的和 问树的值最大是多少&#xff1f; 题解&#xff1a; 这个题给的点…

聚烷撑乙二醇(数学+期望)

problem 有 nnn 个随机数生成器&#xff0c;第 iii 个生成器可以均匀随机地生成 [Li,Ri][L_i,R_i][Li​,Ri​] 内的一个实数。 现在你要玩个游戏&#xff0c;从第 111 个生成器到第 nnn 个生成器&#xff0c;每次当前生成器会生成一个数&#xff0c;你需要选择&#xff1a; …

AT2293 [AGC009D] Uninity(贪心、状压)

解析 题意描述令人一脸懵逼… 看了一下样例再回去看那个uninity的定义才大概明白&#xff0c;题目所求的其实就是按照给出树构造的点分树的最大深度的最小值。 然后…就不会辣qwq 一开始的方向就错了&#xff0c;尝试通过确定分治重心来考虑&#xff0c;还真发现了一些挺有意…

10个小技巧助您写出高性能的ASP.NET Core代码

今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能&#xff0c;本文的大部分内容来自翻译&#xff0c;当然中间穿插着自己的理解&#xff0c;希望对大家有所帮助&#xff01;话不多说开始今天的主题吧&#xff01;我们都知道性能是公共网站取得成功的关键因素…

技术情报局(笛卡尔树)

problem 有这样一道简单题&#xff1a;给定一个序列求所有区间的最大值的和。 还有这样一道简单题&#xff1a;给定一个序列求所有区间的乘积的和。 众所周知&#xff1a;简单题 简单题 简单题。 所以&#xff0c;给定一个长为 nnn 的正整数序列&#xff0c;定义一个区间…

CF 1529D Kavi on Pairing Duty

CF 1529D Kavi on Pairing Duty 题意&#xff1a; 有2 * n个点&#xff0c;现在要求两个点连成线段&#xff0c;每个连法都可以得到n个线段&#xff0c;合法的连接方式为&#xff1a;连接的n个线段&#xff0c;任意两个线段要么长度相等&#xff0c;要么有包含关系 n<1e6 …

P5363 [SDOI2019]移动金币(博弈论、dp)

解析 阶梯dp&#xff0c;感觉挺妙的。 有想过按奇偶考虑&#xff0c;但是没搞出来… 本题关键肯定就是确定必胜的等价条件。 题意可以转化为&#xff1a;有 m1 个节点&#xff0c;上面一共有 n-m 个棋子&#xff0c;每次可以把一堆的若干个棋子放到前一堆。 这就是经典的阶梯…

东莞.NET技术线下沙龙活动资料分享

今天天气虽然很不好&#xff0c;但不减广大.NET开发者的热情&#xff0c;仍然到场率很高。因图片还在整理中&#xff0c;暂时只发出个简单的活动资料整理分享&#xff0c;后续摄影师图片修图好后&#xff0c;再一并给到场者发送图片&#xff0c;和对活动的现场报道作更详细的图…

F. It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!

F. It’s a bird! No, it’s a plane! No, it’s AaParsa! 题意&#xff1a; 有n个城市&#xff0c;每个城市都有一个传送大炮指向另一个城市&#xff0c;每个大炮都有发送时间&#xff0c;每过1s&#xff0c;大炮就会从原本指向b&#xff0c;指向(b1)%n,问任意两点之间的最短…

【无码专区6】球与盒子(数学线性筛)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…