【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 }
原文地址:https://www.cnblogs.com/bombe1013/p/5081239.html