标签:get def str 位置 push problem set bool 16px
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 int ans[72][72] , numOp[72];
6
7 vector < int > num[72] , op[72];
8 map < string , int > opToNum;
9
10 bool ifOK(int l , int r , int que1 , int que2){
11 //特别注意判断que1位置与que2位置有联系的情况
12 for(int i = 0 ; i < numOp[que1] ; i++)
13 switch(op[que1][i]){
14 case 1:
15 if(num[que1][i] < r && num[que1][i] > l || num[que1][i] == que2)
16 return 0;
17 break;
18 case 2:
19 if(num[que1][i] < r && num[que1][i] > l && num[que1][i] != que2)
20 return 0;
21 break;
22 case 3:
23 if(!(num[que1][i] == que2))
24 return 0;
25 break;
26 case 4:
27 if(!(num[que1][i] <= r && num[que1][i] >= l || num[que1][i] == que2))
28 return 0;
29 break;
30 case 5:
31 if(!(num[que1][i] < r && num[que1][i] > l) || num[que1][i] == que2)
32 return 0;
33 }
34 for(int i = 0 ; i < numOp[que2] ; i++)
35 switch(op[que2][i]){
36 case 1:
37 if(num[que2][i] < r && num[que2][i] > l || num[que2][i] == que1)
38 return 0;
39 break;
40 case 2:
41 if(num[que2][i] < r && num[que2][i] > l && num[que2][i] != que1)
42 return 0;
43 break;
44 case 3:
45 if(!(num[que2][i] == que1))
46 return 0;
47 break;
48 case 4:
49 if(!(num[que2][i] <= r && num[que2][i] >= l || num[que2][i] == que1))
50 return 0;
51 break;
52 case 5:
53 if(!(num[que2][i] < r && num[que2][i] > l) || num[que2][i] == que1)
54 return 0;
55 }
56 return 1;
57 }
58
59 main(){
60 opToNum.insert(make_pair(">" , 1));
61 opToNum.insert(make_pair(">=" , 2));
62 opToNum.insert(make_pair("=" , 3));
63 opToNum.insert(make_pair("<=" , 4));
64 opToNum.insert(make_pair("<" , 5));
65 int N , K;
66 for(cin >> N >> K ; K ; K--){
67 int a , b , t;
68 string s;
69 cin >> a >> s >> b;
70 t = opToNum.find(s)->second;
71 if(a == b)
72 if(t == 1 || t == 5){
73 cout << 0;
74 return 0;
75 }
76 else
77 continue;
78 num[a].push_back(b);
79 op[a].push_back(t);
80 num[b].push_back(a);
81 op[b].push_back(6 - t);
82 numOp[a]++;
83 numOp[b]++;
84 }
85 ans[0][0] = 1;
86 for(int i = 1 ; i <= N ; i++){
87 //DP
88 for(int j = 2 * i ; j >= 2 ; j--)
89 if(ans[j - 2][2 * i - j] && ifOK(j , 2 * N - 2 * i + j + 1 , j , j - 1))
90 ans[j][2 * i - j] += ans[j - 2][2 * i - j];
91 for(int j = 2 * i ; j >= 2 ; j--)
92 if(ans[2 * i - j][j - 2] && ifOK(2 * i - j , 2 * N - j + 1 , 2 * N - j + 1 , 2 * N - j + 2))
93 ans[2 * i - j][j] += ans[2 * i - j][j - 2];
94 for(int j = 1 ; j < 2 * i ; j++)
95 if(ans[2 * i - j - 1][j - 1] && ifOK(2 * i - j , 2 * N - j + 1 , 2 * i - j , 2 * N - j + 1))
96 ans[2 * i - j][j] += ans[2 * i - j - 1][j - 1];
97 }
98 int all = 0;
99 for(int i = 0 ; i <= 2 * N ; i++)
100 all += ans[i][2 * N - i];
101 cout << all / 3;
102 return 0;
103 }
51NOD1522&CF567F 上下序列/Mausoleum DP
标签:get def str 位置 push problem set bool 16px
原文地址:https://www.cnblogs.com/Itst/p/9748375.html