题目链接

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. SQL批量添加,更新,删除

    SQL语句: 存储过程: 代码: 这里说的是关于SQL的批量操作数据. 需要准备: 三层框架:利用 动软代码生成器(可以快速生成增删改查) 生成三层 Model,BLL,Dal ①DbHelpeSQL ...

  2. Kinect骨架数据

  3. JavaScript:直接写入 HTML 输出流

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. 使用fir.im和蒲公英进行测试的一些注意事项

    前言:使用fir.im和蒲公英进行测试的一些注意事项 最近公司的项目遇到了一个问题,有的用户的手机系统版本低于9.3高于9.0的存在崩溃的情况,8.x的系统的用户的有的界面的显示有问题(比如说图片严重 ...

  5. LeetCode1.两数之和 JavaScript

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 实例: 给定 nums = [2, 7, 11, 15], target ...

  6. Android手机上抓包神器

    Packet Capture 一款依托安卓系统自身VPN来达到免Root抓取数据包的应用程序.Packet Capture一个使用SSL网络解密的 捕获数据包/网络嗅探 工具,虽然它的功能并不丰富,但 ...

  7. #leetcode刷题之路2-两数相加

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  8. Git push提示pre-receive hook declined

    master:local auto@ubuntu:~/src/code/ git push Counting objects: 5, done. Delta compression using up ...

  9. mysql查看锁等信息SQL

    查看锁等信息,包括锁信息: select "HOLD:",ph.id h_processid,trh.trx_id h_trx_id,trh.trx_started h_start ...

  10. TCP回话劫持原理和利用

    由于 TCP 协议并没有对 TCP 的传输包进行身份验证,所以在我们知道一个 TCP 连接中的 seq 和 ack 的信息后就可以很容易的伪造传输包,假装任意一方与另一方进行通信,我们将这一过程称为 ...