题解

堆+贪心
题意就是给你\(n\)个物品,让你最多选\(m\)个
每个物品有两个属性\(a_i,b_i\)
最大化\((\sum_{a_i})^{dv}+(max(b_i)-min(b_i))^{ds}\)
首先后面的那个东西看着不是很舒服
但是按照\(b\)为关键字排个序就可以消除\(b\)的影响了
那么我们只考虑\(a\)即可
以后我们可以发现答案所选择的物品一定是一个区间内最大的\(k\)个物品
所以我们可以固定一个右端点
然后不断向左扫去找前\(k\)大的值
这个东西可以用一个小根堆来实现
一旦右端点被弹出就结束寻找
这个复杂度是\(O(n^2)\)
可以在找最大值时用\(ST\)表+二分做到\(O(nlognlogm)\)
这个复杂度应该就可以卡着过了
当然我们可以对于每个位置处理出ta前面离ta最近的比ta大的值的位置
这样就省去了\(ST\)表+二分
复杂度变成了\(O(nlogn)\)
但是由于两个\(log\)直接跑过去了我就懒得写一个\(log\)的了

代码

#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
# define LL long long
const int M = 200005 ;
const int N = 20 ;
using namespace std ;inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ;  }return x*w ;
} int n , m , ds , dv ;
int lg[M] , sz[M] , val[M] , st[M][N] ;
LL ans , sum ;
struct Node { int sz , val ; } p[M] ;
struct Pion { int idx , val ; } ;
inline bool operator < (Pion a , Pion b) {return a.val > b.val ;
}
inline bool operator < (Node a , Node b) {return a.sz < b.sz ;
}
priority_queue < Pion > q ;inline int query(int l , int r) {int j = lg[r - l + 1] ;return max( st[l][j] , st[r - (1 << j) + 1][j] ) ;
}
inline LL dc(LL sum , int x) {if(x == 1) return sum ;return 1LL * sum * sum ;
}inline int Getpos(int rp) {int l = 1 , r = rp , ret = -1 , mid ;while(l <= r) {mid = (l + r) >> 1 ;if(query(rp - mid + 1 , rp) > q.top().val) ret = rp - mid + 1 , r = mid - 1 ;else l = mid + 1 ;}return ret ;
}
int main() {n = read() ; m = read() ; ds = read() ; dv = read() ;for(int i = 2 ; i <= n ; i ++) lg[i] = lg[i >> 1] + 1 ;for(int i = 1 ; i <= n ; i ++) p[i].sz = read() , p[i].val = read() ;sort(p + 1 , p + n + 1) ;for(int i = 1 ; i <= n ; i ++) {sz[i] = p[i].sz , val[i] = p[i].val ;st[i][0] = val[i] ;}for(int j = 1 ; j <= lg[n] ; j ++)for(int i = 1 ; i + (1 << j) - 1 <= n ; i ++)st[i][j] = max( st[i][j - 1] , st[i + (1 << (j - 1))][j - 1] ) ;for(int i = 1 , pos ; i <= n ; i ++) {sum = 0 ;while(!q.empty()) q.pop() ;for(int j = i ; j >= i - m + 1 && j >= 1  ; j --) {q.push((Pion) { j , val[j] }) ;sum += val[j] ;ans = max( ans , dc(sum , dv) - dc(sz[i] - sz[j] , ds) ) ;}pos = i - m + 1 ; if(pos <= 1) continue ;bool exist = true ;while(exist) {if(q.top().idx == i) break ;pos = Getpos(pos - 1) ; if(pos < 0) break ;sum += val[pos] - q.top().val ;ans = max( ans , dc(sum , dv) - dc(sz[i] - sz[pos] , ds) ) ;q.pop() ; q.push((Pion) { pos , val[pos] }) ;}}printf("%lld\n",ans) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/10697546.html

[UOJ386]鸽子固定器相关推荐

  1. #386. 【UNR #3】鸽子固定器

    #386. [UNR #3]鸽子固定器 题目链接 官方题解 分析: 神奇的做法+链表. 首先按照大小排序. 对于小于选择小于m个物品的时候,这个m个物品一定是一段连续的区间.因为,如果中间空着一个物品 ...

  2. UOJ#386. 【UNR #3】鸽子固定器(链表)

    题意 题目链接 为了固定S**p*鸽鸽,whx和zzt来到鸽具商店选购鸽子固定器. 鸽具商店有 nn 个不同大小的固定器,现在可以选择至多 mm 个来固定S**p*鸽鸽.每个固定器有大小 sisi 和 ...

  3. 【UOJ#386】【UNR#3】鸽子固定器(贪心)

    [UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...

  4. UOJ.386.[UNR #3]鸽子固定器(贪心 链表)

    题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...

  5. uoj#386. 【UNR #3】鸽子固定器(乱搞)

    传送门 题解 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i ...

  6. 研究生招生多次被“放鸽子”:给学生几点诚信方面的建议

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:张吴明科学网博客 研究生招生已经数次遇到放鸽子的情况,学生在联 ...

  7. 灰鸽子敢说自己不是病毒?

    用google检索"灰鸽子病毒",检索到约 268,000 项结果:用baidu检索"灰鸽子病毒",找到相关网页约548,000篇.灰鸽子自诞生之日起,就被反病 ...

  8. 酒店用机器学习,预测哪些客人会放鸽子

    来源:HyperAI超神经 本文约1800字,建议阅读6分钟 如今,大数据已经被各行各业所应用,酒店行业也不例外.充分利用大数据,使得酒店能够预测市场需求变化,进行智能化决策分析,改善经营状况.本文为 ...

  9. 研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:知乎,生物学霸,科奖中心 &q ...

  10. 瑞星播报:3月8日需警惕“灰鸽子变种AWM”病毒

    据瑞星全球反病毒监测网介绍,本周六到下周周一有3个病毒需要特别注意. 3月7日有一个病毒特别值得注意,它是:"代理蠕虫变种TH(Worm.Win32.VB.th)"病毒.该病毒是一 ...

最新文章

  1. 在Ubuntu 16.04.5 LTS上升级python的pip版本实录
  2. Python中数字以及算数运算符的相关使用
  3. jenkins+git+maven搭建项目自动化持续集成
  4. 用iframe transform: scale() 缩小后点不到按钮_“打分”或者“打多少分”用英文可以怎样去表达?...
  5. 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。...
  6. Azure手把手系列 3:把IT的钱花在刀刃上
  7. 阿里巴巴Linux开源镜像站 华为Linux开源镜像站 Linux宝塔面板
  8. redhat7下对用户账户的管理
  9. Response.Redirect 产生的“正在中止线程”错误
  10. android上最好的linux终端,如何在带有Termux的Android上使用Linux命令行 | MOS86
  11. 【MVC+MySQL+EntityFramework】查询性能优化笔记
  12. vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式
  13. 在linux下安装Avria(小红伞)
  14. Python 学习笔记——文件对象和操作
  15. MPQ4420HGJ DCDC电源设计
  16. 审批流程jquery进度条
  17. 游戏场景设计探究:冬夏季节光色模型
  18. 太空工程师-脚本-库存整理
  19. Timestamp日期格式转换
  20. HTML表单基本结构

热门文章

  1. OSPF特殊区域的作用
  2. web安全day44:进阶,使用Nmap+Wireshark理解端口扫描
  3. web安全day38:使用Vulhub一键搭建测试靶场
  4. 使用CocosStudioV3.10场景导入Cocos2d-xV3.17.2
  5. 关于数组越界(内存泄漏)的那点事儿(C语言)
  6. KVM详解(五)——KVM虚拟机镜像格式
  7. docker搭建upload-labs
  8. MySql 初步整理
  9. 改变swap分区大小
  10. Oracle Sys和system用户区别