题目链接

https://vjudge.net/problem/CodeForces-1132C

题面

Description

You have a long fence which consists of \(n\) sections. Unfortunately, it is not painted, so you decided to hire \(q\) painters to paint it. \(i\)-th painter will paint all sections \(x\) such that \(l_i \le x \le r_i\).

Unfortunately, you are on a tight budget, so you may hire only \(q - 2\) painters. Obviously, only painters you hire will do their work.

You want to maximize the number of painted sections if you choose \(q - 2\) painters optimally. A section is considered painted if at least one painter paints it.

Input

The first line contains two integers \(n\) and \(q\) (\(3 \le n, q \le 5000\)) — the number of sections and the number of painters availible for hire, respectively.

Then \(q\) lines follow, each describing one of the painters: \(i\)-th line contains two integers \(l_i\) and \(r_i\) (\(1 \le l_i \le r_i \le n\)).

Output

Print one integer — maximum number of painted sections if you hire \(q - 2\) painters.

Examples

Input

7 5
1 4
4 5
5 6
6 7
3 5

Output

7

Input

4 3
1 1
2 2
3 4

Output

2

Input

4 4
1 1
2 2
2 3
3 4

Output

3

题意

墙长为n,q个工人,每个工人固定粉刷一个区间,区间可能重叠,现在要去掉两个工人,求剩下q-2个工人最多粉刷多少墙

题解

我们可以\(n^2\)枚举去掉的两个工人,然后O(1)查询剩下了多少墙

O(1)查询的方法是:先预处理出每一段墙有多少工人刷,然后处理出每一个工人刷的只有他自己刷的墙的长度,然后预处理出只有两个工人刷的墙的区间的前缀和,然后对于枚举的两个工人,刷过的墙的总数首先要减去两个工人刷的墙的部分中只有一个人刷的部分,因为去掉这个工人这个墙就没人刷了,如果两个工人的覆盖区间有重叠,假设重叠区间\([L,R]\),要减去的区间就是\([L,R]\)中只有两个工人刷的部分,因为去掉这两个工人这段墙就没人刷了

结果取最大值即可

AC代码

#include <bits/stdc++.h>
#define N 5050
using namespace std;
struct seg {
int l, r;
} a[N];
int pre[N];
int pre1[N];
int pre2[N];
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
int n, q;
scanf("%d%d", &n, &q);
int sum = 0;
for (int i = 1; i <= q; i++) {
scanf("%d%d", &a[i].l, &a[i].r);
pre[a[i].l]++; pre[a[i].r + 1]--;
}
for (int i = 1; i <= n; i++) {
pre[i] += pre[i - 1];
}
for (int i = 1; i <= n; i++) {
if (pre[i]) sum++;
}
for (int i = 1; i <= n; i++) {
if (pre[i] == 2) pre1[i]++;
}
for (int i = 1; i <= n; i++) {
pre1[i] += pre1[i - 1];
}
for (int i = 1; i <= q; i++) {
for (int j = a[i].l; j <= a[i].r; j++) {
if (pre[j] == 1) pre2[i]++;
}
}
int L, R;
int ans = 0;
for (int i = 1; i <= q; i++) {
for (int j = i + 1; j <= q; j++) {
L = max(a[i].l, a[j].l);
R = min(a[i].r, a[j].r);
int tmp = sum;
if (R >= L) {
tmp = tmp - (pre1[R] - pre1[L - 1]);
}
tmp -= pre2[i] + pre2[j];
ans = max(tmp, ans);
}
}
printf("%d\n", ans);
return 0;
}

