C. Painting the Fence(区间交叉)Educational Codeforces Round 61 (Rated for Div. 2)

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

题目大意:

        给q个区间,选择其中q-2个,使得剩下的覆盖面积最大。

题目思路:

       我们可以发现给的数据很小,l和r也很小,所以往暴力想,首先n^2暴力两个区间。表示我们要删除这两个区间,我们只要记录这两个区间被取消掉之后,会损失多少个点,然后所有的两个区间的组合取损失最小就可以了。然后我们可以考虑怎么算这两个区间损失了多少个点。

        给的q个区间,预处理一个数组,num[i]表示i被覆盖几次。这个输入的时候暴力就好,然后我们像处理前缀和一样处理两个数组记录刚刚的num数组 num_1[i]表示到i为止有多少个1,num_2【i】表示到i为止有多少个2.

        然后暴力两个区间,两个区间中,计算有多少个1,如果交叉了,计算交叉部分有多少个2.  注意要分多种情况,避免算1的时候重复计算。就统计出了取消这两个区间会损失多少个点。

       取损失点最少的两个区间,并且用原来的覆盖总数,减去损失的得出结果。

代码:

#include<iostream>
#include<string.h>
using namespace std;
struct Point
{
    int l,r;
}C[5005];
int num[5005],num_1[5005],num_2[5005];
int main()
{
    int n,q;
    cin>>n>>q;
    memset(num,0,sizeof(num));
    memset(num_1,0,sizeof(num_1));
    memset(num_2,0,sizeof(num_2));
    for(int i=1;i<=q;i++){
        cin>>C[i].l>>C[i].r;
        for(int j=C[i].l;j<=C[i].r;j++){
            num[j]++;
        }
    }
    int sum=0;
    int now1=0,now2=0;
    for(int i=1;i<=n;i++){
        if(num[i])sum++;
        if(num[i]==1)now1++;
        if(num[i]==2)now2++;
        num_1[i]=now1;
        num_2[i]=now2;
    }
    int Min=0x7fffffff;
    for(int i=1;i<=q;i++){
        int ans=0;
        for(int j=i+1;j<=q;j++){
            int a=C[i].l,b=C[i].r,c=C[j].l,d=C[j].r;
            if(b<c)ans=num_1[b]-num_1[a-1]+num_1[d]-num_1[c-1];
            if(d<a)ans=num_1[b]-num_1[a-1]+num_1[d]-num_1[c-1];
            if(a<=c&&d<=b)ans=num_1[b]-num_1[a-1]+num_2[d]-num_2[c-1];
            if(c<=a&&b<=d)ans=num_1[d]-num_1[c-1]+num_2[b]-num_2[a-1];
            if(a<=c&&c<=b&&b<=d)ans=num_1[b]-num_1[a-1]+num_1[d]-num_1[b]+num_2[b]-num_2[c-1];
            if(c<=a&&a<=d&&d<=b)ans=num_1[d]-num_1[c-1]+num_1[b]-num_1[d]+num_2[d]-num_2[a-1];
            Min=min(Min,ans);
        }
    }
    cout<<sum-Min<<endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值