题解

堆+贪心

题意就是给你\(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 ;
}

[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. 【UOJ386】【UNR #3】鸽子固定器 链表

    题目描述 有 \(n\) 个物品,每个物品有两个属性:权值 \(v\) 和大小 \(s\). 你要选出 \(m\) 个物品,使得你选出的物品的权值的和的 \(d_v\) 次方减掉大小的极差的 \(d_ ...

  5. uoj386 【UNR #3】鸽子固定器

    link (似乎很久没写题解了) 题意: n个物品,每个物品有a,b两个值,给定A,B,现在最多选其中m个,要求最大化选出的物品中[b权值和的B次方-a极差的A次方]. $n\leq 2\times ...

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

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

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

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

  8. UNR#3 Day1——[ 堆+ST表+复杂度分析 ][ 结论 ][ 线段树合并 ]

    地址:http://uoj.ac/contest/45 第一题是鸽子固定器. 只会10分.按 s 从小到大排序,然后 dp[ i ][ j ][ k ] 表示前 i 个元素.已经选了 j 个.最小值所 ...

  9. 经典灰鸽子lcx

    方法1路由配置 在路由器配置 进入虚拟服务器 填入ip 端口 就可以了方法2内网域名解析想以前的花生客 科迈都有这项免费业务但现在基本不提供了如果那个网站还有内网解析的功能 大家一定要发上来哦方法3p ...

随机推荐

  1. IOS开发 ios7适配

    ios7控制器试图默认为全屏显示,导航栏的不同设置会产生不同的效果. 首先判断系统的的版本,区别: if (floor(NSFoundationVersionNumber) <= NSFound ...

  2. 【网络】TCP协议

    一.概述 主要特点: 1)面向连接的运输层协议 2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一) 3)TCP提供可靠交付的服务 4)TCP提供全双工通信 5)面向字节流:T ...

  3. 移动端CSS小结

    Meta 标签 <meta name="viewport"  content="width=device-width, user-scalable=no, init ...

  4. Markdown 语法和代码高亮

    安装 Python Markdown 安装命令 pip install markdown 视图中渲染 Markdown blog/views.py import markdown from djang ...

  5. Java 实现桥接(Bridge)模式

    类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamp3d21scDQ1Ng==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  6. POJ1195 Mobile phones 【二维树状数组】

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14288   Accepted: 6642 De ...

  7. cmd下复制粘贴

    cmd下复制粘贴的快捷操作方式 工具/原料 系统cmd 步骤/方法 1 如右图,右键命令提示符窗口的标题栏,选择属性. 2 选择“编辑选项”里的“快速编辑模式”,并确定之: 3 在弹出的应用选择提示框 ...

  8. 【iOS系列】-触摸事件与手势识别

    [iOS系列]-触摸事件与手势识别 第一:触摸事件 一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 UIEvent:称为事件对象,记录事件产生的时刻和类型 两根手指同时触摸一个view ...

  9. shell 读写远程数据库

    http://www.cnblogs.com/wangkangluo1/archive/2012/04/27/2472898.html 利用Shell脚本实现远程MySQL自动查询 目的:对定时任务对 ...

  10. (5)在tomcat运行自己的javaweb项目

    A:在MyEclipse下方的Servers栏中启动服务器,运行项目: 1,选中项目所在的tomcat服务器 2,点击“启动按钮”,见下图 3,启动以后,看控制台输出日志: B:从服务器按钮启动: 1 ...