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

p2519 [HAOI2011]problem a

传送门

分析

其实我们可以很巧妙的把这道题转化成一道线段覆盖的问题,怎么转化呢?
对于每一个描述,我们可以根据他所描述的比他高的和比他矮的人数来构造一条线段,左端点l即为y+1,右端点r为n-x。
当我们转化成线段以后,这一段线段就表示着分数相同的人数,那么显然,只有与这个线段完全重合的线段是符合要求的,对于有交集的线段一定是有一个说谎的,但是对于完全重合的线段,还是有可能出现说谎的情况,因为,当完全重合的线段的数量大于这个线段的长度时,就有num-len个人说谎。
这样我们就可以把这个问题转化成一个线段覆盖的问题了,我们只需要求出有多少重合的线段,那么这个线段的权值就是这个数。然后我们再做带权值的线段覆盖就好了。
至于怎么在O(n+n*log(n))的时间内做出来呢:先按照右端点排序,然后从前向后枚举每一个线段,用f数组记录在当前坐标时能取到的最大值:f[a[i].r]=f[a[i].l-1]+a[i].v;
至于为什么是f[a[i].l-1]呢?因为由于这个问题的特殊性,可能会出现[x,x]这种线段,所以为了避免比较麻烦的问题,就这样处理了。再做的时候还需要一直维护着f数组,我们用一个now变量,一直跟着右端点走,总共用O(n)的时间来维护f数组。
代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
    int le,ri;
};
node a[100100];
int dp[100100];
inline bool cmp(const node x,const node y){
    if(x.ri==y.ri)return x.le<y.le;
    return x.ri<y.ri;
}
int main(){
    int n,m=0,i,j,k,maxn=0,wh=0,now=0,x,y;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
      scanf("%d%d",&x,&y);
      if(x+y>=n)wh++;
        else a[++m].le=y+1,a[m].ri=n-x;
    }
    sort(a+1,a+m+1,cmp);
    for(i=1;i<=m;i++){
      int sum=1;
      while(a[i+1].le==a[i].le&&a[i+1].ri==a[i].ri)sum++,i++;
      sum=min(sum,a[i].ri-a[i].le+1);
      dp[a[i].ri]=dp[a[i].le-1]+sum;
      while(now<=a[i].ri)
        maxn=max(dp[now],maxn),dp[now]=maxn,now++;
      if(now==a[i].ri+1)now--;
      if(i!=m&&a[i].ri<a[i+1].le)
        while(now<=a[i+1].le)dp[now]=maxn,now++;
      if(now==a[i+1].le+1)now--;
    }
    cout<<n-maxn;
    return 0;
}

转载于:https://www.cnblogs.com/yzxverygood/p/10353065.html

相关文章:

  • SQL Server 变更数据捕获(CDC)监控表数据
  • java写文件实现换行
  • mount --bind使用方法
  • react 项目中 引入 bootstrap
  • “Usage of API documented as @since 1.8+”报错的解决办法
  • 【Spring系列】spring mvc整合任务调度
  • 【BZOJ2301】Problem B
  • linux 全部卸载python yum 重新安装
  • 【进阶4-4期】Lodash是如何实现深拷贝的
  • 提问的艺术
  • git学习(一) 如何将项目上传到github
  • HTML和CSS第一篇
  • git的基本使用
  • Linux基础命令---显示路由表route
  • TCP的三次握手和四次挥手
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【知识碎片】第三方登录弹窗效果
  • canvas 五子棋游戏
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • magento 货币换算
  • Object.assign方法不能实现深复制
  • Spring Cloud Feign的两种使用姿势
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • ViewService——一种保证客户端与服务端同步的方法
  • 从零搭建Koa2 Server
  • 区块链分支循环
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 用element的upload组件实现多图片上传和压缩
  • 7行Python代码的人脸识别
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #数学建模# 线性规划问题的Matlab求解
  • (¥1011)-(一千零一拾一元整)输出
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)bark-ml
  • (52)只出现一次的数字III
  • (8)STL算法之替换
  • (C语言)字符分类函数
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (二)JAVA使用POI操作excel
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)母版页和相对路径
  • .aanva
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core中的去虚
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 按比例显示图片的缩略图
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 使窗口永不获得焦点
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET开源快速、强大、免费的电子表格组件
  • .NET框架设计—常被忽视的C#设计技巧
  • /usr/bin/env: node: No such file or directory
  • @31省区市高考时间表来了,祝考试成功
  • [codevs 2822] 爱在心中 【tarjan 算法】