网络流及建模专题(上)

前言

不断更新中……
这几天新坑填不下去了,回来回顾一些经典的模型套路,先拿网络流开刀,窃以为洛谷这几道网络流的题目还是非常具有代表性的,涵盖了网络流调整多解计数最小割最大权闭合子图问题。
还涵盖了图论(二分图)中的一些结论和:最小不相交路径覆盖、最小可相交路径覆盖、二分图最大点权独立集、二分图最小点权覆盖集等问题,这里将简略介绍一下。

本专题包含六道题:P2765、P2764、P2763、P2766、P2774、P2805

P2765 网络流调整技巧
P2763 二分图多重匹配问题
P2764 最小不相交路径覆盖、最小可相交路径覆盖
P2766 一类dp计数问题、最多不相交路径
P2774 二分图最大点权独立集、二分图最小点权覆盖集
P2805 最大权闭合子图

前提

  • 知道网络流的基本用法。
  • 知道最大流最小割定理。
  • 知道二分图的定义。
  • 有一个稳定好用的Dinic求网络流的板子。

P2765 魔术球问题

前言

这道题应该可以通过贪心的方法过,不过既然放在了网络流专题里面,我们就认真的用网络流试一试并总结一下经验。

题解

添加一个小球相当于在网络中出现了一个从源点SSS到汇点TTT的流量。

分析一下题目:同一个柱子的小球要求可以与前一个小球形成和为完全平方数的情况,当一个新的小球到来的时候,可以加入其中的一根柱子,当然也可以另外开启一个新的柱子,使用的柱子的总数不得超过nnn

我们另开一个节点T′T'T用来表示柱子的上限,连接一条容量为nnn的边(T′,T)(T',T)(T,T)

我们尝试把小球拆成两个点BBBB′B'B,并且由SSSBBB连接一条容量为111的边。由B′B'BTTT连接一条容量为111的边,为什么容量为111?这限制了每个球后面都只能紧邻地放一个球。

