ACM-ICPC 2017 沈阳赛区现场赛 M. Wandering Robots && HDU 6229(思维+期望)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6229

参考题解:https://blog.csdn.net/lifelikes/article/details/78452558

        https://www.cnblogs.com/cxhscst2/p/8215717.html

 

 1 #include 
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define mst(a,b) memset((a),(b),sizeof(a))
 6 #define mp(a,b) make_pair(a,b)
 7 #define pi acos(-1)
 8 #define pii pair
 9 #define pb push_back
10 const int INF = 0x3f3f3f3f;
11 const double eps = 1e-6;
12 const int MAXN = 15e4 + 10;
13 const int MAXM = 2e6 + 10;
14 
15 int n,k;
16 int dx[4] = {-1,0,0,1};
17 int dy[4] = {0,-1,1,0};
18 mapbool>ma;
19 mapint>sub;
20 
21 bool judge(int x,int y) {
22     if(x < 0 || x >= n || y < 0 || y >= n) return false;
23     return true;
24 }
25 
26 int check(int x,int y) {
27     if(x == 0 || x == n - 1) {
28         if(y == 0 || y == n - 1) return 3;
29         else return 4;
30     } else {
31         if(y == 0 || y == n - 1) return 4;
32         else return 5;
33     }
34 }
35 
36 int main() {
37 #ifdef local
38     freopen("data.txt", "r", stdin);
39 #endif
40     int cas = 1;
41     int t;
42     scanf("%d",&t);
43     while(t--) {
44         ma.clear();
45         sub.clear();
46         scanf("%d%d",&n,&k);
47         if(n == 1) {
48             printf("Case #%d: 1/1\n",cas++);
49             continue;
50         }
51         ll ans1 = 16ll * (n - 2) + 5ll * (n - 2) * (n - 2) + 12;
52         ll ans2 = 5ll * (1ll * n * (n + 1) / 2 - 2ll * (n - 2) - 3) + 8ll * (n - 2) + 9;
53         while(k--) {
54             int x,y;
55             scanf("%d%d",&x,&y);
56             if(ma[mp(x,y)]) {
57                 ans1 -= sub[mp(x,y)];
58                 if(x + y >= n - 1) ans2 -= sub[mp(x,y)];
59                 sub[mp(x,y)] = 0;
60             } else {
61                 ma[mp(x,y)] = true;
62                 ans1 -= check(x,y);
63                 if(x + y >= n - 1) ans2 -= check(x,y);
64                 sub[mp(x,y)] = 0;
65             }
66             for(int i = 0; i < 4; i++) {
67                 int nx = x + dx[i], ny = y + dy[i];
68                 if(!judge(nx,ny)) continue;
69                 if(ma[mp(nx,ny)]) {
70                     if(sub[mp(nx,ny)]) {
71                         ans1--;
72                         if(nx + ny >= n - 1) ans2--;
73                         sub[mp(nx,ny)]--;
74                     }
75                 } else {
76                     ma[mp(nx,ny)] = true;
77                     sub[mp(nx,ny)] = check(nx,ny) - 1;
78                     ans1--;
79                     if(nx + ny >= n - 1) ans2--;
80                 }
81             }
82         }
83         ll gcd = __gcd(ans1,ans2);
84         ans1 /= gcd, ans2 /= gcd;
85         printf("Case #%d: %lld/%lld\n",cas++,ans2,ans1);
86     }
87     return 0;
88 }

 

转载于:https://www.cnblogs.com/scaulok/p/9744000.html

你可能感兴趣的:(ACM-ICPC 2017 沈阳赛区现场赛 M. Wandering Robots && HDU 6229(思维+期望))