zoukankan      html  css  js  c++  java
  • CodeForces-1132C Painting the Fence

    题目链接

    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
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    java实现 n人过桥问题
    git:rebase的原理
    注解@ConfigurationProperties使用方法
    docker+mysql 更改配置后重启不了的解决方案
    docker+mysql 构建数据库的主从复制
    Linux 踩坑记
    OSS上传图片无法在线预览的解决方案
    Linux中du、df显示不一致问题
    zookeeper作配置中心(存储支付信息)
    @Configuration结合@Bean实现对象的配置
  • 原文地址:https://www.cnblogs.com/artoriax/p/10495072.html
Copyright © 2011-2022 走看看