[BZOJ2298]problem a

最少有几个人在说假话可以转化为最多有几个人在说真话

若一个人说的是真话,那么在分数升序排列后有且仅有第bi+1个人到第n-ai个人的分数与第i个人是相同的

所以我们得到结论,若几个人所说的话都是真话,那他们所表示的线段一定是不相交或重合的

且重合的线段个数小于等于线段长度

dp[i]表示到第i个人最多有几个人在说真话

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define fir first
 4 #define sec second
 5 #define maxn 100005
 6 map<int,int>Map[maxn];
 7 map<int,int>::iterator it;
 8 int n,a,b,dp[maxn];
 9 int main(){
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++){
12         scanf("%d%d",&a,&b);
13         if(n-a>b)Map[b][n-a]++;
14     }
15     for(int i=0;i<n;i++){
16         for(it=Map[i].begin();it!=Map[i].end();it++)
17                 dp[it->fir]=max(dp[it->sec],dp[i]+min(it->fir-i,it->sec));
18         if(!dp[i+1])dp[i+1]=dp[i];
19     }
20     printf("%d\n",n-dp[n]);
21     return 0;
22 }

时间: 2024-10-29 22:08:13

[BZOJ2298]problem a的相关文章

[HAOI2011][BZOJ2298] problem a

2298: [HAOI2011]problem a Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 766  Solved: 346[Submit][Status][Discuss] Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数

【BZOJ2298】[HAOI2011]problem a DP

[BZOJ2298][HAOI2011]problem a Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 3 2 0 0 2 2 2 Sample Output 1 HINT 100%的数据满足: 1≤n≤100000   0≤

【bzoj2298】【HAOI2011】【problem a】

2298: [HAOI2011]problem a http://www.lydsy.com/JudgeOnline/problem.php?id=2298 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 696 Solved: 307 [Submit][Status][Discuss] Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数)

bzoj2298 [HAOI2011]problem a

Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 3 2 0 0 2 2 2 Sample Output 1 HINT 100%的数据满足: 1≤n≤100000   0≤ai.bi≤n 正解:$dp$+树状数组优化. 对于每一个人

【bzoj2298】【HAOI2011】【problem a】【dp】

Description 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 3 2 0 0 2 2 2 Sample Output 1 HINT 100%的数据满足: 1≤n≤100000 0≤ai.bi≤n 思路:其实我们可以很巧妙的把这道题转化

[BZOJ2298] [HAOI2011] problem a (dp)

Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 3 2 0 0 2 2 2 Sample Output 1 HINT 100%的数据满足: 1≤n≤100000   0≤ai.bi≤n Source Solution a个人在他前

【BZOJ2298】【HAOI2011】problem a 动态规划

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44979323"); } 题解: 一句话 (a,b) 可以理解成一个线段 (a,n?b] . 然后排个序去下重,最后一个线段的权值 x 就是表示 这 x 人互不冲突,一起算. 然后动态规划求若干条不相交线段的权值最大值,最后用总人数减

A Math Problem

A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 237    Accepted Submission(s): 117 Problem Description You are given a positive integer n, please count how many positive integers

Water Problem

water problem 发布时间: 2015年10月10日 15:34   时间限制: 1000ms   内存限制: 256M 描述 题意很简单 给你N个数, Q个查询 每次查询给你一个区间[L, R] 你要找出 [L, R] 这个区间里面取模M后的最大值. 输入 第一行一个T,表示测试数据组数.第二行两个整数N, M (1<=N<=10^5, 1<=M<=10^9).第三行给你N个整数 整数范围在1到10^9之间.第四行给你一个整数Q. ( 1<=Q<=10^5)