企业手机网站建设策划方案房产交易中心官网
web/
2025/10/6 19:50:24/
文章来源:
企业手机网站建设策划方案,房产交易中心官网,苏州企业如何建网站,2016网站谷歌权重CF1178H Stock Exchange
题目描述
简要题意#xff1a;给定2n2n2n个一次函数yaixbi(a,b0)ya_ixb_i(a,b0)yaixbi(a,b0)#xff0c;刚开始你有前nnn个函数各一个#xff0c;在任意时刻ttt#xff0c;xxx函数可以转换为yyy函数当且仅当axtbxaytbya_xtb_…CF1178H Stock Exchange
题目描述
简要题意给定2n2n2n个一次函数yaixbi(a,b0)ya_ixb_i(a,b0)yaixbi(a,b0)刚开始你有前nnn个函数各一个在任意时刻tttxxx函数可以转换为yyy函数当且仅当axtbxaytbya_xtb_xa_ytb_yaxtbxaytby最后要获得n1...2nn1...2nn1...2n的函数各一个求完成时刻最小的前提下转换次数的最小值。
Solution
显然最后的方案需要1...n1...n1...n和n1...2nn1...2nn1...2n形成完美匹配。 有一个重要的性质 一定存在一个最优方案使得每一个匹配的中转点唯一且只在000时刻和ttt时刻进行交换。显然对于某一匹配x−yx-yx−y的转化方案{x,z1,z2...zk,y}\{x,z_1,z_2...z_k,y\}{x,z1,z2...zk,y}来说最多只需要取xxx,yyy,和一个{z1...zk}\{z_1...z_k\}{z1...zk}中斜率最大的zmaxaz_{maxa}zmaxa即可
因此对于第一问考虑二分答案完成时刻ttt每一个1..n1..n1..n的函数在000时刻先贪心地转化为能转化的在ttt时刻最大的函数作为中转点然后再考虑ttt时刻时能否通过这些最优中转点匹配出所有的n1...2nn1...2nn1...2n的函数。
对于第二问考虑费用流把每一个点iii拆成iii和i2ni2ni2n从SSS向1..n1..n1..n连一条(flow1,cost0)(flow1,cost0)(flow1,cost0)的边从n1...2nn1...2nn1...2n向TTT连一条(1,0)(1,0)(1,0)的边从iii向i2ni2ni2n连一条(INF,0)(INF,0)(INF,0)的边然后对于能在000时刻转化的i−ji-ji−j连一条(INF,1)(INF,1)(INF,1)的边,在ttt时刻也做一次这样的操作。
但是这样的边数是O(n2)O(n^2)O(n2)超过了16M16M16M的空间限制。 我们发现对于iii来说它可以转化的点是一段按bib_ibi排序的前缀所以不需要每个i−ji-ji−j都连边了。
设排序之后的编号idiid_iidi新建i4ni4ni4n的点从idi4nid_i4nidi4n向idi−14nid_{i-1}4nidi−14n连一条(INF,0)(INF,0)(INF,0)的边再从idiid_iidi向idi4nid_i4nidi4n连一条(INF,1)(INF,1)(INF,1)的边。
这样一来i−ji-ji−j就可以通过一层一层的价格下降得到了。然后对于i2ni2ni2n的点也新建i6ni6ni6n按上述方法连边即可。
Code
#include vector
#include list
#include map
#include set
#include deque
#include queue
#include stack
#include bitset
#include algorithm
#include functional
#include numeric
#include utility
#include sstream
#include iostream
#include iomanip
#include cstdio
#include cmath
#include cstdlib
#include cctype
#include string
#include cstring
#include ctime
#include cassert
#include string.h
//#include unordered_set
//#include unordered_map
//#include bits/stdc.h#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i(a);i(b);i)
#define fi first
#define se secondusing namespace std;templatetypename Tinline bool upmin(T x,T y) { return yx?xy,1:0; }
templatetypename Tinline bool upmax(T x,T y) { return xy?xy,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pairint,int PR;
typedef vectorint VI;const lod eps1e-11;
const lod piacos(-1);
const int oo130;
const ll loo1ll62;
const int mods998244353;
const int MAXN4405;
const int MAXMMAXN6;
const int INF0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f1,x0; char cgetchar();while (c0||c9) { if (c-) f-1; cgetchar(); }while (c0c9) { x(x3)(x1)(c^48); cgetchar(); }return x*f;
}
queueint que;
ll c[MAXN],to[MAXN];
pairll,ll a[MAXN];
int n,nn,vnum,edgenum1,id0[MAXN],idt[MAXN],t,S,T;
int flow[MAXN2],dist[MAXN2],vis[MAXN2];
int head[MAXN2],pre[MAXN2],from[MAXN2];
struct enode{ int to,nxt,f,c; } e[MAXM];int compare0(int x,int y) { return (a[x].sea[y].se)||(a[x].sea[y].sea[x].fia[y].fi); }
int comparet(int x,int y) { return a[x].fi*ta[x].sea[y].fi*ta[y].se; }
bool check(int x)
{tx;for (int i1;inn;i) c[i]a[i].fi*ta[i].se;for (int i1,k1;inn;i){if (c[id0[i]]c[id0[k]]) ki;to[id0[i]]c[id0[k]];}sort(to1,ton1);if (t1e9)for (int i1;inn;i) coutid0[i]endl;sort(idt1,idtnn1,comparet);for (int i1,now1;inn;i) {if (idt[i]n) continue;if (to[now]c[idt[i]]) return 0;else now;}return 1;
}
int solve1()
{int l0,r1e9;while (lr){int mid(lr)1;if (check(mid)) rmid;else lmid1;}return r;
}void add(int u,int v,int f,int c)
{
// coutu v f cendl;e[edgenum](enode){v,head[u],f, c},head[u]edgenum;e[edgenum](enode){u,head[v],0,-c},head[v]edgenum;
}
void build() //这里把值相同的i4n合并成了一个点,效果相同,空间压缩之后会更小一些,i6n同理。
{Snn1|1,TvnumS1;for (int i1;in;i) add(S,i,1,0);for (int in1;inn;i) add(inn,T,1,0);for (int i1;inn;i) add(i,inn,INF,0);for (int i1;inn;i) c[i]a[i].se;for (int i1,j;inn;ij1){ji,vnum;while (c[id0[i]]c[id0[j1]]) j;for (int ki;kj;k) add(id0[k],vnum,INF,1),add(vnum,id0[k],INF,0);if (i1) add(vnum,vnum-1,INF,0);}for (int i1;inn;i) c[i]a[i].fi*ta[i].se;for (int i1,j;inn;ij1){ji,vnum;while (c[idt[i]]c[idt[j1]]) j;for (int ki;kj;k) add(idt[k]nn,vnum,INF,1),add(vnum,idt[k]nn,INF,0);if (i1) add(vnum,vnum-1,INF,0);}
}int bfs()
{for (int i1;ivnum;i) dist[i]INF,flow[i]vis[i]0;dist[S]0,flow[S]INF,vis[S]1,que.push(S);while (!que.empty()){int uque.front(); que.pop();
// coutu:dist[u] flow[u]endl;for (int ihead[u];i;ie[i].nxt){int ve[i].to,fe[i].f,ce[i].c;if (!f||dist[u]e[i].cdist[v]) continue;pre[v]u,from[v]i;flow[v]min(flow[u],f);dist[v]dist[u]e[i].c;if (!vis[v]) vis[v]1,que.push(v);}vis[u]0;}return flow[T];
}
int MCMF()
{int ans0;while (bfs()){ansdist[T]*flow[T];for (int pT;p!S;ppre[p])e[from[p]].f-flow[T],e[from[p]^1].fflow[T];}return ans;
}
int main()
{nread(),nnnn;for (int i1;inn;i) a[i].firead(),a[i].seread(),id0[i]idt[i]i;sort(id01,id0nn1,compare0);tsolve1();if (!check(t)) { puts(-1); return 0; } printf(%d ,t);sort(idt1,idtnn,comparet);build();int ansMCMF();printf(%d\n,ans);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88086.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!