当前位置: 首页 > news >正文

【NOIP模拟赛】就 反悔贪心

biubiu~~~

这道题,考场上上来就dp然后发现怎么优化也不行.............最后发现是贪心.............

正解:带反悔的贪心,原理是,假设我们现在得到了取i个的最优解那么我们取i+1个的时候要么是新取一个要么把原来取过的点取反(间隙与所选)。我们把所有点从大到小选,这个过程用堆维护,一开始所有的点都是可选的,那么我们取了一个点他前一个后一个都不能再选,那么我们把它们都从堆里取出来,记录答案,同时放进去一个新点,是由这三个点融合的,值为val[i-1]+val[i+1]-val[i]为取反的价值,然后一直取最大取k次就可以了。为什么可以呢:对于一个先取出来的点他左右两点都还没有被取到,因此他如果后来不选了当且仅当同时选其两边的点;这样的话我们满足每次都是在取当前次数下的最大值,这样我们堆里的点的形态大概都是 1 1 1 101 10101 1010101 1 1 1 (1表示没选,0表示选了)。

巨坑:不要错选两边的点,我们只要选了边上的点那么他一定不会被改掉,我们就把他设为inf就当做死人算了,至于为什么会错选呢:我们要选了两边的点,那么我们就会用他的值减去他里面的点的值,然后放进去,我们考虑一下我们就算是选的把点取反那也是选的点数+1的,那我们刚才那个操作是什么鬼?我们要是这么搞就有可能出现以减少所选的点的个数来换取价值的情况。

STL:对于multiset我们删除find到的指针只会删除一个然而我们find到的是我们找到的第一个数。

#pragma G++ optimize("O3")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#define MAXN 100010
inline void read(long long &sum){
  register char ch=getchar();
  for(sum=0;ch<'0'||ch>'9';ch=getchar());
  for(;ch>='0'&&ch<='9';sum=(sum<<1)+(sum<<3)+ch-'0',ch=getchar());
}
struct Via{
  long long val;
  long long l,r;
  inline friend bool operator < (Via a,Via b){
    return a.val!=b.val?a.val>b.val:a.r<b.r;
  } 
}p[MAXN];
std::set<Via> Set;
long long n,k;
long long ans;
int main(){
  read(n),read(k);
  for(long long i=1,a;i<=n;i++){
    read(a);
    p[i]=(Via){a,i,i};
    Set.insert(p[i]);
  }
  while(k--){
    Via x=*Set.begin();
    Set.erase(Set.find(x));
    long long l=x.l,r=x.r,val=-x.val;
    ans+=x.val;
    if(x.l!=1)
      Set.erase(Set.find(p[x.l-1])),val+=p[x.l-1].val,l=p[x.l-1].l;
    else val-=0x7f7f7f7f;
    if(x.r!=n)
      Set.erase(Set.find(p[x.r+1])),val+=p[x.r+1].val,r=p[x.r+1].r;
    else val-=0x7f7f7f7f;
    x.l=l,x.r=r,x.val=val;
    for(long long i=l;i<=r;i++)p[i]=x;
    Set.insert(x);
  }
  printf("%lld",ans);
}

 

转载于:https://www.cnblogs.com/TSHugh/p/7301573.html

相关文章:

  • 深度解析数据分析、大数据工程师和数据科学家的区别
  • Make Palindrome UVA - 10453
  • 大数据行业发展的九大痛点(个人观点)
  • 【设计模式】 状态模式
  • IT技术人员转行大数据应该考虑哪些问题
  • 日常(关于机房卫生???)
  • 两矩阵相乘的秩的性质_浅析数学中的行列式与矩阵
  • (Python) SOAP Web Service (HTTP POST)
  • 苹果新款笔记本_谷歌发布售价99美元的新款Wi-Fi路由器(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...
  • 使用IDEA从github中下载fastdfs-client-java
  • 苹果7手机严重卡顿_iPhone12 实测 5G 网络耗电更快丨苹果官方壳存在严重问题|iphone12|手机壳|续航|蜂窝...
  • [luoguP1666] 前缀单词(DP)
  • JZOJ 8.10 B组总结
  • android oboe 混音_Android之AppBarLayout实现悬停吸附伸缩效果
  • 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍...
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • Angular6错误 Service: No provider for Renderer2
  • Angularjs之国际化
  • ECS应用管理最佳实践
  • github从入门到放弃(1)
  • Java IO学习笔记一
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript DOM 10 - 滚动
  • Mocha测试初探
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • windows下如何用phpstorm同步测试服务器
  • 浮现式设计
  • 关于Java中分层中遇到的一些问题
  • 排序算法之--选择排序
  • 深入 Nginx 之配置篇
  • Hibernate主键生成策略及选择
  • PostgreSQL之连接数修改
  • 关于Android全面屏虚拟导航栏的适配总结
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (C语言)共用体union的用法举例
  • (三分钟)速览传统边缘检测算子
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (算法)N皇后问题
  • (算法)求1到1亿间的质数或素数
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)项目管理杂谈-我所期望的新人
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 依赖注入和配置系统
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • @Bean有哪些属性
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [HXPCTF 2021]includer‘s revenge
  • [IE编程] 如何编程清除IE缓存
  • [lesson17]对象的构造(上)
  • [linux] Key is stored in legacy trusted.gpg keyring