【UOJ386】【UNR #3】鸽子固定器 链表
题目描述
有 \(n\) 个物品,每个物品有两个属性:权值 \(v\) 和大小 \(s\)。
你要选出 \(m\) 个物品,使得你选出的物品的权值的和的 \(d_v\) 次方减掉大小的极差的 \(d_s\) 次方最大。
\(n\leq 200000,m\leq 50,1\leq d_v,d_s\leq 2\)
题解
1. 如果选的物品的数量不到 \(m\) 个,且大小不是连续的,那么一定不是最优的。
因为如果不是连续的,那么可以多选一个大小在这些物品之间的物品,使答案更优。
2. 如果选了 \(m\) 个物品,那么可以枚举权值最小的物品 \(i\),可以发现,选的物品的大小组成了一个包含 \(i\) 的区间。这样的区间最多只有 \(O(m)\) 个。
否则可以删掉 \(i\) 这个物品,换上一个权值更大的物品,使答案更优。
可以用一个链表维护物品的大小组成的序列。
时间复杂度:\(O(nm)\)
题解
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
int l[N],r[N];
int n,m,ds,dv;
ll s[N];
ll fp(ll a,int b)
{
return b==1?a:a*a;
}
ll calc(ll x,ll y)
{
return fp(x,dv)-fp(y,ds);
}
void del(int x)
{
r[l[x]]=r[x];
l[r[x]]=l[x];
}
struct pp
{
int s,v,c;
};
pp a[N],b[N],c[N];
int cmp1(pp a,pp b)
{
return a.s<b.s;
}
int cmp2(pp a,pp b)
{
return a.v<b.v;
}
int t;
ll ans;
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
scanf("%d%d%d%d",&n,&m,&ds,&dv);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].s,&a[i].v);
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;i++)
{
a[i].c=i;
b[i]=a[i];
}
for(int i=1;i<=n;i++)
{
ll temp=0;
for(int j=i;j<=n&&j<=i+m-1;j++)
{
temp+=a[j].v;
ans=max(ans,calc(temp,a[j].s-a[i].s));
}
}
sort(a+1,a+n+1,cmp2);
for(int i=0;i<=n;i++)
r[i]=i+1;
for(int i=1;i<=n+1;i++)
l[i]=i-1;
for(int i=1;i<=n;i++)
{
t=0;
for(int j=a[i].c,k=1;j>=1&&k<=m;j=l[j],k++)
c[++t]=b[j];
reverse(c+1,c+t+1);
for(int j=r[a[i].c],k=2;j<=n&&k<=m;j=r[j],k++)
c[++t]=b[j];
for(int j=1;j<=t;j++)
s[j]=s[j-1]+c[j].v;
for(int j=m;j<=t;j++)
ans=max(ans,calc(s[j]-s[j-m],c[j].s-c[j-m+1].s));
del(a[i].c);
}
printf("%lld\n",ans);
return 0;
}
【UOJ386】【UNR #3】鸽子固定器 链表的更多相关文章
- UOJ#386. 【UNR #3】鸽子固定器(链表)
题意 题目链接 为了固定S**p*鸽鸽,whx和zzt来到鸽具商店选购鸽子固定器. 鸽具商店有 nn 个不同大小的固定器,现在可以选择至多 mm 个来固定S**p*鸽鸽.每个固定器有大小 sisi 和 ...
- UOJ.386.[UNR #3]鸽子固定器(贪心 链表)
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...
- #386. 【UNR #3】鸽子固定器
#386. [UNR #3]鸽子固定器 题目链接 官方题解 分析: 神奇的做法+链表. 首先按照大小排序. 对于小于选择小于m个物品的时候,这个m个物品一定是一段连续的区间.因为,如果中间空着一个物品 ...
- 【UOJ#386】【UNR#3】鸽子固定器(贪心)
[UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...
- uoj386 【UNR #3】鸽子固定器
link (似乎很久没写题解了) 题意: n个物品,每个物品有a,b两个值,给定A,B,现在最多选其中m个,要求最大化选出的物品中[b权值和的B次方-a极差的A次方]. $n\leq 2\times ...
- uoj#386. 【UNR #3】鸽子固定器(乱搞)
传送门 题解 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i ...
- [UOJ386]鸽子固定器
题解 堆+贪心 题意就是给你\(n\)个物品,让你最多选\(m\)个 每个物品有两个属性\(a_i,b_i\) 最大化\((\sum_{a_i})^{dv}+(max(b_i)-min(b_i))^{ ...
- UNR#3 Day1——[ 堆+ST表+复杂度分析 ][ 结论 ][ 线段树合并 ]
地址:http://uoj.ac/contest/45 第一题是鸽子固定器. 只会10分.按 s 从小到大排序,然后 dp[ i ][ j ][ k ] 表示前 i 个元素.已经选了 j 个.最小值所 ...
- 数据结构之链表C语言实现以及使用场景分析
牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...
随机推荐
- vue父子组件之间传值
vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...
- [20190402]对比_mutex_wait_scheme不同模式cpu消耗.txt
[20190402]对比_mutex_wait_scheme不同模式cpu消耗.txt --//前几天做了sql语句在mutexes上的探究.今天对比不同_mutex_wait_scheme模式cpu ...
- Angualr学习笔记
0.安装即环境初始化 下载node至windows,点击安装,所有环境变量直接OK: linux下载tar后,解压,在/etc/profile的path路径下增加node执行路径: export PA ...
- Greenplum扩容
Greenplum支持原有主机扩展Segment个数.新增主机.和混合扩展 本文以在已有机器上扩展节点为例 1.可按照hostname:address:port:fselocation:dbid:co ...
- Oracle——DQL、DML、DDL、DCL
1.DQL:数据查询语言 基本结构:由select.from.where组成 子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHE ...
- c/c++ 网络编程 UDP 改变网卡的硬件地址
网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...
- 既然CPU同一时间只能执行一个线程,为什么存在并发问题
一点小疑惑终于解开啦 1.CPU的时间是按时间片分的,而不是一个时间点,并发问题是由于CPU线程切换导致的. 现在假设有一段代码 if(i == 1) { i++; //断点1 system.out. ...
- Git与SVN交叉使用
将本地git项目添加到远程svn中 git svn [svnprojpath] svnprojpath为原创svn项目路径 -- 文件夹路径,你要放到哪个文件夹 官方文档中带有-s参数,但我这边加了会 ...
- Cloudera Manager(CDH5)内部结构、功能包括配置文件、目录位置等
1. 相关目录 /var/log/cloudera-scm-installer : 安装日志目录./var/log/* : 相关日志文件(相关服务的及CM的)./usr/share/cmf/ : 程序 ...
- css实现单行(多行)文本溢出显示 ...
overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 当然还需要加宽度width属来兼容部分浏览. 以上为单行文本溢出===== ...