HDU 5353
题目大意:
相邻的朋友可以给出自己手上最多一颗糖,n个朋友形成一个环,问给的方式能否最后使所有朋友都糖的数量相同
这里我用的是网络流来做的,这里n=100000,用sap的模板可以跑过
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
const int MAXN = ;
const int MAXM = ;
const int INF = 0x3f3f3f3f;
struct Edge{
int st , to , next, cap , flow;
}edge[MAXM]; int tol , head[MAXN] , gap[MAXN] , dep[MAXN] , cur[MAXN]; void init(){
tol = ;
memset(head , - , sizeof(head));
} void add_edge(int u , int v , int w , int rw=)
{
edge[tol].st = u , edge[tol].to=v , edge[tol].cap = w , edge[tol].flow=;
edge[tol].next = head[u] , head[u] = tol++; edge[tol].st = v , edge[tol].to = u , edge[tol].cap = rw , edge[tol].flow=;
edge[tol].next = head[v] , head[v] = tol++;
} int Q[MAXN]; void BFS(int start , int end)
{
memset(dep , - , sizeof(dep));
memset(gap , , sizeof(gap));
gap[] = ;
int front = , rear = ;
dep[end] = ;
Q[rear++] = end;
while(front != rear){
int u = Q[front++];
for(int i=head[u] ; i!=- ; i=edge[i].next){
int v = edge[i].to ;
if(dep[v]!=-) continue;
Q[rear++] = v;
dep[v] = dep[u] + ;
gap[dep[v]]++;
}
}
} int S[MAXN];
int sap(int start , int end , int N)
{
BFS(start , end);
memcpy(cur , head , sizeof(head));
int top=;
int u=start;
int ans = ;
while(dep[start]<N)
{
if(u == end){
int Min = INF;
int inser;
for(int i= ; i<top ; i++)
if(Min>edge[S[i]].cap-edge[S[i]].flow){
Min = edge[S[i]].cap-edge[S[i]].flow;
inser = i;
}
for(int i= ; i<top ; i++){
edge[S[i]].flow+=Min;
edge[S[i]^].flow-=Min;
}
ans+=Min;
top = inser;
u = edge[S[top]^].to;
continue;
}
bool flag = false;
int v ;
for(int i=cur[u] ; i!=- ; i=edge[i].next){
v = edge[i].to;
if(edge[i].cap-edge[i].flow && dep[v]+==dep[u]){
flag = true;
cur[u] = i;
break;
}
}
if(flag){
S[top++] = cur[u];
u = v;
continue;
}
int Min = N;
for(int i=head[u] ; i!=- ; i=edge[i].next){
if(edge[i].cap-edge[i].flow && dep[edge[i].to]<Min){
Min = dep[edge[i].to];
cur[u] = i;
}
}
gap[dep[u]]--;
if(!gap[dep[u]]) return ans;
dep[u] = Min+;
gap[dep[u]]++;
if(u != start) u = edge[S[--top]^].to;
}
return ans;
}
int n , m , val[MAXN] , id[MAXN] , in[MAXN] , out[MAXN] , x, y , fl;
ll sum , ave;
int main()
{
// freopen("in.txt" , "r" , stdin);
int cas;
scanf("%d",&cas);
while(cas--){
init();
scanf("%d" , &n);
sum = ;
for(int i= ; i<=n ; i++){
scanf("%d" , val+i);
sum+=val[i];
}
bool ok = true;
if(sum%n != ){
ok = false;
}
if(!ok){
puts("NO");
continue;
}
ave = sum/n;
for(int i= ; i<=n ; i++){
if(abs(val[i]-ave)>) ok = false;
}
if(!ok){
puts("NO");
continue;
}
add_edge(n , , , );
for(int i= ; i<=n ; i++){
add_edge(i , i- , , );
}
int min_flow = ;
for(int i= ; i<=n ; i++){
if(val[i]>ave){
add_edge( , i , val[i]-ave);
}
else if(val[i]<ave){
add_edge(i , n+ , ave-val[i]);
min_flow+=ave-val[i];
}
}
int flow = sap( ,n+ , n+);
// cout<<flow<<" "<<min_flow<<endl;
if(flow!=min_flow) ok = false;
if(!ok){
puts("NO");
continue;
}
int rec[MAXN][] , tot=;
for(int i= ; i<tol ; i+=){
if(edge[i].st>= && edge[i].to<=n){
/*if(edge[i].flow + edge[i^1].flow == 0){
cout<<edge[i].st<<" "<<edge[i].to<<endl;
cout<<edge[i^1].st<<" "<<edge[i^1].to<<endl;
continue;
}*/
if(edge[i].flow>) rec[tot][] = edge[i].st , rec[tot++][] = edge[i].to;
else if(edge[i^].flow>) rec[tot][] = edge[i^].st , rec[tot++][] = edge[i^].to;
}
}
printf("YES\n%d\n" , tot);
for(int i= ; i<tot ; i++) printf("%d %d\n" , rec[i][] , rec[i][]);
}
return ;
}
HDU 5353的更多相关文章
- 2015多校第6场 HDU 5353 Average 贪心,细节处理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5353 题意:有n个人围城一个环,每一个人手里都有一些糖果,第i个人有ai块.现在有三种操作:第i个人给 ...
- HDU 5353 Average 糖果分配(模拟,图)
题意:有n个人坐在圆桌上,每个人带着糖果若干,每次只能给旁边的人1科糖果,而且坐相邻的两个人最多只能给一次(要么你给我,要么我给你),问是否能将糖果平均分了. 思路: 明显每个人最多只能多于平均值2个 ...
- HDU 5353—— Average——————【贪心+枚举】
Average Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- HDU 5353 Average
Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and ...
- HDU 5353 Average 贪心
就是贪心啊,不知道为啥总是不过,总是WA 方法不对吗? 将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型. 大于2直接NO,不知道哪错了,自己出了一些数据 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- 转!!java中关键字volatile的作用
用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...
- python 图实现
#coding:utf-8 __author__ = 'similarface' class Graph: def __init__(self,label,extra=None): #节点是类实例 s ...
- [转]Android_气泡效果
最近在看以前在eoe上收藏的一些源代码,准备将这些代码加上一些自己的注释,然后贴出来,方便自己日后查阅,和刚入门的人来学习. 今天先看一个气泡窗口,先看一下效果图和目录结构,然后再上代码 通过第一幅图 ...
- VB6 GDI+ 入门教程[1] GDI+介绍
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[1] GDI+介绍 2009 年 6 月 18 日 17 ...
- b.BIO连接器整体框图
上一讲讲解过NIO的框图,可以看来,NIO通道是目前Tomcat7以后的默认的通道的推荐配置,在Tomcat6和以前的配置中,BIO是主流的配置: 只需要修改protocol协议部分即可,而后续还有A ...
- windows7系统配置maven环境
简介 maven的作用 1.通过在pom.xml配置的方式下载项目所需要的jar包 2.打jar包和打war包 1.环境配置 1.1 http://maven.apache.org/download ...
- JavaScript window
window -- window对象是BOM中所有对象的核心 window,中文"窗口" window对象除了是BOM中所有对象的父对象外,还包含一些窗口控制函数 全局的windo ...
- font-face字体文件引入方式
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- jmeter笔记6
一.图形报表 图表底部参数的含义如下: 样本数目是总共发送到服务器的请求数. 最新样本是代表时间的数字,是服务器响应最后一个请求的时间. 吞吐量是服务器每分钟处理的请求数. 平均值是总运行时间 ...
- 找不到 -lz解决方法
sudo apt-get install libghc-zlib-dev