题目链接:https://codeforces.com/contest/1132/problem/C

题意:

栅栏有 $n$ 个节,有 $q$ 个人可以雇佣来涂栅栏,第 $i$ 个人可以涂第 $l_i$ 节到第 $r_i$ 节。

但是现在预算紧张,所以只能雇佣 $q-2$ 个人,你想确认雇佣哪 $q-2$ 个人使得涂色栅栏的节数最大。

题解:

首先看到 $n$ 的范围,就可以想到大概可以枚举第一个不雇佣的人再枚举第二个不雇佣的人,时间复杂度在 $O(n^2)$ 左右。

先假定第一个不雇佣的人是第 $x$ 个人,然后剩下的 $q-1$ 个人,他们的涂栅栏情况用数组 $c$ 记录,$c_i$ 表示第 $i$ 节有多少人涂。

然后我们用另一个数组 $d$ 对应到数组 $c$,若 $c_i = 1$,则 $d_i = 1$;否则 $d_i = 0$。这样一来就能对每个人,用前缀和优化 $O(1)$ 地求出仅他能涂的栅栏节数。

这样,我们用数组 $c$ 所有 $c_i > 0$ 的 $i$ 的数目减去仅这个人能涂抹的节数,就知道最终能涂多少节。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
#define mk(x,y) make_pair(x,y)
#define fi first
#define se second
const int maxn=5e3+;
int n,q;
P p[maxn];
int cnt[maxn],sum[maxn];
int main()
{
cin>>n>>q;
memset(cnt,,sizeof(cnt));
for(int i=;i<=q;i++)
{
cin>>p[i].fi>>p[i].se;
for(int k=p[i].fi;k<=p[i].se;k++) cnt[k]++;
} int ans=;
for(int x=;x<=q;x++)
{
for(int k=p[x].fi;k<=p[x].se;k++) cnt[k]--; int tot=;
for(int k=;k<=n;k++)
{
tot+=(cnt[k]>);
if(cnt[k]==) sum[k]=;
else sum[k]=;
sum[k]+=sum[k-];
} int Max=;
for(int y=;y<=q;y++)
{
if(x==y) continue;
Max=max(Max,tot-(sum[p[y].se]-sum[p[y].fi-]));
}
ans=max(ans,Max); for(int k=p[x].fi;k<=p[x].se;k++) cnt[k]++;
} cout<<ans<<endl;
}

Codeforces 1132C - Painting the Fence - [前缀和优化]的更多相关文章

  1. Educational Codeforces Round 61 (Rated for Div. 2)-C. Painting the Fence 前缀和优化

    题意就是给出多个区间,要求去掉两个区间,使得剩下的区间覆盖范围最大. 当然比赛的时候还是没能做出来,不得不佩服大佬的各种姿势. 当时我想的是用线段树维护区间和,然后用单点判0,维护区间间断个数.然后打 ...

  2. Codeforces 479E. Riding in a Lift (dp + 前缀和优化)

    题目链接:http://codeforces.com/contest/479/problem/E 题意:         给定一个启示的楼层a,有一个不能去的楼层b,对于你可以去的下一个楼层必须满足你 ...

  3. Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)

    题目链接:http://codeforces.com/contest/712/problem/D A初始有一个分数a,B初始有一个分数b,有t轮比赛,每次比赛都可以取[-k, k]之间的数,问你最后A ...

  4. C. Painting the Fence

    链接 [https://codeforces.com/contest/1132/problem/C] 题意 就是有个n长的栅栏,然后每个油漆工可以染的区域不同 给你q让你选出q-2个人使得被染色的栅栏 ...

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

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

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

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

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

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

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

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

  9. P5241 序列(滚动数组+前缀和优化dp)

    P5241 序列 挺神仙的一题 看看除了dp好像没什么其他办法了 想着怎么构个具体的图出来,然鹅不太现实. 于是我们想办法用几个参数来表示dp数组 加了几条边肯定要的吧,于是加个参数$i$表示已加了$ ...

随机推荐

  1. 美化你的GRUB,全面支持中文(菜单、提示、帮助)适用7.04-9.04

    本文根据网络资料整理而成,在此鸣谢各位作者. 本方法适合 7.04-9.04版本,9.10使用了grub2,请看这里. http://forum.ubuntu.org.cn/viewtopic.php ...

  2. python hex() oct() bin() math 内置函数

    示例: print hex(20),hex(-20) #转换成十六进制 print oct(20),oct(-20) #转换成八进制 print bin(20),bin(-20) #转换成二进制 pr ...

  3. IDEA使用笔记(四)——工具栏的显示隐藏切换

    这也是在玩快捷键的时候,自己试验出来的,觉得不常用但是一旦想用了可能一下不知道怎么弄,还需要找,不如记下来,起码能加深一下印象!

  4. 【Linux高级驱动】如何分析并移植网卡驱动

    dm9000的驱动分析 m9000_init platform_driver_register(); db); db); );  ; id_val ; id_val ; /* 获取芯片型号 */ id ...

  5. openfire开发文档

    http://www.blogjava.net/yi88han/archive/2009/02/11/254203.html

  6. java实现urlencode

    https://www.cnblogs.com/del88/p/6496825.html ****************************************************** ...

  7. Angularjs中config中置入以下拦截器

    $httpProvider.interceptors.push(['$rootScope', '$q', '$localStorage', function ($rootScope, $q, $loc ...

  8. Go Revel - Logging(日志)

    revel提供了4种日志记录器: 1.`TRACE` - 调试信息 2.`INFO` - 信息 3.`WARN` - 一些无害的异常信息 4.`ERROR` - 必须要关注的错误 日志记录器可以在`a ...

  9. hdoj:2028

    #include <iostream> using namespace std; int main() { int n, i; ]; while (cin >> n) { in ...

  10. Swagger使用小记

    Swagger是一种框架,用于自动生成Restfull API的文档,而不用开发者自己编写文档.它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让 ...