博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2298: [HAOI2011]problem a
阅读量:4707 次
发布时间:2019-06-10

本文共 1216 字,大约阅读时间需要 4 分钟。

2298: [HAOI2011]problem a

分析:

  每个人说的话,可以转化成区间[l,r]的人的排名是一样的,于是就转化成了区间带权覆盖问题。

  f[i]表示到第i个人,的最多有多少人说了真话,n-f[n]为答案。

  对于f[i],如果没有线段以i为右端点,f[i] = f[i-1]。

  如果有的话,那么这些线段可以选或不选,不选f[i]=f[i-1];选,它可以从最近的不想交的地方转移,找到此线段的左端点,然后f[i]=max(f[l]+min(w[l,i],i-l+1));w表示线段的权值,j-l+1,表示这条线段最大的价值。

  

  另一种写法:f[i]表示到第i条线段的最大价值,那么可以二分找到第一个不和这条线段相交的线段,从这里转移。

 

代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define mp(a,b) make_pair(a,b) 8 #define pa pair
9 10 using namespace std;11 12 const int N = 100100;13 14 map < pa, int > w;15 vector < int > q[N];16 int f[N];17 18 inline int read() {19 int x = 0,f = 1;char ch=getchar();20 for (; !isdigit(ch); ch=getchar()) if(ch=='-')f=-1;21 for (; isdigit(ch); ch=getchar()) x=x*10+ch-'0';22 return x*f;23 }24 int main() {25 int n = read();26 for (int i=1; i<=n; ++i) {27 int a = read(),b = read();28 int l = a + 1,r = n - b; // 注意! 29 if (l > r) continue;30 if (w[mp(l,r)] == 0) q[r].push_back(l);31 w[mp(l,r)] ++;32 }33 for (int r=1; r<=n; ++r) {34 f[r] = f[r-1]; // 不选 35 int sz = q[r].size();36 for (int i=0; i

 

转载于:https://www.cnblogs.com/mjtcn/p/9162109.html

你可能感兴趣的文章
使用Siege进行WEB压力测试
查看>>
斑马为什么有条纹?
查看>>
android多层树形结构列表学习笔记
查看>>
Android_去掉EditText控件周围橙色高亮区域
查看>>
《构建之法》第一、二、十六章阅读笔记
查看>>
arrow:让Python的日期与时间变的更好
查看>>
(转)Excel的 OleDb 连接串的格式(连接Excel 2003-2013)
查看>>
Java并发编程
查看>>
Git Stash用法
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
memcached 细究(三)
查看>>
RSA System.Security.Cryptography.CryptographicException
查看>>
webservice整合spring cxf
查看>>
[解题报告] 100 - The 3n + 1 problem
查看>>
Entity Framework 学习高级篇1—改善EF代码的方法(上)
查看>>
Mybatis逆向工程配置文件详细介绍(转)
查看>>
String类的深入学习与理解
查看>>
不把DB放进容器的理由
查看>>
OnePage收集
查看>>