codeforces_863_F

题目大意:给出一个数组的大小(n<=50),以及每个位置填数的范围限制(若无限制,即为1-n),最后求填出数组的最小花费,定义总花费为数组中每个数出现次数的平方和。(sum_cnt[i]^2 (1<=i<=n))。

题解:费用流,要不是最近在学,我都不敢信网络流这么强大,想清楚怎么转化和建边之后,实现没有什么细节,关键是转化,如果第一次遇见是挺吃脑子的。下面来给出建边:将每个数和Sn条边(容量1,花费为2*j-1j为这是这个数的第几条边),然后每个数和可以放这个数的位置连边(容量1, 费用0),最后每个位置和T连边(容量费用同上)。下面来解释一下建边的原因,因为题目要求的花费是出现次数的平方,那我们考虑其中一个数,怎么让花费是次数平方呢?最直接的想法就是连n条边(容量i,费用i, 1<=i<=n), 这样i*i(费用流的所谓的费用是单位费用,即单位流量的费用),表示i这个数用i次的费用,是不是很完美?可是,我们想想费用流是怎么跑的,它有个最短路,跑的是花费,那么问题来了,假设我们要当前这个数使用两次,那么讲道理应该跑e(2,2),这条边,可是其实两次是怎么跑的?是先跑了e(1,1),走一个流量,再从e(2,2)走一个流量,这样一来,花费是1+2=3 != 4,显然就错误了,那么问题来了,发现走几次其实就是用了几条这个数的边,那么有没有一个前缀和能让前i条边的边权和为i^2?答案就是1,3,5,7......这个等差数列的第i次前缀和就是i^2。那么最关键的建边解释完了,剩下的建边没什么好说的,容量1是因为每个位置最后只有一个数,而每个位置对于整个数列只贡献一个位置,花费0是因为,从S到所有数的连边泡完就算完了花费,后面自然为0

PS:不要说什么LLF,SLFSPFA,就是势叠加的Dij直接莽(Dij记得加vis,奇快无比,因为T过,所以懂得,那次T得太惨了)。是真的难受,没看题解不知道怎么建边,大概猜到了会是网络流,因为画了画感觉可以用图做(都是美食节那题迫害的,至今未动)。

时限:46ms / 3S

#pragma comment(linkerr, "/STACK: 1024000000,1024000000")
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define eb emplace_back
#define em emplace
#define pii pair<int,int>
#define de(x) cout << #x << " = " << x << endl
#define clr(a,b) memset(a,b,sizeof(a))
#define INF (0x3f3f3f3f)
#define LINF ((long long)(0x3f3f3f3f3f3f3f3f))
#define F first
#define S second
using namespace std; const int M = 2e5 + 15;
const int N = 55;
int mxflw = 0, mncst = 0;
pii ans;
int S, T;
int n, q;
pii a[N];
struct Edge
{
int v, f, w, nxt;
};
Edge e[M<<1];
int h[N*4], ect;
int g[N*4], dis[N*4];
int pv[N*4], pe[M<<1];
bool vis[N*4];
void init()
{
clr(h,-1);
ect = 0;
}
void _add( int u, int v, int f, int w )
{
e[ect].v = v, e[ect].f = f, e[ect].w = w, e[ect].nxt = h[u], h[u] = ect++;
e[ect].v = u, e[ect].f = 0, e[ect].w =-w, e[ect].nxt = h[v], h[v] = ect++;
} pii mfmc( int s, int t )
{
while ( 1 )
{
priority_queue<pii> q;
clr(vis,false);
for ( int i = s; i <= t; i ++ )
dis[i] = INF; dis[s] = 0;
q.push( {0,s} );
while ( !q.empty() )
{
pii nw = q.top(); q.pop();
int u = nw.S;
if ( vis[u] ) continue;
vis[u] = true;
for ( int i = h[u]; i+1; i = e[i].nxt )
{
int v = e[i].v;
int cst = e[i].w + g[u] - g[v];
if ( e[i].f > 0 && dis[v] > dis[u] + cst )
{
dis[v] = dis[u] + cst;
pe[v] = i, pv[v] = u;
q.push( { -dis[v], v } );
}
}
}
if ( dis[t] == INF ) break;
for ( int i = s; i <= t; i ++ )
g[i] += dis[i];
int d = INF;
for ( int i = t; i != s; i = pv[i] )
d = min( d, e[ pe[i] ].f );
for ( int i = t; i != s; i = pv[i] )
{
int id = pe[i];
e[id].f -= d, e[id^1].f += d;
}
mxflw += d, mncst += d*g[t];
}
return { mxflw, mncst };
} int main()
{
init();
scanf("%d%d", &n, &q);
for ( int i = 1; i <= n; i ++ )
a[i].F = 1, a[i].S = n;
while ( q -- )
{
int p, l, r, v;
scanf("%d%d%d%d", &p, &l, &r, &v);
for ( int i = l; i <= r; i ++ )
if ( p == 1 ) a[i].F = max( a[i].F, v );
else a[i].S = min( a[i].S, v );
} S = 0, T = 2*n + 1;
for ( int i = 1; i <= n; i ++ )
{
for ( int j = 1; j <= n; j ++ )
_add( S, i, 1, 2*j-1 ); //S -> num
_add( i+n, T, 1, 0 ); //pos -> T
}
for ( int i = 1; i <= n; i ++ )
{
for ( int j = a[i].F; j <= a[i].S; j ++ )
_add( j, i+n, 1, 0 ); //num -> pos
}
ans = mfmc( S, T );
printf("%d\n", ans.F == n ? ans.S : -1);
return 0;
}

