【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 ...
随机推荐
- 虚拟机下centos7.x简易命令大全与试玩体验
OS: liunxversion: centos7.xdate: 2019-01-18 1. cd / : 进入服务器根目录2. cd . ...
- C++ 浅拷贝与深拷贝探究
C++浅拷贝与深拷贝探究 浅拷贝与深拷贝的概念是在类的复制/拷贝构造函数中出现的. 拷贝构造函数使用场景 对象作为参数,以值传递方式传入函数(要调用拷贝构造函数将实参拷贝给函数栈中的形参) 对象作为返 ...
- 如何用git上传代码到github详细步骤
注册账户 这个小菜鸟带着心跳写的第一篇博客! 还请大家多多提点! 想使用github,第一步肯定是要注册github账号,有了账号就是直接登录啦 可以直接打开http://github.com页面注册 ...
- MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)
一. 背景 今天在MongoDB 4.0.4版本下,在还原恢复数据库时报错. 主要错误为: Failed: restore error: error applying oplog: applyOps: ...
- C#基础第五天
public struct Person { public string _name; public Gender _sex; public int _age; } public enum Gende ...
- jQuery如何制作动画
下面为一组图片(四张)展示 1 2 3 4 页面代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- docker容器日志收集方案(方案三 filebeat+journald本地日志收集)
其实方案三和方案二日志采集套路一样,但是还是有点差别. 差别就在于日志格式如下: 为了方便对比吧日志贴上来 Nov 16 10:51:58 localhost 939fe968a91d[4721] ...
- Java基础——0 前言
- day7-基础函数的学习(二)
过了元旦,加油鸭,冲鸭!!! 闲话不说,开始今日份学习整理. 今日目录,今天的学习内容不是很多! 1.函数名的运用 2.闭包(重要) 3.迭代器(重要) 开始今日份总结 1.函数名的运用 1.1函数名 ...
- Spring Boot:The field file exceeds its maximum permitted size of 1048576 bytes
错误信息:The field file exceeds its maximum permitted size of 1048576 bytes原因是因为SpringBoot内嵌tomcat默认所能上传 ...