首页 > 其他分享 >Painting the Fence 题解

Painting the Fence 题解

时间:2023-08-05 19:15:12浏览次数:39  
标签:栅栏 5005 Fence int 题解 粉刷 枚举 去掉 Painting

题目传送门

一道枚举题。

我们可以直接枚举那 \(2\) 个去掉的粉刷匠。先统计一下每个栅栏会被多少个粉刷匠刷到,然后枚举第一个被去掉的粉刷匠,然后计算剩下的粉刷匠会将每个栅栏刷到多少次,我们只需要看只能被刷 \(1\) 次的栅栏就行了。

接着处理一个前缀和数组,记录前 \(i\) 个栅栏中有多少个只能被 \(1\) 个粉刷匠刷到。然后枚举第二个被去掉的粉刷匠,然后通过前缀和用 \(O(1)\) 的时间复杂度查询,别忘了加上前面第一个粉刷匠去掉后没有被刷的栅栏的数量。最后取最小值,与 \(n\) 相减即是答案。

Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n, q, minn = INF;
int l[5005], r[5005], cnt[5005], sum[5005];
signed main() {
    ios :: sync_with_stdio(0);
    cin >> n >> q;
    for (int i = 1; i <= q; i++) {
        cin >> l[i] >> r[i];
        for (int j = l[i]; j <= r[i]; j++) cnt[j]++;
    }
    for (int i = 1; i <= q; i++) {
        int x = 0;
        for (int j = l[i]; j <= r[i]; j++) cnt[j]--;
        for (int j = 1; j <= n; j++) {
            sum[j] = sum[j - 1];
            if (cnt[j] == 1) sum[j]++;
            if (cnt[j] == 0) x++;
        }
        for (int j = 1; j <= q; j++) {  
            if (j == i) continue;
            minn = min(minn, sum[r[j]] - sum[l[j] - 1] + x);
        }
        for (int j = l[i]; j <= r[i]; j++) cnt[j]++; // 别忘了要加回去继续枚举
    }
    cout << n - minn;
    return 0;
}

标签:栅栏,5005,Fence,int,题解,粉刷,枚举,去掉,Painting
From: https://www.cnblogs.com/xvl-/p/17608432.html

相关文章

  • Vanya and Brackets 题解
    题目传送门一道枚举题。枚举左括号和右括号的位置括号,为了答案最优,左括号只能在开头或者*的右边。右括号只能在末尾或者*的左边。每一次枚举都计算一下这个加了括号后表达式的值,最后取最大值即可。Code#include<bits/stdc++.h>#definelllonglong#defineINF1e9usi......
  • Permutations 题解
    题目传送门一道枚举题。数据范围非常小,考虑暴力枚举全排列。可以dfs两次,第一次求出能使\(f(p)\)取得的最大值。第二次求出第\(m\)个排列。注意一下,第二次dfs的时候需要按字典序枚举。Code#include<bits/stdc++.h>#definelllonglong#defineINF1e9usingname......
  • Prefixes and Suffixes 题解
    题目传送门一道字符串题。我们考虑还原字符串后再一个一个的判断。很显然,这个字符串是由一个长度为\(n-1\)的前缀和后缀组成的。因此我们可以找到这\(2\)个长度为\(n\)的字符串,然后枚举哪个是前缀,哪个是后缀。值得注意的是,当你判断一个字符串为前缀时,如果后面出现了同样......
  • Educational Codeforces Round 151 (Rated for Div. 2) 题解
    A.ForbiddenInteger显然,当\(x\not=1\)时,直接输出\(n\)个\(1\)即可否则,如果\(n\)为奇数,那就输出\(\lfloor\frac{n}{2}\rfloor-1\)个\(2\)和\(3\);如果\(n\)为偶数,那就输出\(\frac{n}{2}\)个\(2\)(要看一下\(k\)的大小)B.ComeTogether因为Bob和Carol都......
  • 恋爱入门教学题解
    已知长度为\(n\)的三个两个实数序列\(A,B,X\),定义\(n\)个定义域为\(\R\)的函数\(f_1,f_2,\cdots,f_n\)。其中:\[f_k(x)=\sum_{i=1}^k|a_i(x-x_i)+b_i|\]现在,对于每一个\(k=1,2,\cdots,n\),求\(f_k\)的最小值。可以证明,最小值一定存在。\(n\le......
  • FJOI 树的重心题解
    从零开始暴切省选题题意简述给定一个\(n\)个点的树,每个点的编号从\(1\)至\(n\),问这个树有多少不同的连通子树,和这个树有相同的重心。分析1求重心首先要明确重心的定义。题目中给出:删掉某点\(i\)后,若剩余\(k\)个连通分量,那么定义\(d(i)\)为这些连通分量中点的个数......
  • P4850 [IOI2009] Raisins 题解
    前言:IOI还出这样水的纯记忆化搜索题?还是T4?真令人难以置信。题意:题目传送门一个N×M的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次的价值为改子矩阵的元素之和,现要将该矩阵分割成1×1的方格,求最小的分割总价值之和。思路:看到这是个最优化的题,且数据范围很......
  • P9437 『XYGOI round1』一棵树 题解
    赛时一眼换根dp,然后调调调了大概1h+。题目传送门什么是换根dp在大多数树形dp中,我们只考虑对根的贡献,而一部分题目需要算出对所有点的贡献,一个比较显然的做法是对每个点都跑一次树形dp,但是大大增加了时间复杂度,是我们不能接受的。树形dp中的换根dp问题又被称为二次扫......
  • 洛谷 P7911 [CSP-J 2021] 网络连接 题解
    写在前面一道普及级别的题目。CSP-J全国统一命题2021年第三题。本题解来自于一位真正的大佬。传送门https://www.luogu.com.cn/blog/xyf007/solution-p7911。题面信息来源于洛谷。请访问https://www.luogu.com.cn/problem/P7911。声明:本题解非商业用途,一切侵权行为请联系作......
  • We Were Both Childrent 题解
    将一个好理解的方法。题目说有n只青蛙,每只青蛙初始都在0位置,每秒会往前跳a_i。你可以在位置1到n设置一个陷阱,陷阱会抓住经过它的所有青蛙,求你最多能抓住多少青蛙。很简单,只要枚举质因数并判断是否合法即可。intn,ans=0;cin>>n;memset(cnt,0,sizeofcnt)......