【洛谷2519】[HAOI2011] problem a(动态规划)
大致题意: 一次考试共有\(n\)个人参加,第\(i\)个人说有\(a_i\)个人分数比他高,\(b_i\)个人分数比他低。求最少有几个人说谎。
动态规划
刚看完题目可以说是一头雾水。
仔细想想,可以把每个人的状态转化为一个区间(\([a_i+1,n-b_i]\)),表示这个区间内所有元素都相等。
那么我们要求的就是求出最大的区间数\(Max\),使这些区间两两之间要么重合,要么不相交,然后用\(n\)减去\(Max\)即为答案。
考虑将区间左边界排个序,就变成了一个类似于求最长上升子序列的过程,这可以做到\(O(NlogN)\)。
呃,好像成了一道普及组难度的水题......
代码
#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))
#define ten(x) (((x)<<3)+((x)<<1))
#define N 100000
using namespace std;
int n,cnt=0,cnt_=0,a[N+5],f[N+5];
struct Interval
{
int l,r,v;
Interval(int x=0,int y=0):l(x),r(y){v=1;}
inline friend bool operator < (Interval x,Interval y) {return x.r^y.r?x.r<y.r:x.l<y.l;}
inline friend bool operator == (Interval x,Interval y) {return !(x.l^y.l||x.r^y.r);}
}s[N+5];
class FIO
{
private:
#define Fsize 100000
#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
public:
FIO() {FinNow=FinEnd=Fin;}
inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=ten(x)+(ch&15),isdigit(ch=tc()));x*=f;}
inline void read_char(char &x) {while(isspace(x=tc()));}
inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;}
inline void write(int x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
inline void write_char(char x) {pc(x);}
inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) pc(x[i]);}
inline void end() {fwrite(Fout,1,FoutSize,stdout);}
}F;
inline int find(int x,int len)//二分出一个最大的res使a[res]<x,实现O(logN)转移
{
register int l=0,r=len,mid=l+r+1>>1;
for(;l<r;mid=l+r+1>>1) a[mid]<x?l=mid:r=mid-1;
return l;
}
int main()
{
register int i,j,x,y,res,Max=0;
for(F.read(n),i=1;i<=n;++i) F.read(x),F.read(y),x+y<n&&(s[++cnt_]=Interval(x+1,n-y),0),a[i]=INF;//存储区间,注意将a数组初始化为INF
for(sort(s+1,s+cnt_+1),i=1;i<=cnt_;++i) cnt&&s[cnt]==s[i]?s[cnt].v=min(s[cnt].v+1,s[cnt].r-s[cnt].l+1):s[++cnt]=s[i];//去重
for(i=1;i<=cnt;++i) //枚举区间
{
for(res=find(s[i].l,Max),j=res+1,f[i]=res+s[i].v;j<=f[i];++j) a[j]=min(a[j],s[i].r);
Max=max(Max,f[i]);//更新最大值
}
return F.write(n-Max),F.end(),0;
}
【洛谷2519】[HAOI2011] problem a(动态规划)的更多相关文章
- 洛谷P2522 - [HAOI2011]Problem b
Portal Description 进行\(T(T\leq10^5)\)次询问,每次给出\(x_1,x_2,y_1,y_2\)和\(d\)(均不超过\(10^5\)),求\(\sum_{i=x_1} ...
- 洛谷 P2523 [HAOI2011]Problem c
洛谷1或洛谷2,它们是一样的题目,手动滑稽- 这一题我是想不出来, 但是我想吐槽一下坐我左边的大佬. 大佬做题的时候,只是想了几分钟,拍了拍大腿,干脆的道:"这不是很显然吗!" 然 ...
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...
- 洛谷P2522 [HAOI2011]Problem b (莫比乌斯反演+容斥)
题意:求$\sum_{i=a}^{b}\sum_{j=c}^{d}[gcd(i,j)==k]$(1<=a,b,c,d,k<=50000). 是洛谷P3455 [POI2007]ZAP-Qu ...
- 洛谷P2523 [HAOI2011]Problem c(计数dp)
题面 luogu 题解 首先,显然一个人实际位置只可能大于或等于编号 先考虑无解的情况 对于编号为\(i\),如果确认的人编号在\([i,n]\)中数量大于区间长度,那么就无解 记\(S[i]\)表示 ...
- 洛谷 P2519 [HAOI2011]problem a
传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...
- luogu 2519 [HAOI2011]problem a 动态规划+树状数组
发现每一次 $[b[i]+1,n-a[i]]$ 这个区间的分数必须相同,否则不合法. 而一个相同的区间 $[l,r]$ 最多只能出现区间长度次. 于是,就得到了一个 $dp:$ 将每一种区间的出现次数 ...
- 洛谷 P2522 [HAOI2011]Problem b (莫比乌斯反演+简单容斥)
题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...
- 洛谷$P2523\ [HAOI2011]\ Problem\ c$ $dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 首先港下不合法的情况.设$sum_i$表示$q\geq i$的人数,当且仅当$sum_i>n-i+1$时无解. 欧克然后考虑这题咋做$QwQ$. 一 ...
随机推荐
- [Django笔记] uwsgi + nginx 配置
django 和 nginx 通过 uwsgi 来处理请求,类似于 nginx + php-fpm + php 安装nginx 略 安装配置uwsgi pip install uwsgi 回想php- ...
- OTRS 二次开发笔记
公司使用otrs系统处理业务工单,各种事件流.因为是开源免费系统,因此需要在上面做一些功能补充或定制的二次开发. otrs是什么? OTRS 是一个功能强大的工单系统.完美适用于服务台(Help De ...
- SSM整合文档
SSM整合文档 v2 一. 文件说明 文件名 描述 spring-servlet.xml 配置SpringMvc框架相关 applicationContext.xml 配置Spring容器 sprin ...
- 关于Sumlime和其插件的安装
因为近期就要去实习了,第一次实习,估计又要重新在公司的电脑里面安装Sublime和其插件了,于是现将本地的插件截图看看,顺便写一个教程吧哈哈. 我好像又省了一件事情哈哈,昨天因为懒没有尝试重新弄一次s ...
- NppFTP小插件的使用
大家在Linux系统中配置运行环境时,一定会遇到相关配置文件的修改,虽说在Linux系统中可以使用vi,vim的命令进行文本编辑,但是操作起来还是没有在Windows系统中用的爽,特别是操作大文本量的 ...
- JD孔_20160901
1.买的 “[京东超市]GL格朗 耳温枪/电子体温计/温度计/耳温计EW-2” http://item.jd.com/385507.html 2.
- eslint规则 中文备注
{ "ecmaFeatures": {}, "rules": { "no-alert": 0,//禁止使用alert confirm pro ...
- Python 魔术方法及调用方式
魔术方法 调用方式 解释 __new__(cls [,...]) instance = MyClass(arg1, arg2) __new__ 在创建实例的时候被调用 __init__(self [, ...
- Hadoop InputFormat详解
InputFormat是MapReduce编程模型包括5个可编程组件之一,其余4个是Mapper.Partitioner.Reducer和OutputFormat. 新版Hadoop InputFor ...
- CentOS Linux解决Device eth0 does not seem to be present【转】
在VMware里克隆出来的CentOS Linux,ifconfig...没有看到eth0,然后重启网卡又报下面错误. 故障现象: service network restartShutting do ...