【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 ...
随机推荐
- Android远程桌面助手(Build 0737)
Android Remote Displayer and Controller Build 0737, Aug 02, 2017 新增功能: 录制MP4文件,突破了Android原生180S的限制 截 ...
- django源码分析 请求流程
一.从浏览器发出一个请求,到返回响应内容,这个过程是怎么样的? 1. 浏览器解析输入的url 2. 查找url对应的ip地址 3. 通过ip地址访问我们的服务器 1. 请求进入wsgi服务器(我在这 ...
- MR单元测试以及DeBug调试
Hadoop的MapReduce程序提交到集群环境中运行,出问题时定位非常麻烦,有时需要一遍遍修改代码和打印日志来排查问题,哪怕是比较小的问题.如果数据量很大的话调试起来就相当耗费时间. 而且,Map ...
- python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写
python3的re模块使用过程中,正则的书写遇到了一些问题,就是使用.*?能不能匹配到换行符的问题. 答案是不能. 如果在匹配过程中遇到了也没关系,加上这个语句就好: \s+
- Json对象遍历
var json = {"id":"123","name":"tom","sex":"ma ...
- MongoDB的常用命令和增查改删
数据库操作 Mongodb MySQL 查询库 show databases | show dbs show databases 选中库 use databaseName use databaseNa ...
- LeetCode算法题-Design HashMap(Java实现)
这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...
- Django--session(登录用)
一.session的原理图 二.Django中session对象的设置/读取/删除及其他方法 三. Django--配置 settings.py中与session有关的参数 一.session的原理图 ...
- SQLAlchemy增删改查
sqlalchemy中让MySQL支持中文字符 engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest ...
- ValueOf()和toString()
var colors = ["red", "blue", "green"]; // 创建一个包含3 个字符串的数组 console.log( ...