题目链接

\(Description\)

选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大。

\(Solution\)

先把物品按s排序就可以直接判断后一项。
我们发现当要判断的区间的长度\(\leq m\)时,区间内的所有数都要选(后一项都确定了)。
当区间长度\(>m\)时,自然是选\(v\)最大的\(m\)个。可以用链表把\(v\)最小的逐个删去。
发现删掉\(x\)的话我们只需要用\(x\)附近\(m\)个数更新答案。因为如果区间更大,也是会在删掉更多数的时候更新答案。
复杂度\(O(nm)\)。

//3226ms    4692kb
#include <cstdio>
#include <cctype>
#include <algorithm>
#define fir first
#define val second
#define mp std::make_pair
#define pr std::pair<int,int>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=2e5+5;int n,m,ds,dv;
LL Ans;
pr A[N];
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
bool cmp(int a,int b){return A[a].val<A[b].val;
}
inline void Update(LL sv,LL ss)
{if(ds) ss*=ss; if(dv) sv*=sv;Ans=std::max(Ans,sv-ss);
}
void Solve1()
{for(int i=1; i<=n; ++i)for(int j=i,sum=0,si=A[i].fir,lim=std::min(i+m-1,n); j<=lim; ++j)sum+=A[j].val, Update(sum,A[j].fir-si);
}
void Solve2()
{static int id[N],L[N],R[N];R[0]=1, L[n+1]=n;for(int i=1; i<=n; ++i) id[i]=i,L[i]=i-1,R[i]=i+1;std::sort(id+1,id+1+n,cmp);for(int i=1,x,l,r,t; i<=n; ++i){x=id[i], l=L[x], r=R[x], t=m-1;int sum=A[x].val;for(; t&&l; --t,l=L[l]) sum+=A[l].val;for(; t&&r<=n; --t,r=R[r]) sum+=A[r].val;if(t) break;//长度<=m l=R[l], r=L[r];while(l<=x&&r<=n)//维护一个长m的**包含x**的区间 Update(sum,A[r].fir-A[l].fir), sum+=A[r=R[r]].val-A[l].val, l=R[l];L[R[x]]=L[x], R[L[x]]=R[x];//为了方便还是先更新再删吧 后面的如果不更新它的答案就不会影响它的区间 }
}int main()
{n=read(),m=read(),ds=read()-1,dv=read()-1;for(int i=1,t; i<=n; ++i) t=read(),A[i]=mp(t,read());std::sort(A+1,A+1+n);Solve1(), Solve2(), printf("%lld\n",Ans);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/9632782.html

UOJ.386.[UNR #3]鸽子固定器(贪心 链表)相关推荐

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

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

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

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

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

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

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

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

  5. UOJ.311.[UNR#2]积劳成疾(DP)

    UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...

  6. UOJ #214 [UNR #1]合唱队形 (概率期望计数、DP、Min-Max容斥)

    9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...

  7. BZOJ 2288 贪心 +链表

    思路: 放个题解好吧. http://www.cnblogs.com/zyfzyf/p/4114774.html //By SiriusRen #include <queue> #incl ...

  8. BZOJ 2288: 【POJ Challenge】生日礼物 优先队列+贪心+链表

    这题看别人题解的 这题说可以转换成数据备份. 这题可以把一段同号的数并成一个数,那么就变成了一个正负交替的序列,然后把头尾的负数去掉. 然后就是把所有的正值都加起来,并统计正数的段数cnt,如cnt& ...

  9. 《大话数据结构》第3章 线性表 3.8.2 单链表的删除

    3.8.2 单链表的删除         现在我们再来看单链表的删除.设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所 ...

最新文章

  1. 【运筹学】线性规划 单纯形法 阶段总结 ( 初始基可行解 | 判定最优解 | 迭代 | 得到最优解 | 全流程详细解析 ) ★
  2. mac bash file密码_Mac系统 | 菜鸟程序员项目模拟数据迁移,会安装Mysql服务端吗
  3. RFID会议签到系统总结(二十一)――服务端的通讯
  4. 计算机程序和系统股票走势分析,证券走势指标匹配分析系统的设计与实现
  5. 自学python能找到工作吗-自学Python好找工作吗?
  6. jsp数据库中文乱码处理
  7. 酒店宾馆wifi无线上网认证,手机认证方式详解
  8. 【MySQL】MySQL安装图解
  9. ecshop 添加会员头像功能
  10. 用百度地图进行搜索周边的建筑,医院,餐厅,学校等。
  11. 校园网GiWiFi模拟登陆
  12. html微课制作软件,炫页网.多彩炫页工具-微课大赛指定HTML5课程制作工具
  13. 带你实现电商商品同款识别算法
  14. 大学学计算机需不需要提前预习,大学怎么预习啊?
  15. OBS直播软件-简介
  16. windows 执行 bat命令问题
  17. 如何构建自己的知识体系
  18. strsplit()函数
  19. Android中获取手机内所有应用信息
  20. 「技术人生」第10篇:如何做研发效能提升(即指标体系建设过程回顾)

热门文章

  1. Eclipse 高亮显示
  2. Android异步下载网络图片(其一:Handler)
  3. 汇编的8种寻址方式,以及2个默认段寄存器
  4. CSS3盒模型display:box详解
  5. DOM操作表格的各种属性[z]
  6. Hadoop Streaming编程实例
  7. android 插件化 模块化开发(apkplug)
  8. etcd分布式之负载均衡
  9. python email模块
  10. scipy的一些函数名