【UOJ#386】【UNR#3】鸽子固定器(贪心)
【UOJ#386】【UNR#3】鸽子固定器(贪心)
题面
题解
一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那\(m\)个东西。
考虑优化这个过程,我们枚举右端点,左端点向左移动,每次插入一个元素,用堆来维护选择的过程。这样子复杂度可以做到\(O(n^2logn)\)。
考虑继续优化这个过程,首先如果右端点一旦被弹出堆这个过程就可以终止了,这个很显然。
通过这个过程,我们也可以明白如果选择的个数不超过\(m\)个则必定是一段连续的区间。
接下来一定要选择恰好\(m\)个,如果区间内没有被选满,不难知道没有被选的一定是较小的值。
那么拿一个链表来维护剩下的元素,每次把最小值删掉,这样子每次选择的区间就是连续的了。然后我们在删的时候统计强制包含最小值的最大区间。
于是综上复杂度是\(O(nm)\)。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 200200
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Node{int s,v;}p[MAX];
bool operator<(Node a,Node b){return a.s<b.s;}
bool cmp(int a,int b){return p[a].v<p[b].v;}
int n,m,ds,dv,id[MAX],lt[MAX],nt[MAX];
ll ans,s[MAX];
ll CalcS(ll x){return ds==1?x:x*x;}
ll CalcV(ll x){return dv==1?x:x*x;}
int St[MAX],tot;
int main()
{
n=read();m=read();ds=read();dv=read();
for(int i=1;i<=n;++i)p[i].s=read(),p[i].v=read();
sort(&p[1],&p[n+1]);
for(int i=1;i<=n;++i)s[i]=s[i-1]+p[i].v;
for(int l=1;l<m;++l)
for(int i=1;i+l-1<=n;++i)
ans=max(ans,CalcV(s[i+l-1]-s[i-1])-CalcS(p[i+l-1].s-p[i].s));
for(int i=1;i<n;++i)nt[i]=i+1,lt[i+1]=i;
for(int i=1;i<=n;++i)id[i]=i;
sort(&id[1],&id[n+1],cmp);
for(int i=1;i<=n;++i)
{
int u=id[i];tot=0;
for(int j=1,p=lt[u];j<m&&p;++j,p=lt[p])St[++tot]=p;
reverse(&St[1],&St[tot+1]);St[++tot]=u;
for(int j=1,p=nt[u];j<m&&p;++j,p=nt[p])St[++tot]=p;
for(int j=1;j<=tot;++j)s[j]=s[j-1]+p[St[j]].v;
for(int j=1;j+m-1<=tot;++j)
ans=max(ans,CalcV(s[j+m-1]-s[j-1])-CalcS(p[St[j+m-1]].s-p[St[j]].s));
nt[lt[u]]=nt[u];lt[nt[u]]=lt[u];
}
printf("%lld\n",ans);
return 0;
}
【UOJ#386】【UNR#3】鸽子固定器(贪心)的更多相关文章
- UOJ.386.[UNR #3]鸽子固定器(贪心 链表)
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...
- UOJ#386. 【UNR #3】鸽子固定器(链表)
题意 题目链接 为了固定S**p*鸽鸽,whx和zzt来到鸽具商店选购鸽子固定器. 鸽具商店有 nn 个不同大小的固定器,现在可以选择至多 mm 个来固定S**p*鸽鸽.每个固定器有大小 sisi 和 ...
- #386. 【UNR #3】鸽子固定器
#386. [UNR #3]鸽子固定器 题目链接 官方题解 分析: 神奇的做法+链表. 首先按照大小排序. 对于小于选择小于m个物品的时候,这个m个物品一定是一段连续的区间.因为,如果中间空着一个物品 ...
- uoj#386. 【UNR #3】鸽子固定器(乱搞)
传送门 题解 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i ...
- uoj【UNR #3】To Do Tree 【贪心】
题目链接 uojUNR3B 题解 如果不输出方案,是有一个经典的三分做法的 但是要输出方案也是可以贪心的 设\(d[i]\)为\(i\)节点到最深的儿子的距离 贪心选择\(d[i]\)大的即可 #in ...
- 【UOJ386】【UNR #3】鸽子固定器 链表
题目描述 有 \(n\) 个物品,每个物品有两个属性:权值 \(v\) 和大小 \(s\). 你要选出 \(m\) 个物品,使得你选出的物品的权值的和的 \(d_v\) 次方减掉大小的极差的 \(d_ ...
- uoj386 【UNR #3】鸽子固定器
link (似乎很久没写题解了) 题意: n个物品,每个物品有a,b两个值,给定A,B,现在最多选其中m个,要求最大化选出的物品中[b权值和的B次方-a极差的A次方]. $n\leq 2\times ...
- UOJ.311.[UNR#2]积劳成疾(DP)
UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...
- [UOJ386]鸽子固定器
题解 堆+贪心 题意就是给你\(n\)个物品,让你最多选\(m\)个 每个物品有两个属性\(a_i,b_i\) 最大化\((\sum_{a_i})^{dv}+(max(b_i)-min(b_i))^{ ...
随机推荐
- vue-基本动画
不使用动画 <div id="app"> <input type="button" value="toggle" @cli ...
- Flask笔记:RESTful
RESTful是用于前台和后端进行通信的一种规范或者说一种风格,采用的是HTTP和HTTPS协议,数据传输的格式使用的都是JSON,而不是XML.通常,RESTful的URL中只有名词,没有动词,而且 ...
- Java生鲜电商平台-高并发核心技术订单与库存实战
Java生鲜电商平台-高并发核心技术订单与库存实战 一. 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品. 如何保证库存在高并发的场景下是安 ...
- xml的解析(概述)
使用java解析xml☆☆☆ 四个类:分别是针对dom和sax解析使用的类 -dom : DocumentBuilder:解析器类 -这个类是个抽象类,不能new, ...
- Dynamics 365利用HTML页面创建实体记录并同步上传附件
我是微软Dynamcis 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- MySQL执行SQL脚本问题 :错误代码2006、1153
今天用mysql执行了一个60M的SQL脚本遇到了一些错误,经由网上查询如下: 1.#2006 - MySQL server has gone away 出现该错误代码原因如下: 1.应用程序长时间的 ...
- apicloud如何实现优雅的下拉刷新与加载更多
apicloud中提供下拉刷新监听事件api,也提供滚动到底部事件的监听,能够实现下拉刷新和滚动到底部加载更多功能,但是我们真的就满足实现功能了吗?将两个代码拼凑起来运行看看发现了什么?是的,在滚动到 ...
- CentOS7使用docker搭建Solo博客
一.获取最新镜像 docker pull b3log/solo 二.启动容器 使用 MySQL 先手动建库(库名 solo,字符集使用 utf8mb4,排序规则 utf8mb4_general_ci) ...
- 使用vue-video-player插件实现视频播放
来自于https://blog.csdn.net/abelethan/article/details/89016678博客 1下载插件==>npm install vue-video-playe ...
- strcpy&memcpy&memmove
strcpy extern char *strcpy(char *dest,char *source); { assert((dest!=NULL)&&(source!=NULL)); ...