题目大意:

相邻的朋友可以给出自己手上最多一颗糖,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的更多相关文章

  1. 2015多校第6场 HDU 5353 Average 贪心,细节处理

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5353 题意:有n个人围城一个环,每一个人手里都有一些糖果,第i个人有ai块.现在有三种操作:第i个人给 ...

  2. HDU 5353 Average 糖果分配(模拟,图)

    题意:有n个人坐在圆桌上,每个人带着糖果若干,每次只能给旁边的人1科糖果,而且坐相邻的两个人最多只能给一次(要么你给我,要么我给你),问是否能将糖果平均分了. 思路: 明显每个人最多只能多于平均值2个 ...

  3. HDU 5353—— Average——————【贪心+枚举】

    Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  4. HDU 5353 Average

    Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and ...

  5. HDU 5353 Average 贪心

    就是贪心啊,不知道为啥总是不过,总是WA 方法不对吗? 将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型. 大于2直接NO,不知道哪错了,自己出了一些数据 ...

  6. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  8. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记

    原文:http://blog.csdn.net/lifuxiangcaohui/article/details/37659905 一直用tomcat一段时间都正常无事,最近一次启动tomcat就发生以 ...

  2. 转:Google全程面试题目(未完成)

    转自:http://kb.cnblogs.com/page/95951/ 经过了三个月的断断续续的面试和准备,最近一阵抓了很多时间努力准备, 本以为最后的一次面试能弥补前面的不足,可惜还是功亏一篑.. ...

  3. linux套件安装过程中configure,make,make install的作用

    ./configure,make,make install都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤.其中: ./configure是检测程序文件,用来检测你的安装平 ...

  4. python操作mongodb之六自定义类型存储

    from pymongo.mongo_client import MongoClient client=MongoClient('192.168.30.252',27017) client=drop_ ...

  5. 大S《美容大王》内容80%都是没用的东西

    揭20位明星真实人品 我在她大陆的企划公司工作过,见过她N次了,对人态度蛮不错的,而且很爱开玩笑,但感觉很假很抠门.只要一回公司她就黏着请她吃饭.她很主动很霸道,她和周渝民交往,原因之一就是周什么都听 ...

  6. 图 - 从零开始实现by C++

    参考链接:数据结构探险之图篇

  7. HTTP Content-Type的作用

    在用java的 AsyncHttpClient与服务器通信时,忘记设置了 Content-Type的值,开始以为没有问题,使用默认的值就行 后面出现了问题.查资料发现,Content-Type是用在M ...

  8. 【CITE】C#默认以管理员身份运行程序实现代码

    //用于一种情况:C#软件打包后,在读写C盘文件时,会出现权限问题.使用管理员身份才可以运行 using System; using System.Collections.Generic; using ...

  9. 5.7 WebDriver API实例讲解

    本节主要详细描述WebDriver的常用API使用方法. 1.访问某网页地址 被测试网页的网址:http://www.sogou.com. Java语言版本的API实例代码: 方法1: public ...

  10. 30 个有用的 HTML5 和 CSS3 表单设计

    基本上表单是任何一个网站都必须要用到的元素,本文介绍的这 30 个设计方案供你参考,这些方案如果要单独下载完整可运行的文件则需要支付2-5美元的费用. 1. Fresh Forms 2. Pretty ...