BZOJ2298 [HAOI2011]problem a 【dp】
题目
一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)
输入格式
第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai、bi
输出格式
一个整数,表示最少有几个人说谎
输入样例
3
2 0
0 2
2 2
输出样例
1
提示
100%的数据满足: 1≤n≤100000 0≤ai、bi≤n
题解
一个人的话意思就是自己的分数排名在区间\([a_i + 1,n - b_i]\)之间,且这个区间内的分数都相等
那么我们现在有\(n\)个这样的区间
先去掉那些\(l > r\)的区间
由于相等的区间具有相同的真假性,我们可以合并
相交的区间不能共存,问题就转化为了选若干个带权区间不相交的最大值
按\(r\)排序,设\(f[i]\)为第\(i\)个区间为止的最大答案
我们只需找到最大的\(j<i\)使得\(r_j <l_i\),那么
\]
可以二分查找
\(n - f[m]\)就是答案
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 100005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
struct inter{
int l,r,v;
}e[maxn];
inline bool operator <(const inter& a,const inter& b){
return a.l == b.l ? a.r < b.r : a.l < b.l;
}
inline bool cmp(const inter& a,const inter& b){
return a.r == b.r ? a.l < b.l : a.r < b.r;
}
int n,tot,f[maxn];
int find(int l,int r,int x){
int mid;
while (l < r){
mid = l + r + 1 >> 1;
if (e[mid].r < x) l = mid;
else r = mid - 1;
}
return l;
}
int main(){
int tn;
tn = n = read();
REP(i,n){
e[i].l = read() + 1;
e[i].r = n - read();
e[i].v = 1;
}
tot = 0;
for (int i = 1; i <= n; i++)
if (e[i].l <= e[i].r) e[++tot] = e[i];
n = tot;
sort(e + 1,e + 1 + n);
tot = 1;
for (int i = 2; i <= n; i++)
if (e[i].l == e[tot].l && e[i].r == e[tot].r)
e[tot].v++;
else e[++tot] = e[i];
REP(i,tot) e[i].v = min(e[i].v,e[i].r - e[i].l + 1);
sort(e + 1,e + 1 + tot,cmp);
f[1] = e[1].v;
for (int i = 2; i <= tot; i++){
int pre = find(0,i - 1,e[i].l);
f[i] = max(f[i - 1],f[pre] + e[i].v);
}
printf("%d\n",tn - f[tot]);
return 0;
}
BZOJ2298 [HAOI2011]problem a 【dp】的更多相关文章
- BZOJ2302 [HAOI2011]Problem c 【dp】
题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...
- BZOJ 2298: [HAOI2011]problem a【动态规划】
Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 【dp】D. Caesar's Legions
https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/D [题意]给定n1个A,n2个B,排成一排,要求A最多能连续k1个紧挨着,B最多 ...
- 【dp】codeforces C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C [题意] 给定一个自然数序列,在这个序列中找出几个不相交段,使得每个段的异或值之和相加最大. 段的异或值这样定义 ...
随机推荐
- 变量和数据类型&运算符
变量和数据类型&运算符 变量 变量的作用:用来存储数据 变量命名的规范:字(字符串)下(_下划线)美($)人(¥) 数 (可以包括数字)骆驼 有意义(可以以字母,下划线,美元符号,人民币符号开 ...
- 用fmt标签对EL表达式取整
本篇文章转载自:https://blog.csdn.net/u013400939/article/details/47948541 一般来说我们是无法实现EL表达式取整的.对于EL表达式的除法而言,他 ...
- oracle中print_table存储过程实例介绍
oracle中pro_print_table存储过程实例介绍 存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.这 ...
- 2d游戏中的射线与矩形检测碰撞
cc.exports.LineCollideRect(startLine,endLine,rect)--向量与矩形检测碰撞 --获取矩形的四个顶点位置 local p = {cc.p(rect.x,r ...
- runtime比较全面的总结
类和对象 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者 ...
- C++简易酒店管理系统,实现(查询、入住、退房、楼层选择、退出)功能
#include <iostream> #include <string.h> #include <stdlib.h> void enter(); void che ...
- VNC远程登录端使用经验之一
1.vnc/xmanager都是经常用的远程登录软件.vnc有个缺点就是他的进程不会自动退出比如如果开了PID1再去开PID2...PIDn.那么前面的PIDn-1个进程就会一直运行如果不手动kill ...
- MySQL如何复制一个表
MySQL如何复制一个表 1 复制 employee 表 => employee2 () create table employee2 like employee () insert into ...
- python面试题之什么是lambda函数?
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用l ...
- gdb调试时查看内存
x/<n/f/u> <addr> n.f.u是可选的参数,<addr>表示一个内存地址 1) n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地 ...