zoukankan      html  css  js  c++  java
  • Colorado Potato Beetle(CF的某道) & 鬼畜宽搜

    题意:

      一个人在一张大图上走,给你路径与起点,求他走出的矩形面积并.(大概这个意思自行百度标题...

    SOL:

      与其说这是一道图论题不如说是一道生动活泼的STL-vector教学....

      离散化宽搜,没什么别的...vector用得淋漓尽致...

    Code:

      

    /*==========================================================================
    # Last modified: 2016-03-18 08:32
    # Filename: t1.cpp
    # Description:
    ==========================================================================*/
    #define me AcrossTheSky
    #include <cstdio>
    #include <ctime>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
       
    #include <set>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <deque>
     
    #define lowbit(x) (x)&(-x)
    #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
    #define FORP(i,a,b) for(int i=(a);i<=(b);i++)
    #define FORM(i,a,b) for(int i=(a);i>=(b);i--)
    #define ls(a,b) (((a)+(b)) << 1)
    #define rs(a,b) (((a)+(b)) >> 1)
    #define getlc(a) ch[(a)][0]
    #define getrc(a) ch[(a)][1]
    #define pb push_back
    #define find(a,b) lower_bound((a).begin(), (a).end(), (b))-(a).begin()
     
    #define INF 10000000000
    #define maxn 3000
    #define maxm 100000
    #define pi 3.1415926535898
    #define _e 2.718281828459 
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    template<class T> inline
    void read(T& num) {
        bool start=false,neg=false;
        char c;
        num=0;
        while((c=getchar())!=EOF) {
            if(c=='-') start=neg=true;
            else if(c>='0' && c<='9') {
                start=true;
                num=num*10+c-'0';
            } else if(start) break;
        }
        if(neg) num=-num;
    }
    /*==================split line==================*/
    ll n, x[maxn], x1 = INF/2, y1 = INF/2, ans = 0;
    char d[maxn];
    vector<ll> x2,y2;
    int a[maxn][maxn];
    int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
     
    void check(){
        FORP(i,0,x2.size()-1) printf("%lld ",x2[i]);
        printf("
    ");
        FORP(i,0,y2.size()-1) printf("%lld ",y2[i]);
        cout << endl;
    }
    void mark(int ld,int rd,int lu,int ru) {
        if (ld>lu) swap(ld,lu); if (rd>ru) swap(rd,ru);
        for (int i=ld;i<=lu;i++)
            for (int j=rd;j<=ru;j++) a[i][j] = 1;
    }
    queue<int> qx,qy;
    void bfs() {
        qx.push(0); qy.push(0);
        while (!qx.empty()){
            int nx=qx.front(),ny=qy.front();
            qx.pop(); qy.pop();
            FORP(i,0,3) {
                int xx=nx+dx[i],yy=ny+dy[i];
                if (xx<0||xx>=x2.size()||yy<0||yy>=y2.size()||a[xx][yy])
                continue;
                else {
                    a[xx][yy]=2;
                    qx.push(xx); qy.push(yy);
                }
            }
        }
        //FORP(i,0,3) dfs(xx+dx[i],yy+dy[i]);
    }
    void init(){
        read(n);
        x2.pb(0); x2.pb(INF);
        y2.pb(0); y2.pb(INF);
        FORP(i,0,n-1){
            x2.pb(x1); x2.pb(x1+1);
            y2.pb(y1); y2.pb(y1+1);
            cin >> d[i]; read(x[i]);
            if (d[i]=='R')x1+=x[i];if (d[i]=='L')x1-=x[i];
            if (d[i]=='U')y1+=x[i];if (d[i]=='D')y1-=x[i];
        }
        x2.pb(x1); x2.pb(x1+1);
        y2.pb(y1); y2.pb(y1+1);
       // check();
        sort(x2.begin(), x2.end()); sort(y2.begin(), y2.end());
        x2.erase(unique(x2.begin(),x2.end()),x2.end());
        y2.erase(unique(y2.begin(),y2.end()),y2.end());
         
       // check();
    }
    int main(){
        //freopen("a.in","r",stdin);
        init();
         
        int xnow=find(x2,INF/2),ynow=find(y2,INF/2);
        ll xx=INF/2, yy=INF/2;
        FORP(i,0,n-1){
            int x4=xnow,y4=ynow;
            if (d[i]=='R') xx+=x[i];if (d[i]=='L') xx-=x[i];
            if (d[i]=='U') yy+=x[i];if (d[i]=='D') yy-=x[i];
            xnow=find(x2,xx); ynow=find(y2,yy);
            mark(xnow, ynow, x4, y4);
        }
        bfs();
     
        FORP(i,0,x2.size()-1)
            FORP(j,0,y2.size()-1)
                if (a[i][j]!=2) ans+=(x2[i+1]-x2[i])*(y2[j+1]-y2[j]);
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    关于ARMv8另外几个问题
    C++中的内存区域及其性能特征
    外点惩处函数法·约束优化问题
    【LaTeX排版】LaTeX论文模版
    fatal error: vector: No such file or directory
    【UNIX网络编程(三)】TCP客户/server程序演示样例
    LOJ#6437. 「PKUSC2018」PKUSC
    mybatis 学习一 建立maven项目
    maven学习5 构建MyBatis项目
    maven学习4 使用Maven构建Spring项目
  • 原文地址:https://www.cnblogs.com/YCuangWhen/p/5292568.html
Copyright © 2011-2022 走看看