2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 D Merchandise (斜率优化)
Description:
The elderly aunts always like to look for bargains and preferential merchandise. Now there is a shop carrying out group purchase promotion.
Rules are as follows :
There are r pieces of promotional items, and each item is only one. In the group purchase, everyone will buy one at least and have to conform the rules if they want to enjoy the benefit :
All the merchandise at a prime number has to be purchased ;
the merchandise at non-prime number cannot be chosen ;
The amount of money that each person pays is the square of the difference between the maximum and minimum value of the product he or she chooses. Notice that there may be several merchandises having the same price.
(If a person buys only one item, follow the rules and spend ¥ 0.00)
Assume that there are m people in a group, and everyone should enjoy the benefit. Please arrange each person's choice of merchandise reasonably, so that the sum of money paid by m people can be the minimum.
The number of merchandise with a price of prime is n,m<=n , n<=5000
Input:
The input contains multiple test cases.
In the first line of the input there’s an integer T which is the number of test cases. Then the description of T test cases will be given.
For any test case, the first line of input consists of two separated integers r and m.
(0<r<=100000,0<m<=1000)
The second line should consists of r space separated integers k1,k2...kr.
(1<ki<2^16,1<=i<=r)
ki represents the price of one item
Output:
Print one integer sum (sum<2^32)——the minimum number of money paid by m people.
忽略每行输出的末尾多余空格
样例输入
1
6 2
5 6 10 2 11 3
样例输出
9 题意:给你r个数,首先你要跳出其中的所有的素数(n<=5000),然后将这些素数分成m(<=n)个组。
每个组的权值为(这个组中最大元素-这个组最小元素)^2,问各组的权值的和最小为多少
思路:
首先我们想到先排序然后dp
先写转移方程,我们设dp[i][j]为前i个数分为j个集合的权值的和,则有
还有j那维需要循环,这个复杂度为n^3,显然是超时的。我们利用斜率优化算法优化成n^2的
将上面等式右边{}内的看成关于自变量k的一个函数val(k)
将k1带入得到
将k看成变量,分离变量与常量整理上式。
这个式子就像一个直线的方程,我们的目的是让dp[i][j]最小即截距dp[i][j]+a[i]^2最小
这个直线的斜率是2*a[i],也就是说坐标轴上有好多点,每个具体的k都确定一个点(a[k],dp[k-1][j-1]+a[k]^2)
我们转化成了一个线性规划问题,假设当前有好几个点,我们只需要维护他们是下凸的就行了
即如果有三个连续的点k1,k2,k3,那么斜率(k2,k1)<斜率(k2,k3)
这个我们用单调队列维护。这样就能减少复杂度
代码如下:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const ll inf = 1e18;
const int maxn = 5e5+;
const int maxm = ;
const int maxp = (<<)+;
bool check (int x){
for (int i=;i*i<=x;++i){
if (x%i==)
return false;
}
return true;
}
int prime[maxp];//保存素数
bool vis[maxp];
int r,n,m;
ll a[maxn],b[maxm];
ll dp[maxm][maxm];
int q[maxm];
int head,tail;
void getprime(int n)
{
int cnt = ;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
if(!vis[i])
prime[cnt++]=i;
for(int j=;j<cnt&&i*prime[j]<n;j++)
{
vis[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
return ;
}
int main()
{
int t;
getprime(maxp);
//freopen("de.txt","r",stdin);
scanf("%d",&t);
dp[][]=;
for (int i=;i<maxm;++i)
dp[i][]=inf;
while (t--){
n = ;
ll x;
scanf("%d%d",&r,&m);
for (int i=;i<r;++i){
scanf("%lld",&x);
if (!vis[x]){
a[++n] = x;
}
}
sort(a+,a+n+);
for (int i=;i<=n;++i){
b[i] = a[i]*a[i];
}
for (int j=;j<=m;++j){
head = ,tail = ;
dp[][j]=inf;
for (int i=;i<=n;++i){
while (tail-head>=){
int x=q[tail-],y=q[tail-];
double v1,v2;
if (a[y]==a[x]) v1 = inf;
else v1=(dp[y-][j-]+b[y]-dp[x-][j-]-b[x])/(2.0*(a[y]-a[x]));
if (a[y]==a[i]) v2 = inf;
else v2=(dp[i-][j-]+b[i]-dp[y-][j-]-b[y])/(2.0*(a[i]-a[y]));
if (v1>v2)
tail--;
else
break;
}
q[tail++] = i;
while (tail-head>=){
int x=q[head],y=q[head+];
double v1;
if (a[y]==a[x]) v1 = inf;
else v1=(dp[y-][j-]+b[y]-dp[x-][j-]-b[x])/(2.0*(a[y]-a[x]));
if (v1<a[i])
head++;
else
break;
}
int tmp = q[head];
dp[i][j] = dp[tmp-][j-]+(ll)(a[i]-a[tmp])*(ll)(a[i]-a[tmp]);
//printf("%lld %d %d\n",dp[i][j],i,j);
}
}
printf("%lld\n",dp[n][m]);
}
return ;
}
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 D Merchandise (斜率优化)的更多相关文章
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 F题 Clever King(最小割)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- 计蒜客 25985.Goldbach-米勒拉宾素数判定(大素数) (2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 B)
若干年之前的一道题,当时能写出来还是超级开心的,虽然是个板子题.一直忘记写博客,备忘一下. 米勒拉判大素数,关于米勒拉宾是个什么东西,传送门了解一下:biubiubiu~ B. Goldbach 题目 ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 I. Reversion Count (java大数)
Description: There is a positive integer X, X's reversion count is Y. For example, X=123, Y=321; X=1 ...
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
A------------------------------------------------------------------------------------ 题目链接:http://20 ...
- 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)
有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 3 ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...
- 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】
Tree and Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
随机推荐
- day49—JavaScript阻止浏览器默认行为
转行学开发,代码100天——2018-05-04 今天主要说明一下通过JavaScript对浏览器默认行为的阻止操作.比如右键菜单的行为. 阻止默认行为的语句为: return false; 例如,阻 ...
- 用python进行月份加减的函数
import math def add_month(datamonth, num): """ 月份加减函数,返回字符串类型 :param datamonth: 时间(20 ...
- Week 7 - 714. Best Time to Buy and Sell Stock with Transaction Fee & 718. Maximum Length of Repeated Subarray
714. Best Time to Buy and Sell Stock with Transaction Fee - Medium Your are given an array of intege ...
- 观察者模式(jdk实现)
1.定义 在对象中定义一对多的依赖,当一个对象改变状态,依赖它的对象会收到通知并更新. 2.实现 (主要通过jdk自己定义的观察者实现) 以气象站通知展示板为例子,当气象站收到的各种参数改变的时候 ...
- mybatis初步理解
mybatis概念 mybatis 是一款轻量级的orm的数据持久框架,封装jdbc 对开发提供了便利,但是性能会比jdbc低,从开发的角度来说,现在是比较流行的 掌握上比较容易,也支持缓存,级联 ...
- [Python3 填坑] 003 关键字?保留字?预留字?
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 问题的由来 2.2 网上搜索 2.3 结论 2.4 后记 1. print( 坑的信息 ) 挖坑时间:2019/01/04 明细 坑的编 ...
- 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...
- 我刚学OI
我是新人,刚学OI,请问可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最小费用最大流预处理混合图上莫比乌斯反演莫队带花舞蹈链并查集树状数组套主席树预处理动态DP分治FFT求多项式逆元对数函数的指 ...
- jsp:include 通过变量作为路径动态引入
语法:<jsp:include page="<%=整体是个变量%>" flush="true"/> 示例: <%@ page la ...
- HDU 1024 Max Sum Plus Plus (递推)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...