ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

permutation

2021-06-30 20:31:44  阅读:177  来源: 互联网

标签:赋权 int permutation ec add ans adj


套路题
把最大子段和\([l,r]\)变成去掉最小的前/后缀。
把前缀\([1,l-1]\)内的数赋权\(1\),\([l,r]\)的赋权\(2\),\([r+1,n]\)赋权\(3\)、
如果一个数\(x\)是正数,则先把\(ans+=x\),如果\(x\)赋权\(1,3\),\(ans-=x\)
否则如果\(x\)赋权\(2\),\(ans-=x\)。
考虑HNOI2013切糕那样子的建图,把每个点拆成\(i,i'\)两个,建立\(n\)条\(3\)个点的链。
如果\(x\)是正数,则\(s->i,i'->t\)连接\(x\)
否则\(i->i'\)连接\(-x\)。
对于题目的每个限制\((x,y)\),如果\(x\)赋权大于\(y\)赋权则不合法。
用HNOI2013切糕的方法连边限制即可。
\(ans-\)最小割就是答案。

#include<bits/stdc++.h>
using namespace std;
#define M 100010
int h[M],nxt[M],v[M],w[M],s,t,dep[M],ec,m,n,ans;
void add(int a,int b,int c){v[++ec]=b;w[ec]=c;nxt[ec]=h[a];h[a]=ec;}
void adj(int a,int b,int c){
	add(a,b,c);
	add(b,a,0);
}
bool bfs(){
    queue<int>q;
	q.push(s);
    for(int i=1;i<=t;i++)
    	dep[i]=0;
	dep[s]=1;
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=h[x];i;i=nxt[i])
            if(w[i]&&!dep[v[i]]){
            	dep[v[i]]=dep[x]+1;
				q.push(v[i]);
            	if(v[i]==t)
					return 1;
			}
    }
	return 0;
}
int dfs(int x,int dis){
    if(x==t)
		return dis;
	int tp=dis;
    for(int i=h[x];i;i=nxt[i])
        if(dep[v[i]]==dep[x]+1&&w[i]){
            int f=dfs(v[i],min(tp,w[i]));
            if(!f)
				dep[v[i]]=0;
            tp-=f;
            w[i]-=f;
			w[i^1]+=f;
            if(!tp)break;
        }
    return dis-tp;
}
int din(){
    int aans=0;
    while(bfs()){
    	int v;
    	while(v=dfs(s,1e9))
			aans+=v;
	}
    return aans;
}
int main(){
	freopen("permutation.in","r",stdin);
	freopen("permutation.out","w",stdout);
	ec=1;
	scanf("%d%d",&n,&m);
	t=4*n+1;
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		if(x>0){
			ans+=x;
			adj(s,2*i+1,x);
			adj(2*i+2,t,x);
		}
		else
			adj(2*i+1,2*i+2,-x);
	}
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		adj(2*x+1,2*y+1,1e9);
		adj(2*x+2,2*y+2,1e9);
	}
	printf("%d",ans-din());
}

标签:赋权,int,permutation,ec,add,ans,adj
来源: https://www.cnblogs.com/ctmlpfs/p/14956287.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有