题目传送门

题意:

  构造出一个数列,数字在$1~n$的范围内,要求$\sum_{i=1}^n  count(i)^{2}$最小,$count(i)$的意思是数列中i出现的次数。并且数列要满足两种类型的条件,一个是$a_i->a_j$全部大于v,还有$a_i->a_j$全部小于v。

思路:

  首先,我们可以把限制条件转化为某个位置上数值的上限和下限,然后位置和对应能填的所有数字都建容量为1的边,然后每一个数字向汇点建n条容量为1的边,费用分别是$1,3,5,……,2*j-1$,这样建边后,如果一个数字被选取了两次,得到的前缀和刚好就是出现次数的平方。

#pragma GCC optimize (2)
#pragma G++ optimize (2)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#include<cstdio>
#include<vector>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,b,a) for(int i=b;i>=a;i--)
#define clr(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pii pair<int,int >
using namespace std;
typedef long long ll;
const int maxn=;
const int inf=0x3f3f3f3f;
ll rd()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
#include<bits/stdc++.h>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct Edge {
int to, next, cap, flow, cost; } edge[MAXM];
struct pp{
int u,v,c,w;
}in[MAXN];
int head[MAXN], tol;
int pre[MAXN], dis[MAXN];
bool vis[MAXN];
int N=MAXN-;
int n,q,l[MAXN],r[MAXN];
void init() { tol = ;
memset(head, -, sizeof(head)); }
void addv(int u, int v, int cap, int cost) {
edge[tol].to = v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].to = u;
edge[tol].cap = ;
edge[tol].cost = -cost;
edge[tol].flow = ;
edge[tol].next = head[v];
head[v] = tol++; }
bool spfa(int s, int t) {
queue<int>q;
clr(dis,INF);
clr(vis,),clr(pre,-); dis[s] = ;
vis[s] = true;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;
for (int i = head[u]; i != -; i = edge[i].next) {
int v = edge[i].to; if (edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost) {
dis[v] = dis[u] + edge[i].cost;
pre[v] = i;
if (!vis[v]) {
vis[v] = true;
q.push(v); } } } }
if (pre[t] == -)return false;
else return true; }
//返回的是最大流,cost 存的是最小费用
int minCostMaxflow(int s, int t, int &cost) {
int flow = ;
cost = ;
while (spfa(s, t)) {
int Min = INF;
for (int i = pre[t]; i != -; i = pre[edge[i ^ ].to]) {
if (Min > edge[i].cap - edge[i].flow)
Min = edge[i].cap - edge[i].flow; }
for (int i = pre[t]; i != -; i = pre[edge[i ^ ].to]) {
edge[i].flow += Min;
edge[i ^ ].flow -= Min;
cost += edge[i].cost * Min; }
flow += Min; }
return flow; }
int main(){
cin>>n>>q;
init();
int S=,T=*n+;
rep(i,,n){
addv(S,i,,);
r[i]=n;
l[i]=;
rep(j,,n){
addv(i+n,T,,*j-);
}
}
int flag=;
while(q--){
int op,x,y,v;
scanf("%d%d%d%d",&op,&x,&y,&v);
if(op==){
rep(i,x,y){
l[i]=max(l[i],v);
}
}else{
rep(i,x,y){
r[i]=min(r[i],v);
}
}
}
rep(i,,n){
if(l[i]>r[i]){
flag=;
break;
}
rep(j,l[i],r[i]){
addv(i,j+n,,);
}
}
if(flag==){
puts("-1");
return ;
}
int c;
minCostMaxflow(S,T,c);
cout<<c<<endl; }

codeforces863F Almost Permutation 费用流的更多相关文章

  1. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  2. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  3. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  4. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

  5. Codeforces 730I [费用流]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...

  6. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  7. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  8. 【BZOJ-3638&3272&3267&3502】k-Maximum Subsequence Sum 费用流构图 + 线段树手动增广

    3638: Cf172 k-Maximum Subsequence Sum Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 174  Solved: 9 ...

  9. [bzoj4514]数字配对[费用流]

    今年SDOI的题,看到他们在做,看到过了一百多个人,然后就被虐惨啦... 果然考试的时候还是打不了高端算法,调了...几天 默默地yy了一个费用流构图: 源连所有点,配对的点连啊,所有点连汇... 后 ...

随机推荐

  1. HTML中的img标签属性

    <img>标签 标签用于插入图片.它是单独使用的,没有闭合标签. <img src="https://fakeimg.pl/350x200/ff0000,128/000,2 ...

  2. 【知识强化】第四章 网络层 4.8 移动IP

    这节课我们来学习一下移动IP. 那移动IP呢要跟动态IP区分开.动态IP是指,通过使用DHCP协议,在一个局域网内部的一台主机,就可以动态地获得一个IP地址.那这里面的移动IP是什么意思呢? 我们来举 ...

  3. 【教程】linux安装nginx(详细)

    博主最近在安装Nginx,虽然之前安装过,但是没有记录安装过程,导致现在安装过程中遇到坑,现记录一下,希望能帮助到你. 1:安装编译工具及库文件 yum -y install make zlib zl ...

  4. linux---postgresql的用户角色权限

    PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户.角色可以拥有数据库对象,如表.索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用 ...

  5. centos 6.5 安装 zookeeper

    从zookeeper官方网站下载安装包:zookeeper-3.4.9.tar.gz,解压安装 tar xvf zookeeper-3.4.9.tar.gz -C /usr/java cd /usr/ ...

  6. springboot不能用 @SpringApplicationConfiguraction 解决方案

    @SpringApplicationConfiguraction  是在springboot 1.4之前,之后改用 @RunWith(SpringJUnit4ClassRunner.class) @S ...

  7. 【leetcode】995. Minimum Number of K Consecutive Bit Flips

    题目如下: In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) suba ...

  8. Halo(一)

    @EnableJpaAuditing 审计功能(启动类配置) 在实际的业务系统中,往往需要记录表数据的创建时间.创建人.修改时间.修改人. 每次手动记录这些信息比较繁琐,SpringDataJpa 的 ...

  9. openwrt增加密码及ssh的方法

    openwrt增加密码及ssh的方法 1.进入openwrt系统源码的顶层目录,然后执行 make menuconfig命令进入 Network--> SSH-->  <*>o ...

  10. html生成pdf

    /** * 生成pdf * @param string $html 需要生成的内容 */ function pdf($html='<h1 style="color:red"& ...