思路

神仙思路,就差一步就能想出来了。。。

看到第i个人给出的条件,发现有\(a_i\)个大于,\(b_i\)个小于并不好处理

考虑把条件转化成第i个人对应的排名处理,设第i个人的排名为\(a_i+1\),则应当有\(n-a_i-b_i\)个和第i个人成绩相同的人

数形结合一下

把第i个人的条件看成是一个区间,区间开头是\(a_i+1\),结尾是\(n-b_i\),表示排名在这段区间中的人成绩相等

当两个人说的区间不重叠的时候,两个人都可以被判为真

这里要注意两个区间可以完全重合(两个人分数一致,说的都是一样的)(我就是没考虑这个)

有两种情况不可行(必然是谎言),一是左端点大于右端点,二是有超过区间长度的人都说了一样的话(这样只有区间长度个人说了真话)

于是给每个区间赋权值表示说这个区间的人数,所以要求的就是选出一些不相交区间使得权值最大(选出的人都说真话)

dp一下

转移方程是\(dp[i]=max(dp[i-1],dp[k]+E[i].val)\),k是最后一个右端点小于i的左端点的区间

k可以二分的找到,所以复杂度是\(O(n\log n)\)

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int n,f[100100],a[100100],b[100100],cnt;
struct Inter{
int s,t,val;
}E[100100];
bool cmp(Inter a,Inter b){
return a.t<b.t||(a.t==b.t&&a.s<b.s);
}
int find(int l,int r,int val){
int midans=0;
while(l<=r){
int mid=(l+r)>>1;
if(E[mid].t<val)
midans=mid,l=mid+1;
else
r=mid-1;
}
return midans;
}
map<pair<int,int> , int> M;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&a[i],&b[i]);
int len=n-a[i]-b[i];
int lx=a[i]+1,rx=lx+len-1;
if(rx>=lx)
M[make_pair(lx,rx)]=min(rx-lx+1,M[make_pair(lx,rx)]+1);
}
for(auto it = M.begin();it!=M.end();it++){
E[++cnt].s=(*it).first.first;
E[cnt].t=(*it).first.second;
E[cnt].val=(*it).second;
}
sort(E+1,E+cnt+1,cmp);
f[1]=E[1].val;
for(int i=2;i<=n;i++)
f[i]=max(f[i-1],f[find(1,i-1,E[i].s)]+E[i].val);
printf("%d\n",n-f[n]);
return 0;
}

P2519 [HAOI2011]problem a的更多相关文章

  1. [luogu] P2519 [HAOI2011]problem a (贪心)

    P2519 [HAOI2011]problem a 题目描述 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同 ...

  2. Luogu P2519 [HAOI2011]problem a

    题目链接 \(Click\) \(Here\) \(DP\)神题.以后要多学习一个,练一练智商. 关键点在于把"有\(a_i\)个人分数比我高,\(b_i\)个人分数比我低"这句话 ...

  3. 洛谷 P2519 [HAOI2011]problem a

    传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...

  4. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  5. bzoj 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...

  6. HAOI2011 problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1047  Solved: 434[Submit][ ...

  7. BZOJ 2298: [HAOI2011]problem a 动态规划

    2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...

  8. BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1007  Solved: 415[Submit][ ...

  9. 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4164  Solved: 1888[Submit] ...

随机推荐

  1. EasyUI表格DataGrid前端分页和后端分页的总结

    Demo简介 Demo使用Java.Servlet为后台代码(数据库已添加数据),前端使用EasyUI框架,后台直接返回JSON数据给页面 1.配置Web.xml文件 <?xml version ...

  2. Qt—MVC架构

    [1]代理应用示例源码 用代码说事,比较靠谱. 代码目录:三个自定义类,重实现QStyledItemDelegate类.main函数应用示例. (1)ComboDelegate.h #ifndef C ...

  3. ubuntu 换源过程中遇到的坑(一):Could not resolve 'mirrors.aliyun.com'

    执行更新数据(sudo apt-get update)提示: Err http://mirrors.aliyun.com trusty Release.gpg Could not resolve 'm ...

  4. django2.0 路由规则

    Django2.0中URL的路由机制 路由是关联url及其处理函数关系的过程.Django的url路由配置在settings.py文件中ROOT_URLCONF变量指定全局路由文件名称. Django ...

  5. git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法

    git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法提交代码流程:1.先提交代码到自己分支上2.切换到devlop拉取代码合并到当前分支3.合并后有变动的推送到自己 ...

  6. Numpy 基本除法运算和模运算

    基本算术运算符+.-和*隐式关联着通用函数add.subtract和multiply 在数组的除法运算中涉及三个通用函数divide.true_divide和floor_division,以及两个对应 ...

  7. 关于DNS 和根证书你了解多少?

    由于最近发生的一些事件,我们(Privacy Today 组织)感到有必要写一篇关于此事的短文.它适用于所有读者,因此它将保持简单 —— 技术细节可能会在稍后的文章发布. 什么是 DNS,为什么它与你 ...

  8. GoldenGate实时投递数据到大数据平台(3)- Apache Flume

    Apache Flume Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合,最后存储到一个中心化数据存储系统中,方便进行数据分析.事实上flume也可 ...

  9. iOS项目之报错笔记

    问题一: linker command failed with exit code 1 (use -vto see invocation) 原因:导入了.m的头文件,导致同时有两个一样的.m文件在编译 ...

  10. QT多线程信号和槽参数传递

    写了一个这样的信号 void caculateReady( QList<QString> adds, QList<double> hotV, QList<double&g ...