CF1178H Stock Exchange

CF1178H Stock Exchange

题目描述

简要题意:给定2n2n2n个一次函数y=aix+bi(a,b>0)y=a_ix+b_i(a,b>0)y=aix+bi(a,b>0),刚开始你有前nnn个函数各一个,在任意时刻tttxxx函数可以转换为yyy函数当且仅当axt+bx>=ayt+bya_xt+b_x>=a_yt+b_yaxt+bx>=ayt+by,最后要获得n+1...2nn+1...2nn+1...2n的函数各一个,求完成时刻最小的前提下转换次数的最小值。

Solution

显然最后的方案需要1...n1...n1...nn+1...2nn+1...2nn+1...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时刻时能否通过这些最优中转点匹配出所有的n+1...2nn+1...2nn+1...2n的函数。

对于第二问,考虑费用流,把每一个点iii拆成iiii+2ni+2ni+2n,从SSS1..n1..n1..n连一条(flow=1,cost=0)(flow=1,cost=0)(flow=1,cost=0)的边,从n+1...2nn+1...2nn+1...2nTTT连一条(1,0)(1,0)(1,0)的边,从iiii+2ni+2ni+2n连一条(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,新建i+4ni+4ni+4n的点,从idi+4nid_i+4nidi+4nidi−1+4nid_{i-1}+4nidi1+4n连一条(INF,0)(INF,0)(INF,0)的边,再从idiid_iidiidi+4nid_i+4nidi+4n连一条(INF,1)(INF,1)(INF,1)的边。

这样一来,i−>ji->ji>j就可以通过一层一层的价格下降得到了。然后对于i+2ni+2ni+2n的点也新建i+6ni+6ni+6n按上述方法连边即可。

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;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=4405;
const int MAXM=MAXN<<6;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
queue<int> que;
ll c[MAXN],to[MAXN];
pair<ll,ll> a[MAXN];
int n,nn,vnum,edgenum=1,id0[MAXN],idt[MAXN],t,S,T;
int flow[MAXN<<2],dist[MAXN<<2],vis[MAXN<<2];
int head[MAXN<<2],pre[MAXN<<2],from[MAXN<<2];
struct enode{ int to,nxt,f,c; } e[MAXM];int compare0(int x,int y) { return (a[x].se<a[y].se)||(a[x].se==a[y].se&&a[x].fi>a[y].fi); }
int comparet(int x,int y) { return a[x].fi*t+a[x].se<a[y].fi*t+a[y].se; }
bool check(int x)
{t=x;for (int i=1;i<=nn;i++) c[i]=a[i].fi*t+a[i].se;for (int i=1,k=1;i<=nn;i++){if (c[id0[i]]>c[id0[k]]) k=i;to[id0[i]]=c[id0[k]];}sort(to+1,to+n+1);if (t==1e9)for (int i=1;i<=nn;i++) cout<<id0[i]<<endl;sort(idt+1,idt+nn+1,comparet);for (int i=1,now=1;i<=nn;i++) {if (idt[i]<=n) continue;if (to[now]<c[idt[i]]) return 0;else now++;}return 1;
}
int solve1()
{int l=0,r=1e9;while (l<r){int mid=(l+r)>>1;if (check(mid)) r=mid;else l=mid+1;}return r;
}void add(int u,int v,int f,int c)
{
//	cout<<u<<" "<<v<<" "<<f<<" "<<c<<endl;e[++edgenum]=(enode){v,head[u],f, c},head[u]=edgenum;e[++edgenum]=(enode){u,head[v],0,-c},head[v]=edgenum;
}
void build()  //这里把值相同的i+4n合并成了一个点,效果相同,空间压缩之后会更小一些,i+6n同理。
{S=nn<<1|1,T=vnum=S+1;for (int i=1;i<=n;i++) add(S,i,1,0);for (int i=n+1;i<=nn;i++) add(i+nn,T,1,0);for (int i=1;i<=nn;i++) add(i,i+nn,INF,0);for (int i=1;i<=nn;i++) c[i]=a[i].se;for (int i=1,j;i<=nn;i=j+1){j=i,vnum++;while (c[id0[i]]==c[id0[j+1]]) j++;for (int k=i;k<=j;k++) add(id0[k],vnum,INF,1),add(vnum,id0[k],INF,0);if (i>1) add(vnum,vnum-1,INF,0);}for (int i=1;i<=nn;i++) c[i]=a[i].fi*t+a[i].se;for (int i=1,j;i<=nn;i=j+1){j=i,vnum++;while (c[idt[i]]==c[idt[j+1]]) j++;for (int k=i;k<=j;k++) add(idt[k]+nn,vnum,INF,1),add(vnum,idt[k]+nn,INF,0);if (i>1) add(vnum,vnum-1,INF,0);}
}int bfs()
{for (int i=1;i<=vnum;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 u=que.front(); que.pop();
//		cout<<u<<":"<<dist[u]<<" "<<flow[u]<<endl;for (int i=head[u];i;i=e[i].nxt){int v=e[i].to,f=e[i].f,c=e[i].c;if (!f||dist[u]+e[i].c>=dist[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 ans=0;while (bfs()){ans+=dist[T]*flow[T];for (int p=T;p!=S;p=pre[p])e[from[p]].f-=flow[T],e[from[p]^1].f+=flow[T];}return ans;
}
int main()
{n=read(),nn=n+n;for (int i=1;i<=nn;i++) a[i].fi=read(),a[i].se=read(),id0[i]=idt[i]=i;sort(id0+1,id0+nn+1,compare0);t=solve1();if (!check(t)) { puts("-1"); return 0; } printf("%d ",t);sort(idt+1,idt+nn,comparet);build();int ans=MCMF();printf("%d\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET CORE 对接天翼云 OOS

最近&#xff0c;因公司项目需要对接天翼云OOS&#xff0c;在百度多次折腾后&#xff0c;大部分的都是基于java、php 等其他语言&#xff0c;很少基于C#语言的相关资料&#xff0c;即使有也是基于.NET Framwork开发的SDK&#xff0c;内容几乎是千篇一律&#xff0c;很少基于.NE…

盘点618 .NET 程序员必“败”书单

六月到了&#xff0c;有三个节日迎接我们&#xff0c;心中微微一盘算&#xff1a;儿童节和端午节仿佛对我们都不重要。我们期待的只有&#xff1a;618狂欢购物节&#xff01;没错一年一度的618来了,哪些书值得买&#xff1f; 小编盘点了2019年1-5月.NET 相关的图书&#xff0c;…

CF1028F. Make Symmetrical

CF1028F. Make Symmetrical 题目描述 Solution 结论1&#xff1a;两个点(x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)(x1​,y1​),(x2​,y2​)关于(0,0),(x3,y3)(0,0),(x_3,y_3)(0,0),(x3​,y3​)对称的必要条件为(x1,y1)(x_1,y_1)(x1​,y1​)和(x2,y2)(x_2,y_2)(x2​,y2​)在同一个…

ApplicationInsights的探测器尝鲜

通常我们可以依靠ApplicationInsights(以下简称ai&#xff09;来收集比如请求(request),依赖项(dependencies),异常(exception)等信息&#xff0c;但是无法收集到比如一个方法&#xff08;方法内部比如没有依赖项调用&#xff09;的信息。很多时候如果一个方法很慢&#xff0c;…

CF917C. Pollywog

CF917C. Pollywog 题目描述 Solution 看完题&#xff0c;基本的方向就是状压DP。 因为每次都是最左边的青蛙跳至多kkk步&#xff0c;容易发现任意两个青蛙之间的距离始终小于kkk。 因此可以把连续kkk个位置的空闲状态压在(kx)≤70\binom{k}{x}\leq70(xk​)≤70个二进制数中…

开源/免费界面自动化测试工具对比研究

摘要&#xff1a;随着我行自动化测试实施范围的不断扩大&#xff0c;参与界面自动化测试的应用系统越来越多。我行的应用系统现阶段多采用商用工具QTP&#xff08;UFT&#xff09;作为执行工具来进行界面自动化测试&#xff0c;采购的QTP license是有限的&#xff0c;使得资源的…

CF1119G. Get Ready for the Battle

CF1119G. Get Ready for the Battle 题目描述 Solution 妙妙构造题。 考虑这样一个过程&#xff1a;所有人一起打第一个怪&#xff0c;每次打nnn&#xff0c;最后剩下k1<nk_1<nk1​<n&#xff0c;就找一些加起来正好为k1k_1k1​的组打掉k1k_1k1​&#xff0c;剩下的…

使用 ConfigMap 挂载配置文件

使用 ConfigMap 挂载配置文件Intro有一些敏感信息比如数据库连接字符串之类的出于安全考虑&#xff0c;这些敏感信息保存在了 AzureKeyVault 中&#xff0c;最近应用上了 k8s 部署&#xff0c;所以想把 AzureKeyVault 的信息迁移到 ConfigMap&#xff0c;不再依赖 AzureKeyVaul…

CF1158D. Beautiful Array

CF1158D. Beautiful Array Solution 构造 对于所有点(xi,yi)(x_i,y_i)(xi​,yi​)选择yiy_iyi​最小的点作为起点&#xff0c;每次考虑下一步若是LLL&#xff0c;则往最右边&#xff08;与当前线段夹角最大&#xff09;的点走&#xff0c;否则往最左边的点走。 时间复杂度O…

SciSharpCube:容器中的SciSharp,.NET机器学习开箱即用

SciSharp Cube在Docker容器中快速体验SciSharp机器学习工具的最新功能。项目地址(原文链接)&#xff1a;https://github.com/SciSharp/SciSharpCube从Docker Hub运行docker run --name scisharp -it -p 8888:8888 scisharpstack/scisharpcube这条命令会拉取最新的SciSharpCube镜…

CF704B. Ant Man

CF704B. Ant Man Solution 经典dpdpdp&#xff0c;第一次见好像是在ZJOIZJOIZJOI的某题&#xff1f; 先按xxx排序 用f[i][j]f[i][j]f[i][j]表示放入前iii个数&#xff0c;有jjj个端点&#xff08;不算边界点&#xff09;的最小代价。 每次可以&#xff1a; 1.合并两段折线 2.…

.NET Core 3中的性能提升(译文)

回顾我们准备推出.NET Core 2.0的时候&#xff0c;我写了一篇博文来介绍.NET已经引入的诸多性能优化中的一部分&#xff0c;我很喜欢把它们放在一起讲述&#xff0c;也收获了很多正面反馈&#xff0c;因此我又给.NET Core 2.1&#xff0c;一个同样高度聚焦于性能的版本&#xf…

CF594D. REQ

CF594D. REQ Solution 离线询问&#xff0c;按左端点排序。 对于每个质因数都会有p−1p\frac{p-1}{p}pp−1​的贡献&#xff0c;考虑把贡献维护在当前左端点右边最早出现的ppp倍数的位置上。 每次lll增加的时候&#xff0c;把这一位变成1&#xff0c;并把这一位的质因数的贡…

程序员修神之路--高并发下为什么更喜欢进程内缓存

菜菜哥&#xff0c;告诉你一个好消息YY妹子&#xff0c;什么好消息&#xff0c;你有男票了&#xff1f;不是啦&#xff0c;我做的一个网站&#xff0c;以前经常由于访问量太大而崩溃&#xff0c;现在我加上了缓存&#xff0c;很稳定啦加的什么缓存呢&#xff1f;我用的redis&am…

CF364B. Free Market

CF364B. Free Market Solution 显然最终能取到的物品必然是按cic_ici​从小到大排序后的一段前缀。能取到的价值集合可由这段前缀做背包得到。每一轮取数的价值最多增加ddd。 因此先对所有cic_ici​做背包&#xff0c;从000开始每次贪心地选取距离不超过ddd的能被ccc表出的最…

6月数据库排行:PostgreSQL和MongoDB分数罕见下降

DB-Engines 数据库流行度排行榜 6 月更新已发布&#xff0c;排名前二十如下&#xff1a;总体排名和上个月相比基本一致&#xff0c;其中排名前三的 Oracle、MySQL 和 Microsoft SQL Server 也是分数增加最多的三个数据库&#xff0c;增加的分数分别为 13.67、4.67 和 15.57&…

CF611F. New Year and Cleaning

CF611F. New Year and Cleaning Solution 还挺巧妙的套路。 把起点整体看作一个矩阵&#xff0c;在操作时移出原来矩阵外的部分的起点都是超越边界的&#xff0c;可以直接通过超出的面积计算贡献&#xff0c;再把超出的部分删去&#xff0c;模拟即可&#xff08;第一轮模拟会…

在ASP.Net Core 中使用枚举类而不是枚举

前言&#xff1a;我相信大家在编写代码时经常会遇到各种状态值&#xff0c;而且为了避免硬编码和代码中出现魔法数&#xff0c;通常我们都会定义一个枚举&#xff0c;来表示各种状态值&#xff0c;直到我看到Java中这样使用枚举&#xff0c;我再想C# 中可不可以这样写&#xff…

CF626E. Simple Skewness

CF626E. Simple Skewness Solution 先排序。 nnn为奇数时&#xff0c;枚举中位数&#xff0c;两边贪心地选择最大的数&#xff0c;显然平均数是凸函数&#xff0c;三分即可确定最值。 当nnn为偶数时&#xff0c;必然选择最大值&#xff0c;然后转化为nnn为奇数的情况。 PS&a…

ASP.NET Core 中的错误处理

1.前言ASP.NET Core处理错误环境区分为两种&#xff1a;开发环境和非开发环境。●开发环境&#xff1a;开发人员异常页。●非开发环境&#xff1a;异常处理程序页、状态代码页。在Startup.Configure方法里面我们会看到如下代码&#xff1a;env.IsDevelopment()是判断应用程序运…