CF_863_F(Netflow)的更多相关文章

  1. GitHub NetFlow

    https://github.com/search?l=Java&p=1&q=netflow&ref=searchresults&type=Repositories&a ...

  2. NetFlow

    供应商 支持的流 设备列表 Cisco NetFlow Cisco - 800.1700.2600.1800.2800.3800.4500.6500.7200.7300.7500.7600.10000 ...

  3. 【流量】netflow 基础知识

    摘要 记录下关于netflow的基础知识以及应用,现状 是什么 一种数据交换方式,NetFlow流量统计数据包括数据流时戳 源IP地址和目的IP地址 源端口号和目的端口号 输入接口号和输出接口号 下一 ...

  4. NetFlow学习笔记

    NetFlow学习笔记 标签: netflow 由于工作需要,对NetFlow做了一些学习和调研,并总结成文档以供学习分享. 背景:随着系统的升级与漏洞的修补,入侵主机进而进行破坏的病毒攻击方式在攻击 ...

  5. 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言

    基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...

  6. Openvswitch手册(3): sFlow, netFlow

    这一节,我们重点看sFlow 采样流sFlow(Sampled Flow)是一种基于报文采样的网络流量监控技术,主要用于对网络流量进行统计分析. sFlow系统包含一个嵌入在设备中的sFlow Age ...

  7. [转]Comparing sFlow and NetFlow in a vSwitch

    As virtualization shifts the network edge from top of rack switches to software virtual switches run ...

  8. [转]Rapidly detecting large flows, sFlow vs. NetFlow/IPFIX

    Figure 1: Low latency software defined networking control loop The articles SDN and delay and Delay ...

  9. Cisco ISR4400 Netflow 配置模板

    flow exporter NAME destination 145.0.1.200 transport udp 9991 export-protocol netflow-v5 flow monito ...

随机推荐

  1. sping整合quartz

    很简单,一共需要定义三个bean 需要注意的是每个bean的类型 业务bean(就是我们每次调度需要做的工作) <bean id="quantzjobBean" class= ...

  2. URL上的中文编码

    参考:http://www.chinaz.com/web/2013/0226/293639.shtml 一 URL上拼接中文会进行编码 在URL上拼接中文时,比如www.abc.com?season= ...

  3. 【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组

    [BZOJ1717][Usaco2006 Dec]Milk Patterns Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量 ...

  4. 【office2010】office2010安装问题的解决方案。

    今天想在公司电脑上按上一个office2010,结果出现一个问题,导致研究了一下午才解决:现总结解决方案: 安装office 2010,提示需要安装MSXML版本6.10.1129.0组件.但是在网上 ...

  5. rman备份的其它特性

    1.7.3.1并发: 主要用于提高备份的速度,可以分为手动并发或自动并发 手动并发:通过分配多个通道并将文件指定到特定的通道 RMAN> run { 2>  allocate channe ...

  6. 循环赛日常表算法(N可为奇数和偶数)

    一. 实验题目 设有n位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天必须比赛一场,不能轮空.试按此要求为比赛安排日程. 二.实验目的 1.深刻理解并掌 ...

  7. Spring MVC 框架学习

    一.spirng的简介 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情. ...

  8. sql 将一张表中的数据插入到另一张表

    将表T_wz_wz中的部分数据插入到表t_wz_kc: insert into t_wz_kc(wzid,jldwid,kcsl,yfpkcsl,cshwcbz) select wzid,jldwid ...

  9. C#桌面程序设计复习

    GGG //屏幕高度 int ScreenH = 1080; this.Location = new Point(this.Location.X, ScreenH - this.Height - 20 ...

  10. 完全用nosql轻松打造千万级数据量的微博系统(转)

    原文:http://www.cnblogs.com/imxiu/p/3505213.html 其实微博是一个结构相对简单,但数据量却是很庞大的一种产品.标题所说的是千万级数据量 也并不是一千万条微博信 ...