如果数大的小球与某个数小的小球之间组合满足和为完全平方数(即大球可以放在小球后面),我们就从连接一条容量为111的边(B大球,B小球′)(B_{大球},B_{小球}')(B,B)。这代表该大球可以放在小球后面不需要开启新的柱子。

每个球都可以连接一条容量为111的边(B,T′)(B,T')(B,T)。代表该小球独立开启了一个新的柱子。

如下图所示:
这里写图片描述
回顾一下这张图:
BBB流向T′T'T的流量代表BBB球开启了一个新的柱子,而从B大球B_{大球}BB小球′B_{小球}'B的流量代表B大球B_{大球}B放在了B小球B_{小球}B的后面。

这只是建图模型,我们在解决这道题的时候不能跑一遍网络流完事,而是需要使用迭代加深搜索的思想,增量式建图,每次加入一个球,然后在残余网络中跑最大流,判断能否跑满,如果跑不满,那么答案就是上次跑满时候的结果。

最后,这道题要求输出方案,我们只需要在残余网络里面遍历去边的容量,然后就可以得到方案了,这里不必细说,看我的代码就可以了。

参考代码 见附录

放置、匹配的问题,都可以往网络流方面思考。


P2764 最小路径覆盖

什么是最小路径覆盖?

最小路径覆盖分为两种

  • 最小不相交路径覆盖
  • 最小可相交路径覆盖

最小不相交路径覆盖的做法

构造一个新图,将一个点BBB拆成B1B_1B1B2B_2B2两个点,在原图中如果有边(A,B)(A,B)(A,B)那么在新图中连接边(A1,B2)(A_1,B_2)(A1,B2)
然后形成了一张二分图,结论就是最小不相交路径覆盖=原图节点数-二分图的最大匹配

如何理解这个过程呢?

一开始每个点都是一条路径。
在二分图中,每形成一个匹配,就相当于一条路径将匹配两边的点给合并了,也就是合并了两个路径,这样一直匹配下去,路径数就在不断的减少,所以最终形成的就是最小路径覆盖,最后的路径数就是一开始原图的节点数-匹配数。

最小可相交路径覆盖的做法

这个问题与本题没有关系,只是扩展,可以暂时跳过。
解这个小问的方法是把这个问题化归到最小不相交路径覆盖上去。

可相交也就是说如果两点可达,那么不管这两点中间有多少节点,我都可以去经过。

先跑出可达矩阵,用Floyd算法,算出两两点之间的可达性。
然后如果两两可达,则建边。建成新图以后,就变成了最小不相交路径覆盖问题了。

理解

但是如果两个点a和b是连通的,只不过中间需要经过其它的点,那么可以在这两个点之间加边,那么a就可以直达b,不必经过中点的,那么就转化成了最小不相交路径覆盖。

这道题同样需要输出方案,在残余网络中遍历边处理就可以了。

参考代码 见附录


P2763 试题库问题

我觉得这是一个非常典型的二分图问题。

kkk种类型是二分图左侧的kkk个点。

nnn个试题是二分图右侧的nnn个点。

如果某试题属于某种类型,就在试题和类型之间连接一条边,容量为111

要求选出numnumnumttt类型的题目,那么就在源点SSSttt类型点之间加入一条容量为numnumnum的边。

而每道题目只能使用一次,因此在题目ppp和汇点TTT之间连接一条容量为111的边。

然后跑一遍最大流就可以得到答案了。
这里写图片描述

参考代码见附录


P2766 最长不下降子序列问题

这类问题属于动态规划方程已知,对解方案计数的问题。
还有的是要求最短路的数量的问题,我之前有在我的博客里写过,感兴趣的各位可以找找看。

第一问

要求求出最长不下降子序列长度,这个使用动态规划很容易解决,但是我们必须要在这一步中处理出以a[i]a[i]a[i]元素为结尾的最长非降子序列的长度数组f[i]f[i]f[i]

第二问

要求在所有的点都不能重复使用的时候,能找到多少个最长非减子序列。

在网络流处理问题的模型中,如果一个点不能重复利用,那么我们可以将这个点PPP拆成两个点PsP_sPsPtP_tPt,并由PsP_sPsPtP_tPt连接一条容量为111的边。所有流入这个点的边都与PsP_sPs相连,所有流出这个点的边都与PtP_tPt相连。

在这个题中,我们从f[i]f[i]f[i]数组出发,建立一个DAG(有向无环图)。即满足f[j]+1=f[i]f[j]+1=f[i]f[j]+1=f[i]a[j]≤a[i]a[j] ≤ a[i]a[j]a[i](j,i)(j,i)(j,i)我们都建立一条iiijjj的容量为infinfinf的边。

然后建立一个超级源点SSS,和超级汇点TTTSSSf[i]==mxlenf[i] == mxlenf[i]==mxlen的点iii连边,TTTf[i]==1f[i] == 1f[i]==1的点iii连边,容量均为111
然后按照我上面说的方法拆点。
举例:
3,6,2,53,6,2 ,53,6,2,5
这个序列的mxlen=2mxlen=2mxlen=2,f[]=1,2,1,2f[]={1,2,1,2}f[]=1,2,1,2,我们建成的图就是:
这里写图片描述
这样的话,跑一遍最大流就知道有多少条长度为mxlenmxlenmxlen的不相交的路径了。

第三问

若某个点可以无限用的话,那么这个点就不应该被拆。

对第二问的图稍做修改,如下
这里写图片描述

这里有个小细节xnx_nxnx1x_1x1直接相连接的时候,他们之间的边权不能设为 infinfinf而应该是111

另一个小细节就是如果mxlen==1mxlen==1mxlen==1那么直接输出nnn不需要建图。

参考代码 见附录

P2774 方格取数问题

由这个问题引出的模型是二分图最大点权独立集

二分图点权最大独立集:带点权二分图G中的一个子集V,其中一条边的两个端点不能同时属于V,且V中点权和最大。

二分图最大点权独立集对偶问题的是二分图的最小点权覆盖集,即用最小点权和的点集去覆盖所有的边,解法就是按照如下的方法建图跑最小割。

相邻的格子数不能同时取到,他们两个是互斥的,我们对格子进行黑白染色以后,形成了一张二分图,这个问题转化为求这张二分图的最大点权独立集

这种模型可以采用求最小割的方法来做

SSS点向白点连边,容量为白点的权值,从黑点向TTT点连边,容量为黑点的权值。
白点和黑点之间如果有互斥关系,那么从白点向黑点连接一条容量为infinfinf的边,形成一张网络图。

我们观察这张图的最小割,我们发现容量为infinfinf的边一定不能被割掉,那么这条边两端的点u,vu,vu,v就必然有(S,u)(S,u)(S,u)被割掉或者是(v,T)(v,T)(v,T)被割掉,被割掉的含义就是这个点的权值我不要了。由于我们得到的是最小割,也就是说我们剩下的点的权值之和一定是最大的,且不互斥的,因此用总的权值和减去最小个的值就是最大权独立集的权值和,也就是本题的答案。

例如下图的答案就是
这里写图片描述
ans=(a+b+c+d+e+f)−(a+b+d+e)=c+fans = (a+b+c+d+e+f) - (a+b+d+e) = c+fans=(a+b+c+d+e+f)(a+b+d+e)=c+f

##参考代码 见附录


P2805 植物大战僵尸

这个问题要引出的模型就更厉害啦!
那就是:
最大权闭合子图
最大权闭合子图
最大权闭合子图
重要的问题说三遍,这个模型很重要,能解决非常多有趣的问题,主要被用来解决在有依赖性条件下的规划问题。

什么是最大权闭合子图?

闭合子图的定义是:在子图中,所有点的出边所指向的节点仍在该子图内。

这里写图片描述

在这张图中,闭合子图有:
{E}、{D,E}、{F,E}、{A,D,E}、{B,D,E}、{F,E}、{C,F,E}\{E\}、\{D,E\}、\{F,E\}、\{A,D,E\}、\{B,D,E\}、\{F,E\}、\{C,F,E\}{E}{D,E}{F,E}{A,D,E}{B,D,E}{F,E}{C,F,E}

最大权闭合子图就是找一个最大的权值和的闭合子图。

如何找最大权闭合子图?

我们把这个图进行变形,变形成可以用最小割解决的问题,然后用最小割解决它。
变形方法:**如果一个点的权值为正,那么从SSS点向该点连接一条容量为权值的边,如果这个点的权值为负,那么从该点向TTT点连接一条容量为权值绝对值的边,原图中的所有边容量均设置为infinfinf。**然后跑一遍最小割,原图中正的点权和减去最小割得到的就是最大权闭合子图。

证明这里就不证明了,有兴趣的同学可以去网上搜搜看。

如何解决依赖关系下的选取问题?

如果要选取物品AAA必须要先选取物品BBB,则说物品AAA依赖于物品BBB,反映在图中就是AAABBB连有一条边。

选取某个物品可能获利也有可能要付出代价,如果获利则说该物品的权值符号为正,如果获取该物品要付出代价,则说该物品的权值符号为负。

而一种选取方案则必然属于原图中的一个闭合子图,如果不闭合这个选取方案必然非法。

因此,求一种获利最大的选取方案就相当于在求一个最大权闭合子图。

这道题怎么做?

这道题中,僵尸只能从每一行的最右端开始吃,想吃(x,y)(x,y)(x,y)位置的植物必须先吃掉(x,y+1)(x,y+1)(x,y+1)位置的植物,这样的话,就形成了一个依赖关系(x,y)(x,y)(x,y)依赖于(x,y+1)(x,y+1)(x,y+1),写作(x,y)−>(x,y+1)(x,y)->(x,y+1)(x,y)>(x,y+1)
本题中还有另外的一个依赖关系,那就是某植物AAA可以保护其他一些植物BBB,也就是存在依赖关系:(xB,yB)−>(xA,yA)(x_B,y_B)->(x_A,y_A)(xB,yB)>(xA,yA)
根据这些依赖关系,以及吃掉植物的获利,我们可以建立一张图。

然后在这张图求一个最大权闭合子图,就是我们的答案。

但是我们忽略了一点,就是说可能存在无敌植物,这些植物的依赖关系形成了一个环,这样就不能直接跑最大权闭合子图了,所以,我们第一步要先去掉这张依赖关系图中的。使用什么来去环呢?答案是拓扑排序。

先观察可能出现环的情形:
这里写图片描述

这种情形下,环应该被去掉,因为环代表无敌关系。而依赖于环的点JJJ也应该被去掉,因为环被去掉了以后这个依赖关系永远不能成立。

如何去掉环和依赖于环的点?

其实很简单,我们将图中所有的边反向,使用拓扑排序,将所有没有被访问的节点去掉。
这一步的核心操作就在反向

去掉点之后,直接跑最大权闭合子图就可以了。

参考代码 见附录


附录

Dinic网络流模板

以下代码均不含模板

const int inf = 1e9;
const int maxm = 800001;
const int maxn = 10001;
int node,src,dest,edge;
int ver[maxm],flow[maxm],nxt[maxm];
int head[maxn],work[maxn],dis[maxn],q[maxn];
void prepare(int _node,int _src,int _dest)
{node=_node,src=_src,dest=_dest;for(int i=0; i<node; ++i)head[i]=-1;edge=0;
}
void addedge(int u,int v,int c)
{ver[edge]=v,flow[edge]=c,nxt[edge]=head[u],head[u]=edge++;ver[edge]=u,flow[edge]=0,nxt[edge]=head[v],head[v]=edge++;
}
bool Dinic_bfs()
{int i,u,v,l,r=0;for(i=0; i<node; ++i)dis[i]=-1;dis[q[r++]=src]=0;for(l=0; l<r; ++l)for(i=head[u=q[l]]; i>=0; i=nxt[i])if(flow[i]&&dis[v=ver[i]]<0){dis[q[r++]=v]=dis[u]+1;if(v==dest)return 1;}return 0;
}
int Dinic_dfs(int u,int exp)
{if(u==dest)return exp;for(int &i=work[u],v,tmp; i>=0; i=nxt[i])if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0){flow[i]-=tmp;flow[i^1]+=tmp;return tmp;}return 0;
}
int Dinic_flow()
{int i,ret=0,delta;while(Dinic_bfs()){for(i=0; i<node; ++i)work[i]=head[i];while(delta=Dinic_dfs(src,inf))ret+=delta;}return ret;
}

P2765

// 网络流模板省去
int n,m = 2000;
int main(){scanf("%d",&n);prepare(2*m+3,0,2*m+2);addedge(2*m+1,2*m+2,n);for(int i = 1;;++i){addedge(0,2*i-1,1);addedge(2*i-1,2*m+1,1,1);addedge(2*i,2*m+2,1);for(int j = 1;j < i;++j){int rt = sqrt(i+j+0.5);if(rt*rt == i+j) addedge(2*i-1,2*j,1,2);}int ans = Dinic_flow();if(ans < i){printf("%d\n",i-1);int vc = 0;//生成方案vector<int> G[n];vector<int> bl(i,-1);for(int e = 0;e < edge;e += 2){if(flow[e] != 0) continue;if(tps[e] == 1){int u = (ver[e+1]+1)/2;G[vc].push_back(u);bl[u] = vc;vc++;}else if(tps[e] == 2){int u = (ver[e+1]+1)/2;int v = (ver[e]+1)/2;bl[u] = bl[v];G[bl[u]].push_back(u);}}for(int i = 0;i < n;++i){for(auto v : G[i]) printf("%d ",v);puts("");}break;}}return 0;
}

P2764

int pnxt[maxn];
int deg[maxn];
int n,m;
int main(){cin>>n>>m;prepare(2*n+2,0,2*n+1);for(int i = 0;i < m;++i){int u,v;scanf("%d%d",&u,&v);addedge(u,n+v,1);}for(int i = 1;i <= n;++i) addedge(0,i,1),addedge(i+n,2*n+1,1);int ans = Dinic_flow();for(int e = 0;e < 2*m;e += 2){if(flow[e] == 0){int u = ver[e+1];int v = ver[e] - n;pnxt[u] = v;deg[v]++;}}for(int i = 1;i <= n;++i){if(deg[i]) continue;int v = i;while(v){printf("%d ",v);v = pnxt[v];}puts("");}cout<<n-ans<<endl;return 0;
}

P2763

int n,k;
int kn[30];
int main(){cin>>k>>n;prepare(1+k+n+1,0,1+k+n);for(int i = 1;i <= k;++i) cin>>kn[i];for(int i = 1;i <= k;++i) addedge(0,i,kn[i]);for(int i = 1;i <= n;++i){int num;scanf("%d",&num);for(int j = 1;j <= num;++j){int tt;scanf("%d",&tt);addedge(tt,i+k,1,1);}}for(int i = 1;i <= n;++i) addedge(i+k,1+k+n,1);int ans = Dinic_flow();vector<int> G[30];for(int e = 0;e < edge;++e){if(flow[e] == 0 && tps[e]){int u = ver[e+1];int v = ver[e]-k;G[u].push_back(v);}}for(int i = 1;i <= k;++i){printf("%d: ",i);for(auto v : G[i]) printf("%d ",v);puts("");}return 0;
}

P2766

int n,dp[507],f[507],a[507];
int main(){memset(dp,0x3f,sizeof(dp));cin>>n;for(int i = 1;i <= n;++i){int tmp;cin>>tmp;a[i] = tmp;int loc = upper_bound(dp+1,dp+1+n,tmp) - dp;f[i] = loc;dp[loc] = tmp;}int s = lower_bound(dp+1,dp+1+n,0x3f3f3f3f)-dp-1;cout<<s<<endl;prepare(2*n+2,0,2*n+1);for(int i = n;i >= 1;--i){addedge(i,i+n,1);if(f[i] == s) addedge(0,i,505);if(f[i] == 1) addedge(i+n,2*n+1,505);for(int j = i-1;j >= 1;--j){if(f[j]+1 == f[i] && a[j] <= a[i]) addedge(i+n,j,505);}}cout<<Dinic_flow()<<endl;if(s == 1) {return 0*printf("%d\n",n);}prepare(2*n+2,0,2*n+1);for(int i = n;i >= 1;--i){addedge(i,i+n,1);if(f[i] == s){if(i == n) addedge(0,i+n,505);else addedge(0,i,505);}    if(f[i] == 1){if(i == 1) addedge(i,2*n+1,505);else addedge(i+n,2*n+1,505);}for(int j = i-1;j >= 1;--j){if(j == 1 && i == n) continue;if(f[j]+1 == f[i] && a[j] <= a[i]) addedge(i+n,j,505);}}int ans = Dinic_flow();if(f[1] + 1 == f[n]) ans ++;cout<<ans<<endl;
}

P2774

int n,m;
int a[101][101];
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
int main(){long long sum = 0;cin>>m>>n;for(int i = 1;i <= m;++i){for(int j = 1;j <= n;++j) {scanf("%d",&a[i][j]);sum += a[i][j];}}prepare(n*m+2,0,n*m+1);for(int i = 1;i <= m;++i){for(int j = 1;j <= n;++j){int u = (i-1)*n+j;if((i+j)%2 == 0) addedge(0,u,a[i][j]);else addedge(u,n*m+1,a[i][j]);if((i+j)%2 == 0)for(int t = 0;t < 4;++t){int nx = i + dx[t],ny = j + dy[t];if(nx < 1 || nx > m || ny < 1 || ny > n) continue;int v = (nx-1)*n+ny;addedge(u,v,inf);}}}cout<<sum - Dinic_flow()<<endl;return 0;
}

P2805

typedef pair<int,int> pii;
int a[100][100];
vector<pii> ps[100][100];
int n,m;
long long sum;
#define pr(x) cout<<#x<<":"<<x<<endl
int main(){//freopen("ts3.txt","r",stdin);cin>>n>>m;prepare(n*m+2,0,n*m+1);for(int i = 1;i <= n;++i){for(int j = 1;j <= m;++j){int num;scanf("%d%d",&a[i][j],&num);for(int t = 0;t < num;++t){int x,y;scanf("%d%d",&x,&y);x++,y++;ps[i][j].push_back(make_pair(x,y));}if(j != 1) ps[i][j].push_back(make_pair(i,j-1));}}void toposort();toposort();long long ans = (long long)Dinic_flow();cout<<sum-ans<<endl;
}
int deg[30][31],vis[31][31],f[31][31];
void toposort(){queue<pii> Q;for(int ux = 1;ux <= n;++ux) for(int uy = 1;uy <= m;++uy){for(auto p : ps[ux][uy]) { deg[p.first][p.second] ++;}}for(int ux = 1;ux <= n;++ux) for(int uy = 1;uy <= m;++uy){if(!deg[ux][uy]) Q.push(make_pair(ux,uy));}while(!Q.empty()){pii p = Q.front();Q.pop();sum += max(0,a[p.first][p.second]); vis[p.first][p.second] = 1;for(auto p2:ps[p.first][p.second]){deg[p2.first][p2.second]--;if(deg[p2.first][p2.second]==0) Q.push(p2);}}for(int ux = 1;ux <= n;++ux) for(int uy = 1;uy <= m;++uy){if(!vis[ux][uy]) continue;for(auto p : ps[ux][uy]) {if(vis[p.first][p.second]) addedge((p.first-1)*m+p.second,(ux-1)*m+uy,inf);}if(a[ux][uy] >= 0) addedge(0,(ux-1)*m+uy,a[ux][uy]);else addedge((ux-1)*m+uy,n*m+1,-a[ux][uy]);}}

原创:西安交大 蔡少斐

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

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

相关文章

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性&#xff0c;巧妙的现实高性能im系统。为表诚意&#xff0c;先贴源码地址&#xff1a;https://github.com/2881099/im下载源码后的运行方法&#xff1a;运行环境&#xff1a;.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…

【并查集】【图论】旅行(ssl 1312)

旅行 ssl 1312 题目大意&#xff1a; 有一个图&#xff0c;要从一个点到另一个点&#xff0c;问路上的最大值和最小值的比最小是多少 原题&#xff1a; 题目描述 Z小镇是一个景色宜人的地方&#xff0c;吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点&#xff…

P4302-[SCOI2003]字符串折叠【区间dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4302 题目大意 一个字符串&#xff0c;对于一个字符串AAA。可以将连续的nnn个AAA缩成n(A)n(A)n(A)。求最短的长度能够表述出给定字符串 解题思路 定义fi,jf_{i,j}fi,j​表示表示出i∼ji\sim ji∼j的字符串的最短方法。那么…

ACM/ICPC 比赛生涯总结+经验分享

ACM/ICPC 比赛生涯总结经验分享 1.获奖经历 时间比赛奖励大一下ACM陕西省赛打铁大一下CCCC团队二等奖大二下ACM/ICPC全国邀请赛银奖大二下CCCC团队特等奖大三上ACM/ICPC区域赛沈阳站铜奖大三上ACM/ICPC区域赛南宁站银奖大三上ACM/ICPC EC-Final上海铜奖大三下CCCC团队特等奖大…

YbtOJ#20064-[NOIP2020模拟赛B组Day4]预算缩减【树形dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/2 题目大意 nnn个点的一棵树&#xff0c;求删掉一些边让剩下的连通块大小不小于kkk&#xff0c;求方案数。 解题思路 定义fi,jf_{i,j}fi,j​表示iii的子树现在联通块大小为jjj时的方案数&#xff0c;我们不难发现…

【并查集】团伙(luogu 1892)

团伙 luogu 1892 代码&#xff1a; 定义对手的对手是朋友&#xff0c;朋友的朋友是朋友&#xff0c;现在有n个人和m组关系&#xff0c;如果两个人是朋友那么他们属于同一个团伙&#xff0c;问有多少个团伙 原题&#xff1a; 题目描述 1920年的芝加哥&#xff0c;出现了一…

NCC Meetup 2018 Shanghai 活动小结

NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行。原本计划30人规模的小型活动&#xff0c;结果收到了逾60人的报名&#xff0c;其中大部均来到现场参加了活动。本次活动得到了微软公司的场地支持&#xff0c;同时非常感谢 范亮先生、 刘浩杨先生和 邹嵩…

【结论】Array

Array 题目大意&#xff1a; 有一个数列&#xff0c;随机交换两个数&#xff0c;原数列和当前数列相同部分有可能有多少个 原题&#xff1a; 题目描述 Alice 有一个数列 ai。 但是她不喜欢这个数列&#xff0c;于是她决定随机交换其中两个数。 Alice 想知道&#xff0c;交…

YbtOJ#20065-[NOIP2020模拟赛B组Day4]模拟比赛【dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/3 解题思路 有nnn道题&#xff0c;mmm个人。一些题目是让某些人一定得分&#xff0c;一些题目是让某些人可以能得分。 求排名前sss的人选出ttt个人&#xff0c;可能的集合个数。 解题思路 显然我们如果要判断一…

Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

今天抽出一点点时间来造一个小轮子&#xff0c;是关于定时任务这块的。这篇文章主要从一下几点介绍&#xff1a;创建数据库管理表创建web项目引入quarzt nuget 包写具体配置操作&#xff0c;实现定时任务处理第一步&#xff1a;创建一个空web项目&#xff0c;引入quarzt nuget …

YbtOJ#20066-[NOIP2020模拟赛B组Day4]筹备计划【线段树,树状数组】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/4 题目大意 一个集合[1,n]∈S[1,n]\in S[1,n]∈S&#xff0c;和一个序列aaa。有操作 序列aaa的一个数加上xxx序列aaa的一个数减去xxx将[l,r][l,r][l,r]加入集合SSS将[l,r][l,r][l,r]删除出集合SSS 每次修改后求…

【模拟】Biotech

Biotech 题目大意&#xff1a; 有一堆细胞&#xff08;放电或不放电&#xff09;&#xff0c;当周围细胞放电个数小于2或大于3时&#xff08;八个方向&#xff09;&#xff0c;此细胞变为不放电&#xff0c;当周围细胞放电个数为2时&#xff0c;此细胞不变&#xff0c;当周围…

.NET Core微服务之服务间的调用方式(REST and RPC)

一、REST or RPC ?1.1 REST & RPC微服务之间的接口调用通常包含两个部分&#xff0c;序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等&#xff1b;通信比较流行的是http、soap、websockect&#xff0c;RPC通常基于TCP实现&am…

【记忆化搜索】【dfs】【递归】Chocolate

Chocolate 题目大意&#xff1a; 有一块巧克力&#xff08;每一个单位有一定的美味值&#xff09;&#xff0c;判断是否可以把他分为k块美味值相等的小巧克力 原题&#xff1a; 题目描述 Charlie 有一块巧克力。 这块巧克力是矩形的&#xff0c;有 n 行 m 列一共 n m 个大…

YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/1 题目大意 给出一个010101序列&#xff0c;求有多少对(l,p,r)(l,p,r)(l,p,r)使得l<p<rl<p<rl<p<r且sp1s_p1sp​1且s(l,p)s(p,r)s(l,p)s(p,r)s(l,p)s(p,r)&#xff08;s(l,r)s(l,r)s(l,r)表示l…

Nuget 多平台多目标快速自动打包

构建现代的 .Net 应用离不开 Nuget 的支持&#xff0c;而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包&#xff0c;我们需要先解决一些前置依赖&#xff0c;无论是 .Net Framework、Mono 或者 .Net Standard&#xff08;.Net Core&#xff…

P4495-[HAOI2018]奇怪的背包【数论,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4495 题目大意 nnn个物品大小为viv_ivi​&#xff0c;每个物品有无数个&#xff0c;背包的重量定义为大小和%P\%P%P。 qqq次询问&#xff0c;问一个www表示有多少种取法使得背包重量为www&#xff08;两种方案不同仅当有一种…

初一模拟赛(5.4)

成绩&#xff1a; 注&#xff1a;rank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4222lyflyflyf250250250100100100100100100303030202020333fyfyfy240240240100100100100100100404040000444tjhtjhtjh230230230100100100100…

Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: Identity Server 4 - Hybrid Flow - MVC客户端身份验证, Identity Server 4 - Hybrid Flow - Claims保护API资源(这里用到了RBAC: Role-based Access Control 基于角色的访问权限控…

P3599-Koishi Loves Construction【构造,数论】

正题 题目链接:https://www.luogu.com.cn/problem/P3599 题目大意 构造一个nnn的排列&#xff0c;要求满足其中一个给定的要求 对于每个前缀和在模nnn意义下不同对于每个前缀积在模nnn意义下不同 解题思路 对于加法&#xff0c;显然nnn要填在第一位&#xff0c;那么这一位的…