【集训】DP & 搜索 & 线段树 Day 2

19 篇文章 0 订阅
15 篇文章 0 订阅

Contest地址(VJ) 点击打开链接

好气啊啊啊!!!C题简直神TM坑!!!

Problem A (HDU 1050)

区间覆盖最小,也叫最小工人问题. 需要注意的是门牌号需要处理一下(对门归为一个门牌号)

参见 区间调度问题详解

AC代码 View Source On GitHub

Problem B (POJ 1125)

做过。Floyd算法的题目。题解 POJ 1125 Floyd最短路入门

Problem C (POJ 1176)

沃日啊!我最后做的这道题!我TM以为这道题非常困难呢,一直在找规律,6个分一组然后判断一共有8种状态!然而,这是一道DFS就能过的题!

AC代码 View Source On GitHub

来来来,贴一下累得半死的找规律...(俩小时) 最关键的是居然WA !

/// POJ 1176
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define MAXN 150
/// 按照6个一组进行分组,每一组只能有以下8种状态
/**
A 000000
B 101010 (1)
C 010101 (1)
D 010010 (1)
E 111111 (B^C) (2)
F 111000 (B^D) (2)
G 000111 (C^D) (2)
H 101101 (B^C^D) (3)
*/
int abit[MAXN];
int c_abit=0;
int bbit[MAXN];
int c_bbit=0;
int status_map[8][6]
{
    {
        1,1,1,1,1,1 ///A 0
    },
    {
        0,1,0,1,0,1 ///B 1
    },
    {
        1,0,1,0,1,0 ///C 1
    },
    {
        0,1,1,0,1,1 ///D 1
    },
    {
        1,0,0,1,0,0 ///E 2
    },
    {
        0,0,1,1,1,0 ///F 2
    },
    {
        1,1,0,0,0,1 ///G 2
    },
    {
        0,0,0,0,0,0 ///H 3
    }
};
int exclude_lable[8];
int bit_bucket[6];
int main()
{
    /// Input Start
    int N;
    scanf("%d",&N);
    int C;
    scanf("%d",&C);
    C=C%3;
    int tmp;
    while(scanf("%d",&tmp)==1&&tmp!=-1) abit[c_abit++]=tmp%6;
    while(scanf("%d",&tmp)==1&&tmp!=-1) abit[c_bbit++]=tmp%6;
    /// Input Finish.

    for(int i=0;i<8;i++)/// Search in 8 Status
    {
        for(int j=0;j<c_abit;j++)
        {
            if(status_map[i][abit[j]]!=1) /// Must Be ON
            {
                exclude_lable[i]=1;
            }
        }
        for(int j=0;j<c_bbit;j++)
        {
            if(status_map[i][bbit[j]]!=0) /// Must Be OFF
            {
                exclude_lable[i]=1;
            }
        }
    }

    /// Now status not excluded might be answers.
    /// Check C and confirm them
    for(int i=0;i<8;i++)
    {
        if(!exclude_lable[i])
        {
            /// Not excluded.
            switch(i)
            {
                /// case 0 is not checked.
                case 1:case 2:case 3: {if(C!=1) exclude_lable[i]=1;}break;
                case 4:case 5:case 6: {if(C!=2) exclude_lable[i]=1;}break;
            }
        }
    }

    /// Now status are confirmed.
    /// But if N%6 != 0 then you should check if repetitions exist.
    /// But N >= 10 > 6 , so check is needn't.

    vector<string> ans;
    /// Output
    for(int i=0;i<8;i++)
    {
        if(!exclude_lable[i])
        {
            string t;
            switch(i)
            {
            case 0:
                {
                    char p[]="111111";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
            case 1:
                {
                    char p[]="010101";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            case 2:
                {
                    char p[]="101010";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            case 3:
                {
                    char p[]="011011";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            case 4:
                {
                    char p[]="100100";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            case 5:
                {
                    char p[]="001110";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            case 6:
                {
                    char p[]="110001";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            case 7:
                {
                    char p[]="000000";
                    for(int c=0;c<N/6;c++) t+=p;
                    p[N%6]=0;
                    t+=p;
                }
                break;
            }
            ans.push_back(t);
        }
    }
    sort(ans.begin(),ans.end());
    for(size_t i=0;i<ans.size();i++)
    {
        printf("%s\n",ans.at(i).c_str());
    }
    return 0;
}


Problem D (POJ 3667)

线段树。写了份新的模板。

AC代码 View Source On GitHub

线段树模板集合(持续更新) 

ACM模板——各种各样的线段树 

SegmentTree Template On GitHub


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值