zoukankan      html  css  js  c++  java
  • 【HDOJ】2828 Lamp

    DLX简单题目。

      1 /*  */
      2 #include <iostream>
      3 #include <sstream>
      4 #include <string>
      5 #include <map>
      6 #include <queue>
      7 #include <set>
      8 #include <stack>
      9 #include <vector>
     10 #include <deque>
     11 #include <algorithm>
     12 #include <cstdio>
     13 #include <cmath>
     14 #include <ctime>
     15 #include <cstring>
     16 #include <climits>
     17 #include <cctype>
     18 #include <cassert>
     19 #include <functional>
     20 #include <iterator>
     21 #include <iomanip>
     22 using namespace std;
     23 //#pragma comment(linker,"/STACK:102400000,1024000")
     24 
     25 #define sti                set<int>
     26 #define stpii            set<pair<int, int> >
     27 #define mpii            map<int,int>
     28 #define vi                vector<int>
     29 #define pii                pair<int,int>
     30 #define vpii            vector<pair<int,int> >
     31 #define rep(i, a, n)     for (int i=a;i<n;++i)
     32 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     33 #define clr                clear
     34 #define pb                 push_back
     35 #define mp                 make_pair
     36 #define fir                first
     37 #define sec                second
     38 #define all(x)             (x).begin(),(x).end()
     39 #define SZ(x)             ((int)(x).size())
     40 #define lson            l, mid, rt<<1
     41 #define rson            mid+1, r, rt<<1|1
     42 
     43 const int INF = 0x3f3f3f3f;
     44 
     45 typedef struct {
     46     static const int maxn = 1e6+5;
     47     
     48     int L[maxn], R[maxn], U[maxn], D[maxn];
     49     int H[maxn];
     50     int row[maxn], col[maxn], S[maxn];
     51     
     52     bool visit[1205];
     53     int sz;
     54     int ans[maxn], ansd;
     55     
     56     void init(int n) {
     57         rep(i, 0, n+1) {
     58             L[i] = i - 1;
     59             R[i] = i + 1;
     60             U[i] = i;
     61             D[i] = i;
     62             col[i] = i;
     63         }
     64         
     65         memset(S, 0, sizeof(S));
     66         memset(visit, false, sizeof(visit));
     67         memset(H, -1, sizeof(H));
     68         R[n] = 0;
     69         L[0] = n;
     70         sz = n + 1;
     71     }
     72     
     73     void link(int r, int c) {
     74         U[sz] = c;
     75         D[sz] = D[c];
     76         U[D[c]] = sz;
     77         D[c] = sz;
     78         if (H[r] < 0) {
     79             H[r] = L[sz] = R[sz] = sz;
     80         } else {
     81             L[sz] = H[r];
     82             R[sz] = R[H[r]];
     83             L[R[H[r]]] = sz;
     84             R[H[r]] = sz;
     85         }
     86         
     87         ++S[c];
     88         col[sz] = c;
     89         row[sz] = r;
     90         ++sz;
     91     }
     92     
     93     void remove(int c)  {
     94         L[R[c]] = L[c];
     95         R[L[c]] = R[c];
     96         for (int i=D[c]; i!=c; i=D[i]) {
     97             for (int j=R[i]; j!=i; j=R[j]) {
     98                 U[D[j]] = U[j];
     99                 D[U[j]] = D[j];
    100                 --S[col[j]];
    101             }
    102         }
    103     }
    104     
    105     void restore(int c)  {
    106         L[R[c]] = c;
    107         R[L[c]] = c;
    108         for (int i=D[c]; i!=c; i=D[i]) {
    109             for (int j=R[i]; j!=i; j=R[j]) {
    110                 U[D[j]] = j;
    111                 D[U[j]] = j;
    112                 ++S[col[j]];
    113             }
    114         }
    115     }
    116     
    117     void remove_(int c) {
    118         for (int i=D[c]; i!=c; i=D[i]) {
    119             L[R[i]] = L[i];
    120             R[L[i]] = R[i];
    121         }
    122     }
    123     
    124     void restore_(int c) {
    125         for (int i=D[c]; i!=c; i=D[i]) {
    126             L[R[i]] = i;
    127             R[L[i]] = i;
    128         }
    129     }
    130     
    131     bool dfs(int cur) {
    132         if (!R[0]) {
    133             return true;
    134         }
    135         
    136         int c = R[0];
    137         for (int i=R[0]; i!=0; i=R[i]) {
    138             if (S[i] < S[c])
    139                 c = i;
    140         }
    141         
    142         for (int i=D[c]; i!=c; i=D[i]) {
    143             if (visit[row[i]^1])
    144                 continue;
    145             visit[row[i]] = true;
    146             remove_(i);
    147             for (int j=R[i]; j!=i; j=R[j])
    148                 remove_(j);
    149             if (dfs(cur+1))    return true;
    150             for (int j=L[i]; j!=i; j=L[j])
    151                 restore_(j);
    152             restore_(i);
    153             visit[row[i]] = false;
    154         }
    155         
    156         return false;
    157     }
    158     
    159 } DLX;
    160 
    161 DLX solver;
    162 
    163 int main() {
    164     ios::sync_with_stdio(false);
    165     #ifndef ONLINE_JUDGE
    166         freopen("data.in", "r", stdin);
    167         freopen("data.out", "w", stdout);
    168     #endif
    169     
    170     int n, m;
    171     int ln, k;
    172     char op[8];
    173     bool flag;
    174     
    175     while (scanf("%d %d", &n, &m)!=EOF) {
    176         solver.init(n);
    177         rep(i, 1, n+1) {
    178             scanf("%d", &ln);
    179             while (ln--) {
    180                 scanf("%d %s", &k, op);
    181                 --k;
    182                 if (op[1] == 'N') {
    183                     solver.link(k<<1, i);
    184                 } else {
    185                     solver.link(k<<1|1, i);
    186                 }
    187             }
    188         }
    189         
    190         flag = solver.dfs(0);
    191         if (flag) {
    192             if (solver.visit[1]) {
    193                 printf("OFF");
    194             } else {
    195                 printf("ON");
    196             }
    197             m <<= 1;
    198             for (int i=2; i<m; i+=2) {
    199                 if (solver.visit[i]) {
    200                     printf(" ON");
    201                 } else {
    202                     printf(" OFF");
    203                 }
    204             }
    205             putchar('
    ');
    206         } else {
    207             puts("-1");
    208         }
    209     }
    210     
    211     #ifndef ONLINE_JUDGE
    212         printf("time = %d.
    ", (int)clock());
    213     #endif
    214     
    215     return 0;
    216 }
  • 相关阅读:
    《C++ Primer》读书笔记—第十章 泛型算法
    悬浮在activity上的activity对话框
    android 双向滑动 稍加改进,可做成QQHD效果
    android String.format
    使用ttf字体
    UI界面设计准则
    scrollview gn gridview混合使用问题
    android Activity 之间传递复杂对象
    android程序获取手机imei方法
    android 自定义对话框
  • 原文地址:https://www.cnblogs.com/bombe1013/p/5081239.html
Copyright © 2011-2022 走看看