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} ... 
随机推荐
- [西安交大附中集训] d6 删边(cip)
			B. 删边(cip.cpp/in/out 1S/256M) 题面 给出一个没有重边和自环的无向图,现在要求删除其中两条边,使得图仍然保持连通. 你的任务是计算有多少组不合法的选边方案.注意方案是无序二 ... 
- Nginx 当上游服务器返回失败时的处理办法
			陶辉95课 Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 ... 
- nginx POSTREAD阶段模块
			L:50 Realip模块 需要将--with-http_realip_model 编译进Nginx 因为nginx有可能有反向代理 获取到的客户端ip就不是原用户IP了 X-Forwarded-Fo ... 
- Spring 使用介绍(十三)—— Bean的生命周期
			一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ... 
- Spring模块介绍
			GroupId ArtifactId 说明 org.springframework spring-beans Beans 支持,包含 Groovy org.springframework spring ... 
- IDEA添加配置文件到classpath
			突然发现有一种简单的办法: IDEA 的 Mark Directory as 右键项目中的一个文件夹,会出现目录[Mark Directory as]选择[Resources Root] 实现下面原文 ... 
- 洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)
			洛谷题目传送门 \(O(n)\)算法来啦! 复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧. 首先数组倍长是一样的.倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\ ... 
- Android里透明的ListView
			发现了一个list滚动时,某item背景透明的问题.网上搜索一下,发现有很多人在问list背景黑色的问题,交流中给出的解决方案基本上很统一. 先是解释问题产生的原因是Android对list的滚动做了 ... 
- rt-thread之 for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++) 理解
			@2019-01-30 [小记] 利用宏 INIT_EXPORT() --- __attribute__() 将函数重新放置在自定义段,执行时去该段获取函数地址 RT-Thread 的 INIT_BO ... 
- luogu4093 序列 (cdq分治优化dp)
			设f[i]是以i位置为结尾的最长满足条件子序列的长度 那么j能转移到i的条件是,$j<i , max[j]<=a[i] , a[j]<=min[i]$,其中max和min表示这个位置 ... 
