题目描述

一次考试共有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. idea激活,使用破解补丁无需注册码

    idea激活,使用破解补丁无需注册码 2017年08月19日 10:57:54 标签: idea / 破解 / 补丁 / 软件 / 13891 编辑 删除 idea激活,JetBrain旗下软件激活 ...

  2. word2vec 构建中文词向量

    词向量作为文本的基本结构——词的模型,以其优越的性能,受到自然语言处理领域研究人员的青睐.良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,本文 ...

  3. Python 文件和目录操作学习

    文件与文件路径 文件有两个关键属性:文件名和路径. 路径指明了文件在计算机上的位置. 文件名中,最后一个句点之后的部分称为文件的"扩展名",它指出了文件的类型 目录也叫文件夹,文件 ...

  4. 8个问题全面了解5G关键技术Massive MIMO

    1 什么是Massive MIMO Massive MIMO(大规模天线技术,亦称为Large Scale MIMO)是第五代移动通信(5G)中提高系统容量和频谱利用率的关键技术.它最早由美国贝尔实验 ...

  5. uniapp - 导航切换(样式)

    <view class="text-area" v-for="(menu,i) in menus" :key="i" v-show=& ...

  6. C++11 — lambda表达式(匿名函数)

    C++11中lambda表达式的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } 其中 [] 内为外部变量的传递方式: [] ...

  7. yolo系列目标检测+自标注数据集进行目标识别

    1. yolov1的识别原理 参考:https://blog.csdn.net/u010712012/article/details/85116365 https://blog.csdn.net/gb ...

  8. linux命令系列-mv(移动-重命名)

    #常用命令选项 默认覆盖 -n 不覆盖 -i 交互 -f 不交互直接覆盖 -u 只移动新的文件 -v 显示详细信息 #移动覆盖3个文件到/tmp目录 mv a.txt b.txt c.txt /tmp ...

  9. 洗牌函数[打乱数组的顺序] slice()的新运用 [原来arr.slice(start, end) 的start不是必需的]

    function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } functio ...

  10. 「NOIP2009」Hankson的趣味题

    题目描述 (由于本题是数论题,所以我只把题目大意说一下...) 输入时给定\(a_0,a_1,b_0,b_1\),题目要求你求出满足如下条件的\(x\)的个数: \[\begin{cases}\gcd ...