题目描述

一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)

输入格式

第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai、bi

输出格式

一个整数,表示最少有几个人说谎

输入输出样例

输入 #1复制

3
2 0
0 2
2 2
输出 #1复制

1

说明/提示

100%的数据满足: 1≤n≤100000 0≤ai、bi≤n

思路:

转变题意:题目中的 ai bi 表示从1+ai 到 n-bi排名区间内的同学的分数相同,且与不属于该区间的同学分数一定不同。

考虑补集思想:最少说假话人数=总人数-最多说真话人数

而又显然:如果两个区间相交但不重合,则发生冲突。

比如一个人说第三名和第四名的成绩相同,另一个说第四名和第五名成绩相同,则必然有一个人说了假话

考虑给区间赋上权值:一个区间的权值=本质相同的区间总数,且最大为区间长度。

比如有五个人都说自己的排名是第三到第五名,则至多三个同学说真话。

于是题目就变成了一个区间覆盖问题qvq 求权值最大且互不相交的区间覆盖

DP即可。注意和【今年暑假不AC】不同,由于区间带权,不能直接贪心(爆零警告)

先以右端点为第一关键字,左端点为第二关键字排序。

定义DP [ i ] 表示右端点覆盖到 i 的合法方式最大权值。

dp[ r [ i ] ] = max (dp [ l [ i ] ] + w[ i ],dp [ r [ i ] ] ) ;

dp[ i ] = max ( dp [ i - 1 ] , dp [ i ] ) ;

值得一提的是第二个转移必须要在 i 之前的①转移都已完成(也即i<=当前右端点)。注意转移顺序,具体见代码(貌似又写丑了orz)

时间复杂度O(nlogn)

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std; const int maxn=; int dp[maxn];
struct node{
int l,r,w;
}a[maxn]; inline bool cmp(node a,node b) {
if (a.r==b.r) return a.l<b.l;
return a.r<b.r;
} inline void init(int n) {
int cnt_l=,cnt_r=,cnt_val=;
for (int i=;i<=n;i++) {
int now_l=a[i].l,now_r=a[i].r;
if (now_l!=cnt_l || now_r!=cnt_r) {
cnt_val=;
cnt_l=now_l,cnt_r=now_r;
}
cnt_val++;
a[i].w=min(cnt_val,now_r-now_l+);
}
} int main() {
int n;
scanf("%d",&n);
for (int i=;i<=n;i++) {
int x,y;
scanf("%d%d",&x,&y);
a[i].l=x+,a[i].r=n-y;
}
sort(a+,a+n+,cmp);
init(n);
int cnt=;
for (int i=;i<=n;i++) {
if (a[i].r<a[i].l) continue;
if (a[i].r>cnt) {
for (int j=cnt+;j<=a[i].r;j++) dp[j]=max(dp[j],dp[j-]);
cnt=a[i].r;
}
int l=a[i].l,r=a[i].r;
dp[r]=max(dp[r],dp[l-]+a[i].w);
}
if (n>cnt) for (int i=cnt+;i<=n;i++) dp[i]=max(dp[i],dp[i-]);
cout << n-dp[n];
}

清北学堂例题 LUOGU2519 【HAOI2011】PROBLEM A的更多相关文章

  1. 清北学堂例题 LUOGU2523【HAOI2011】problem c

    题目描述 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1 ...

  2. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  3. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  4. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  5. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

  6. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  7. AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)

    P4746 C’s problem(c)   时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...

  8. 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)

    P4746 C's problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差 ...

  9. 清北学堂入学测试P4751 H’s problem(h)

    P4751 H’s problem(h)  时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...

随机推荐

  1. php基础 php 全局变量

    $_GET ----->get传送方式 $_POST ----->post传送方式 $_REQUEST ----->可以接收到get和post两种方式的值 $GLOBALS ---- ...

  2. Flask - 底层原理和基本流程

    一. flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi 1. werkzeug示例 from werkzeug.wrappers ...

  3. 理解错误的 Arrays.asList()

    简介 Arrays.asList() 作用是将一个数组转换为一个List 集合. String[] myArray = { "Apple", "Banana", ...

  4. Windows对应的"Hello,world"程序

    <Windows程序设计>(第五版)(美Charles Petzold著) https://docs.microsoft.com/zh-cn/windows/desktop/apiinde ...

  5. Jquery 分页案例

    Jquery    分页案例 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /& ...

  6. 解题报告:luogu P1196 [NOI2002]银河英雄传说

    由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...

  7. Linux 允许root用户远程登陆

    首先确保ssh服务已经安装: ps -e | grep ssh or service ssh start 如果没有安装则: apt-get install ssh 安装完之后 查看 /etc/ssh/ ...

  8. Python 基础之递归 递归函数 尾递归 斐波那契

    1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n):    print(n)    if n > 0:        digui(n- ...

  9. Python 基础之模块之os os.path 及os与shutil对比

    一: os 对系统进行操作 #注:以下操作都在linux环境下操作,且很多运行之前需要做好相关条件import os#(1)system() 在python总执行系统命令#os.system(&quo ...

  10. python神器-pycharm安装与使用(全网最新)

      pycharm分为社区版(免费)和专业版(收费/破解),以下安装仅适用于社区版 下载方式1: 官网下载:https://www.jetbrains.com/pycharm/download/dow ...