CodeForces-1132C Painting the Fence的更多相关文章

  1. Codeforces 1132C - Painting the Fence - [前缀和优化]

    题目链接:https://codeforces.com/contest/1132/problem/C 题意: 栅栏有 $n$ 个节,有 $q$ 个人可以雇佣来涂栅栏,第 $i$ 个人可以涂第 $l_i ...

  2. codeforces 349B Color the Fence 贪心,思维

    1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...

  3. Codeforces 484E Sign on Fence(是持久的段树+二分法)

    题目链接:Codeforces 484E Sign on Fence 题目大意:给定给一个序列,每一个位置有一个值,表示高度,如今有若干查询,每次查询l,r,w,表示在区间l,r中, 连续最长长度大于 ...

  4. [luogu P2205] [USACO13JAN]画栅栏Painting the Fence

    [luogu P2205] [USACO13JAN]画栅栏Painting the Fence 题目描述 Farmer John has devised a brilliant method to p ...

  5. 洛谷 画栅栏Painting the Fence 解题报告

    P2205 画栅栏Painting the Fence 题目描述 \(Farmer\) \(John\) 想出了一个给牛棚旁的长围墙涂色的好方法.(为了简单起见,我们把围墙看做一维的数轴,每一个单位长 ...

  6. Painting The Fence(贪心+优先队列)

    Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...

  7. 【Codeforces 1132C】Painting the Fence

    Codeforces 1132 C 题意:给一些区间\([l_i,r_i]\),从中删掉两个,求剩下的区间最多能够覆盖的格子数量. 思路:首先枚举第一个删掉的区间,然后我们可以通过差分来求出每个格子被 ...

  8. [Codeforces 448C]Painting Fence

    Description Bizon the Champion isn't just attentive, he also is very hardworking. Bizon the Champion ...

  9. codeforces C. Painting Fence

    http://codeforces.com/contest/448/problem/C 题意:给你n宽度为1,高度为ai的木板,然后用刷子刷颜色,可以横着刷.刷着刷,问最少刷多少次可以全部刷上颜色. ...

  10. Educational Codeforces Round 61 Editorial--C. Painting the Fence

    https://codeforces.com/contest/1132/problem/C 采用逆向思维,要求最大的覆盖,就先求出总的覆盖,然后减去删除两个人贡献最少的人 #include<io ...

随机推荐

  1. Android学习笔记_65_登录功能本身没有任何特别

    对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可.但是为了保持登录的状态(在各个Activity之间切换时要让网站知道用户一直是处于登录的状态)就需要进行cooki ...

  2. 使用actionerror做失败登录验证

    一. 登录页面中放置如下代码: <h4>员工登录</h4> <div style="color:red"> <s:actionerror/ ...

  3. Angularjs基础(三)

    AngularJS ng-model 指令 ng-model 指令用于绑定应用程序数据到HTML 控制器(input,select,textarea)的值ng-model指令 ng-model指令可以 ...

  4. php第一节(入门语法、数据类型)

    <?php /** * 变量命名用 $ 符 * 变量名称的命名规范 * 1.变量名称以$标示 * 2.变量名称只能以字母和下划线开头 * 3.变量的名称只能包含字母.下划线.数字 * 4.变量名 ...

  5. 【模板】全排列(运用STL的next_permutation)

    (1) 先将要排列的数据存入数组中: (2) 再将数组元素从小到大排序: (3) 每次调用next_permutation函数,都只进行1次排列,若数组元素完全变为递减的排列,则该函数返回0: int ...

  6. Java分享笔记:关于Java反射机制

    [1] 关于Java反射机制的概述 1.反射机制的概念:允许程序在执行期,借助于反射相关的API,取得任何类的内部信息,并能直接操作任意对象内部的属性和方法. 2.与反射相关的主要的API:java. ...

  7. ABAP术语-Error Message

    Error Message 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/30/1058283.html Information from ...

  8. tidb损坏tikv节点怎么恢复集群

    tikv节点宕机(机器再起不来),或者数据节点被rm -rf 掉了怎么办 正常情况下tikv节点down掉了.此时不要去执行store delete  store_id .数据一般可以正常访问,但是如 ...

  9. 路由器基础配置之ppp封装下的pap,chap认证

    我们将以上面的拓扑图完成本次实验,路由器的默认封装为HDLC,要求为把路由器全被更改为ppp封装,并在router3与router4之间用pap认证,在router4与router5之间用chap认证 ...

  10. ruby require的使用

    引用单个文件 例: 引用当前rb同目录下的file_to_require.rb先介绍3种方法 require File.join(__FILE__, '../file_to_require') req ...