题目链接 \(Click\) \(Here\)

\(DP\)神题。以后要多学习一个,练一练智商。

关键点在于把“有\(a_i\)个人分数比我高,\(b_i\)个人分数比我低”这句话转换成“排名为\(a_i+1\),且有\(n-a_i-b_i\)个人和我分数相同“。解决了这一点,问题就解决了一大半,接下来就变成了最大不相交区间集合选择问题。本来我是用最长路写的,不知道为什么出锅了,所以就改用\(DP\)+二分了。

#include <bits/stdc++.h>
using namespace std; const int N = 100010; struct Segment {
int l, r, sz; Segment (int _l = 0, int _r = 0, int _sz = 0) {
l = _l, r = _r, sz = _sz;
} bool operator < (Segment rhs) const {return l == rhs.l ? r < rhs.r : l < rhs.l;}
bool operator == (Segment rhs) const {return l == rhs.l && r == rhs.r;}
} arr[N]; map <Segment, int> mp; int n, a[N], b[N], tot, dp[N], dis[N], vis[N]; bool cmp (Segment lhs, Segment rhs) {return lhs.r == rhs.r ? lhs.l < rhs.l : lhs.r < rhs.r;} int main () {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> b[i];
if (a[i] + b[i] <= n - 1) {
arr[++tot] = Segment (a[i] + 1, n - b[i], n - a[i] - b[i]);
mp[arr[tot]]++;
}
}
sort (arr + 1, arr + 1 + tot);
tot = unique (arr + 1, arr + 1 + tot) - arr - 1;
for (int i = 1; i <= tot; ++i) {
mp[arr[i]] = min (mp[arr[i]], arr[i].sz);
// printf ("Segment %d = [%d, %d]\n", i, arr[i].l, arr[i].r);
}
sort (arr + 1, arr + 1 + tot, cmp);
for (int i = 1; i <= tot; ++i) {
dp[i] = max (dp[i], dp[i - 1]);
int l = 1, r = i;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (arr[mid].r < arr[i].l) {
l = mid;
} else {
r = mid - 1;
}
}
dp[i] = max (dp[i], dp[r] + mp[arr[i]]);
}
cout << n - dp[tot] << endl;
}

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

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

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

  2. Luogu P2522 [HAOI2011]Problem b

    如果你做过[Luogu P3455 POI2007]ZAP-Queries就很好办了,我们发现那一题求的是\(\sum_{i=1}^a\sum_{j=1}^b[\gcd(i,j)=d]\),就是这道题 ...

  3. 【题解】Luogu P2522 [HAOI2011]Problem b

    原题传送门 这题需要运用莫比乌斯反演(懵逼钨丝繁衍) 我们看题面,让求对于区间\([a,b]\)内的整数x和\([c,d]\)内的y,满足$ gcd(x,y)=k$的数对的个数 我们珂以跟容斥原理(二 ...

  4. P2519 [HAOI2011]problem a

    思路 神仙思路,就差一步就能想出来了... 看到第i个人给出的条件,发现有\(a_i\)个大于,\(b_i\)个小于并不好处理 考虑把条件转化成第i个人对应的排名处理,设第i个人的排名为\(a_i+1 ...

  5. Luogu P2522 [HAOI2011]Problem b 莫比乌斯反演

    设$f(d)=\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)==d],\\F(n)=\sum_{n|d}f(d)=\lfloor \frac{N}{n} \rfloor \lflo ...

  6. 洛谷 P2519 [HAOI2011]problem a

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

  7. luogu 2519 [HAOI2011]problem a 动态规划+树状数组

    发现每一次 $[b[i]+1,n-a[i]]$ 这个区间的分数必须相同,否则不合法. 而一个相同的区间 $[l,r]$ 最多只能出现区间长度次. 于是,就得到了一个 $dp:$ 将每一种区间的出现次数 ...

  8. P2522 [HAOI2011]Problem b (莫比乌斯反演)

    题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...

  9. 洛谷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} ...

随机推荐

  1. Java多线程之线程状态转换图

    说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runn ...

  2. python好文章

    http://blog.csdn.net/csdnnews/article/details/78557392

  3. Lodop打印控件设置表格次页偏移

    Lodop打印控件有很好的自动分页功能,超文本table表格一页装不下,自动分到第二页,第三页……通常表格之前还会有一些内容,比如标题,制表人名称日期什么的杂七杂八的东西,这种东西会占用一定的空间,这 ...

  4. linux 依赖解决办法

    在安装软件过程中如果出现依赖不满足,有两种情况: 1:你系统里面没有安装依赖软件,[但是你的软件源里面有这个软件,你只是没有安装], 这种情况很简单,通过 sudo apt-get install - ...

  5. How to recovery compiz

    sudo apt install compizconfig-settings-manager dconf reset -f /org/compiz/ setsid unity dconf list / ...

  6. mybatis,主键返回指的是返回到传入的对象中

  7. SQL审计 Yearning 介绍(SQL审核平台)

    yearning SQL 是一个成熟的SQL审计平台

  8. Sum of Consecutive Prime Numbers POJ - 2739 线性欧拉筛(线性欧拉筛证明)

    题意:给一个数 可以写出多少种  连续素数的合 思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数) 其中:线性筛的证明参考:https://blog.csdn.net ...

  9. Spring03-AOP

    一. AOP介绍 1. Aop介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编 ...

  10. HNOI2019 退役记

    窗外风雨大作. 凌晨两点又被噩梦惊醒,朦胧中看见书桌的灯还亮着. 走近书桌,有一个人正在敲打着键盘,屏幕上是一些似曾相识的东西. 被水浸湿的头发随意地搭在额头上,鼻梁上架着一副眼镜,镜片上全是小水珠, ...