C. Painting the Fence
链接
[https://codeforces.com/contest/1132/problem/C]
题意
就是有个n长的栅栏,然后每个油漆工可以染的区域不同
给你q让你选出q-2个人使得被染色的栅栏最多
分析
一开始一直想着用dp,就是那个状态转移无法搞。
后面是看别人的思路才发现,暴力就可以了,具体看代码
O(n*q)复杂度。还是太菜了
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e3+10;
int l[N],r[N],pre[N],cnt[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("in.txt","r",stdin);
int n,q;
while(cin>>n>>q){
memset(cnt,0,sizeof(cnt));
memset(pre,0,sizeof(pre));
for(int i=1;i<=q;i++){
cin>>l[i]>>r[i];
for(int j=l[i];j<=r[i];j++)//统计每个点被覆盖的次数
cnt[j]++;
}
int ans=0;
//很关键的前缀和优化
for(int i=1;i<=q;i++){
int sum=0;
for(int j=l[i];j<=r[i];j++)//枚举要消除某一段
cnt[j]--;
for(int j=1;j<=n;j++){
// pre[j]表示从第一个到j这位置有多少个位置被覆盖一次
if(cnt[j]==1) pre[j]=pre[j-1]+1;
// 因为只有被覆盖一次的点在第二次去掉才会有影响
else pre[j]=pre[j-1];
if(cnt[j]) sum++;
//sum统计去掉一段后剩下的覆盖位置
}
for(int j=i+1;j<=q;j++)
ans=max(ans,sum-(pre[r[j]]-pre[l[j]-1]));
for(int j=l[i];j<=r[i];j++)//恢复第一被消除的那段
cnt[j]++;
}
cout<<ans<<endl;
}
return 0;
}
C. Painting the Fence的更多相关文章
- [luogu P2205] [USACO13JAN]画栅栏Painting the Fence
[luogu P2205] [USACO13JAN]画栅栏Painting the Fence 题目描述 Farmer John has devised a brilliant method to p ...
- 洛谷 画栅栏Painting the Fence 解题报告
P2205 画栅栏Painting the Fence 题目描述 \(Farmer\) \(John\) 想出了一个给牛棚旁的长围墙涂色的好方法.(为了简单起见,我们把围墙看做一维的数轴,每一个单位长 ...
- Painting The Fence(贪心+优先队列)
Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...
- Painting the Fence Gym - 101911E(构造)
There is a beautiful fence near Monocarp's house. The fence consists of nn planks numbered from left ...
- CodeForces-1132C Painting the Fence
题目链接 https://vjudge.net/problem/CodeForces-1132C 题面 Description You have a long fence which consists ...
- 洛谷——P2205 [USACO13JAN]画栅栏Painting the Fence
题目描述 Farmer John has devised a brilliant method to paint the long fence next to his barn (think of t ...
- Educational Codeforces Round 61 (Rated for Div. 2)-C. Painting the Fence 前缀和优化
题意就是给出多个区间,要求去掉两个区间,使得剩下的区间覆盖范围最大. 当然比赛的时候还是没能做出来,不得不佩服大佬的各种姿势. 当时我想的是用线段树维护区间和,然后用单点判0,维护区间间断个数.然后打 ...
- Educational Codeforces Round 61 Editorial--C. Painting the Fence
https://codeforces.com/contest/1132/problem/C 采用逆向思维,要求最大的覆盖,就先求出总的覆盖,然后减去删除两个人贡献最少的人 #include<io ...
- Gym 101911E "Painting the Fence"(线段树区间更新+双端队列)
传送门 题意: 庭院中有 n 个围栏,每个围栏上都被涂上了不同的颜色(数字表示): 有 m 条指令,每条指令给出一个整数 x ,你要做的就是将区间[ x第一次出现的位置 , x最后出现的位置 ]中的围 ...
随机推荐
- JavaScript中解决计算精度丢失的问题
在做项目之前老师就给我们封装好了一个js文件,解决计算中丢失精度的一些函数,直接引用js文件就可以使用. eg: var numA = 0.1; var numB = 0.2; alert( numA ...
- SQL server 2012 数据库日志缓存过大
由于我公司的每日数据录入量较多,数据库日志与日俱增,前两天就出现了,因为数据库日志太大导致了 服务器磁盘空间不足,于是我上网查了一下,终于找到了一个数据库日志文件压缩的方法 原文出处:http://b ...
- c/c++ 友元的简单应用
友元的简单应用 1,对象 + 对象,或者,对象 + 数字,可以用类的成员函数去重载+号函数,但是,数字 + 对象就不能用类的成员函数去重载+号函数了, 因为编译器会把数字 + 对象翻译成数字.oper ...
- C# -- 随机数产生的字母金字塔
C# -- 随机数产生的字母金字塔 1. 代码实现: static void Main(string[] args) { showNpoint(); Console.ReadKey(); } priv ...
- 转:Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- syslog的坑
先看看代码: g_log, err := syslog.NewLogger(syslog.LOG_INFO, ) 再看看syslog的源码: // NewLogger creates a log.Lo ...
- 【English】20190307
appropriate for 适用[əˈpropriɪt fɔr] appropriate for many business applications:
- 5.06-re
import re # 贪婪模式 从开头匹配到结尾 默认 # 非贪婪 one = 'mdfsdsfffdsn12345656n' two = "a\d" pattern = re. ...
- [ZJOI2018]胖
嘟嘟嘟 都说这题是送分题,但我怎么就不觉得的呢. 看来我还是太弱了啊-- 大体思路就是对于每一个设计方案,答案就是每一个关键点能更新的点的数量之和. 关键在于怎么求一个关键点能更新那些点. 首先这些点 ...
- 小a的子序列 (线性dp)
思路:设dp[i][j]表示最大数为j,i为第i的位置的萌值.那么推导过程就是两种情况:1.第i位数不放数字,则结果就是dp[i-1][j]; 2.第i位放数字,则结果就是前面的萌值sum+dp[i- ...