2020hdu多校round2第五题New Equipments

2023-12-14 17:59

本文主要是介绍2020hdu多校round2第五题New Equipments,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=6767

题解

一个工人对应一个二次函数,尽量往函数对称轴配对。而又n个工人,所以每个工人一定能连到对称轴周围n个最近的点之一。所以从n个工人节点向他的对称轴周围n个点连边,边流量1,费用 a i j 2 + b i j + c i a_ij^2+b_ij+c_i aij2+bij+ci,完了超级源流量限制为k,枚举k建立n次图,跑n次费用流。

AC代码

尽量不用宏定义字符串替换,括号老是丢。找错找一天。。哭了。

#include<bits/stdc++.h>
#define Pair pair<long long, long long>
#define fi first
#define se second
//#define AddEdge(x,y,f,z) add_edge(x,y,f,z);add_edge(y,x,0,-z);
// #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++)
// char buf[1<<20],*p1=buf,*p2=buf;
using namespace std;
const int NN=5010;
long long INF=1000000000000000000ll;
const int MM=50010;
inline int read()
{char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int N,M,S,T;
struct node
{int u,v;long long f,w;
}edge[MM];
int num=0;
vector<int>con[NN];
inline void add_edge(int x,int y,long long f,long long z)
{edge[num].u=x;edge[num].v=y;edge[num].f=f;edge[num].w=z;con[x].push_back(num);num++;
}
inline void AddEdge(int x,int y,long long f,long long z) {add_edge(x,y,f,z);add_edge(y,x,0,-z);}
long long h[NN],dis[NN];
int PrePoint[NN],PreEdge[NN];
Pair Dij()
{long long ansflow=0,anscost=0;for(int i=1;i<=N;i++)h[i]=0;while(1){priority_queue<Pair>q;for(int i=1;i<=N;i++)dis[i]=INF;dis[S]=0;q.push(make_pair(0,S));while(q.size()!=0){Pair p=q.top();q.pop();if(-p.fi!=dis[p.se]) continue;if(p.se==T) break;int up=con[p.se].size();for(int ii=0;ii<up;ii++){int i=con[p.se][ii];long long nowcost=edge[i].w+h[p.se]-h[edge[i].v];if(edge[i].f>0&&dis[edge[i].v]>dis[p.se]+nowcost){dis[edge[i].v]=dis[p.se]+nowcost;q.push(make_pair(-dis[edge[i].v],edge[i].v));PrePoint[edge[i].v]=p.se;PreEdge[edge[i].v]=i;}}}if(dis[T]>=INF) break;for(int i=0;i<=N;i++) h[i]+=dis[i];long long nowflow=INF;for(int now=T;now!=S;now=PrePoint[now])nowflow=min(nowflow,edge[PreEdge[now]].f);for(int now=T;now!=S;now=PrePoint[now])edge[PreEdge[now]].f-=nowflow,edge[PreEdge[now]^1].f+=nowflow;ansflow+=nowflow;anscost+=nowflow*h[T];}return make_pair(ansflow,anscost);
}
map<int,int>ma;
long long a[NN],b[NN],c[NN];
vector<int>from[NN];
int rec[NN];
int main(){int t;scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%lld%lld%lld",a+i,b+i,c+i);}int cnt=0;int gs=n/2+n%2;for(int i=1;i<=n;i++){if(b[i]>0){for(int j=1;j<=n;j++){if(ma[j]==0)ma[j]=++cnt;from[ma[j]].push_back(i);rec[ma[j]]=j;}}else{int mid=-b[i]/(a[i]<<1);if(mid<gs){for(int j=1;j<=n;j++){if(ma[j]==0)ma[j]=++cnt;from[ma[j]].push_back(i);rec[ma[j]]=j;}}else{if(mid+gs>m){for(int j=m-n+1;j<=m;j++){if(ma[j]==0)ma[j]=++cnt;from[ma[j]].push_back(i);rec[ma[j]]=j;}}else{for(int j=mid-gs+1;j<=mid+gs;j++){if(ma[j]==0)ma[j]=++cnt;from[ma[j]].push_back(i);rec[ma[j]]=j;}}}}}N=n+3+cnt;for(int k=1;k<=n;k++){for(int i=1;i<=N;i++){con[i].clear();}num=0;for(int i=1;i<=cnt;i++){int up=from[i].size();int jj=rec[i];for(int j=0;j<up;j++){int fr=from[i][j];AddEdge(fr+2,i+n+2,1,a[fr]*jj*jj+b[fr]*jj+c[fr]);}}for(int i=1;i<=n;i++){AddEdge(2,i+2,1,0);}for(int i=n+2+1;i<=n+2+cnt;i++){AddEdge(i,N,1,0);}AddEdge(1,2,k,0);// printf("%d\n",num);// for(int i=0;i<num;i++){// 	printf("%d %d %lld %lld\n",edge[i].u,edge[i].v,edge[i].f,edge[i].w);// }S=1;T=N;Pair ans=Dij();if(k==n)printf("%lld",ans.se);else printf("%lld ",ans.se);}printf("\n");for(int i=1;i<=cnt;i++)from[i].clear();ma.clear();}return 0;
}

这篇关于2020hdu多校round2第五题New Equipments的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493478

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python中__new__()方法适应及注意事项详解

《Python中__new__()方法适应及注意事项详解》:本文主要介绍Python中__new__()方法适应及注意事项的相关资料,new()方法是Python中的一个特殊构造方法,用于在创建对... 目录前言基本用法返回值单例模式自定义对象创建注意事项总结前言new() 方法在 python 中是一个

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

vue原理分析(六)--研究new Vue()

今天我们来分析使用new Vue() 之前研究时,只是说是在创建一个实例。并没有深入进行研究 在vue的源码中找下Vue的构造函数 function Vue(options) {if (!(this instanceof Vue)) {warn$2('Vue is a constructor and should be called with the `new` keyword');}thi

2015多校联合训练第三场Work(hdu5326)

题意: a是b的上司,b是c的上司,则a是c的上司,问构成一个树种,有多人是 k个人的上司 思路: 先找出root,然后dfs一下就行 #include <bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 1e6;int f[105];int n, k;int mp[101][101];

2015年多校联合训练第三场RGCDQ(hdu5317)

题意: f(i)代表i数中有的素数的种数,给出区间[l,r],求区间内max(gcd(f(i))), 由于i最大是1e6,2*3*5*7*11*13*17>1e6,故最多不超过7种素数, 先打表打出1e6内的素数种数表,然后用sum[i][j]代表1-i个数中,还有j个素数的个数,最后用sum[r][j] - sum[l-1][j]求出区间内含有j个素数的数的个数,暴力找出1,2,3,4,5

2015多校联合训练第一场Tricks Device(hdu5294)

题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数,总边数-最短边数就是第二个答案 第一个答案就是在最短路里面求最小割,也就是求最大流,然后根据最短路在建个新图,权为1,跑一边网络流 模板题,以后就用这套模板了 #include <iostream>#include <cstdio>#incl