Luogu P2519 [HAOI2011]problem a
\(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的更多相关文章
- [luogu] P2519 [HAOI2011]problem a (贪心)
P2519 [HAOI2011]problem a 题目描述 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同 ...
- Luogu P2522 [HAOI2011]Problem b
如果你做过[Luogu P3455 POI2007]ZAP-Queries就很好办了,我们发现那一题求的是\(\sum_{i=1}^a\sum_{j=1}^b[\gcd(i,j)=d]\),就是这道题 ...
- 【题解】Luogu P2522 [HAOI2011]Problem b
原题传送门 这题需要运用莫比乌斯反演(懵逼钨丝繁衍) 我们看题面,让求对于区间\([a,b]\)内的整数x和\([c,d]\)内的y,满足$ gcd(x,y)=k$的数对的个数 我们珂以跟容斥原理(二 ...
- P2519 [HAOI2011]problem a
思路 神仙思路,就差一步就能想出来了... 看到第i个人给出的条件,发现有\(a_i\)个大于,\(b_i\)个小于并不好处理 考虑把条件转化成第i个人对应的排名处理,设第i个人的排名为\(a_i+1 ...
- 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 ...
- 洛谷 P2519 [HAOI2011]problem a
传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...
- luogu 2519 [HAOI2011]problem a 动态规划+树状数组
发现每一次 $[b[i]+1,n-a[i]]$ 这个区间的分数必须相同,否则不合法. 而一个相同的区间 $[l,r]$ 最多只能出现区间长度次. 于是,就得到了一个 $dp:$ 将每一种区间的出现次数 ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
- 洛谷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} ...
随机推荐
- 将数组Arrays转成集合List
String[] split = pids.split("-"); //将数组split转成集合 List<String> asList = Arrays.asList ...
- 源码分析: 图片加载框架Picasso源码分析
使用: Picasso.with(this) .load("http://imgstore.cdn.sogou.com/app/a/100540002/467502.jpg") . ...
- linux下如何安装mysql和redis
linux下如何安装mysql(mariadb) linux下如何安装软件? 1. yum安装软件也得注意,一个是配置yum源 1.我们当前的是阿里云的yum源(下载速度特别快) 通过 yum ins ...
- P1055 书号
P1055 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字.11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号 ...
- Android 下载App
转载:http://blog.csdn.net/aicpzl/article/details/52993074 通过DownloadManager来下载APK到本地,下载完成后收到广播再安装APK,可 ...
- 洛谷P4281 紧急集合 / 聚会
LCA 题目要求找离三个点最近的点,我们先看两个点的情况,自然是找LCA,那么三个点的时候是否与LCA有关呢? 显然,离三个点最近的点一定是在这三个点联通的简单路径上. 可以简单证明一下,假设某个点离 ...
- 【XSY2519】神经元 prufer序列 DP
题目描述 有\(n\)点,每个点有度数限制,\(\forall i(1\leq i\leq n)\),让你选出\(i\)个点,再构造一棵生成树,要求每个点的度数不超过度数限制.问你有多少种方案. \( ...
- 启发式合并&线段树合并/分裂&treap合并&splay合并
启发式合并 有\(n\)个集合,每次让你合并两个集合,或询问一个集合中是否存在某个元素. 我们可以用平衡树/set维护集合. 对于合并两个\(A,B\),如果\(|A|<|B|\),那么 ...
- Hdoj 2188.悼念512汶川大地震遇难同胞——选拔志愿者 题解
Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人员,以及进行心理疏导的心理 ...
- Android 播放Gif 动画
在Android 中是不支持直接使用Gif 图片关联播放帧动画,如下动画在Android 中是无法播放的: Android 提供了另外一种解决的办法,就是使用AnimationDrawable 这一函 ...