欢迎来到ydclyq的博客

我是一只摆烂小狗,欢迎来到摆烂小狗的世界,我们一起摆烂吧

Problem B. 即时战略 ———2019.10.12

题目:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 代码~:感谢土蛋

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdio>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <vector>
 8 #include <map>
 9 #include <complex>
10 
11 #define lc k << 1
12 #define rc k << 1 | 1
13 
14 #define inf 0x3f3f3f3f
15  
16 using namespace std;
17 typedef long long ll;
18 
19 int a[805][805];
20 int n, m, p;
21 
22 ll mn = 1e13, mx = 0;
23 
24 inline int dis(int x1, int y1, int x2, int y2){
25     return min(abs(x2 - x1) + abs(y2 - y1), p);
26 }
27 
28 void solve(int x){
29     int y = 1;
30     ll lres = 0, rres = 0;
31     ll lsum = 0, rsum = 0;
32     for(int i = x - p; i <= x + p; i ++){
33         for(int j = y - p; j <= y; j ++){
34             if(dis(i, j, x, y) != p) lsum += a[i + 200][j + 200]; lres += a[i + 200][j + 200] * (p - dis(i, j, x, y));
35         }
36     }
37     for(int i = x - p; i <= x + p; i ++){
38         for(int j = y + 1; j <= y + p; j ++){
39             if(dis(i, j, x, y) != p) rsum += a[i + 200][j + 200]; rres += a[i + 200][j + 200] * (p - dis(i, j, x, y));
40         }
41     }
42     //printf("%d %d %lld %lld %lld %lld\n", x, y, lres, rres, lsum, rsum);
43     mn = min(lres + rres, mn);
44     mx = max(mx, lres + rres);
45     while(y < m){
46         lres -= lsum;
47         for(int i = y - p + 1; i <= y; i ++){
48             lsum -= a[x + (p - 1 - y + i) + 200][i + 200];
49             if(p - 1 - y + i != 0) lsum -= a[x - (p - 1 - y + i) + 200][i + 200];
50         }
51         y ++;
52         for(int i = y; i <= y + p - 1; i ++){
53             rsum += a[x + (p - 1 - i + y) + 200][i + 200];
54             if(p - 1 - i + y != 0) rsum += a[x - (p - 1 - i + y) + 200][i + 200];
55         }
56         rres += rsum;
57         for(int i = x - p + 1; i <= x + p - 1; i ++){
58             rsum -= a[i + 200][y + 200]; rres -= a[i + 200][y + 200] * (p - dis(i, y, x, y));
59             lsum += a[i + 200][y + 200]; lres += a[i + 200][y + 200] * (p - dis(i, y, x, y));
60         }
61     //    printf("%d %d %lld %lld %lld %lld\n", x, y, lres, rres, lsum, rsum);
62         mn = min(lres + rres, mn);
63         mx = max(mx, lres + rres);
64     }
65 }
66 
67 int main(){
68     freopen("rts.in", "r", stdin);
69     freopen("rts.out", "w", stdout);
70      
71     scanf("%d%d%d", &n, &m, &p);
72     memset(a, 0, sizeof(a));
73     for(int i = 1; i <= n; i ++){
74         for(int j = 1; j <= m; j ++){
75             scanf("%d", &a[i + 200][j + 200]);
76             //a[i + 200][j + 200] = 1;
77         }
78     }
79     for(int i = 1; i <= n; i ++){
80         solve(i);
81     }
82     printf("%lld %lld\n", mn, mx);
83     return 0;
84 }
View Code

 

posted @ 2019-10-12 15:14  ydclyq  阅读(144)  评论(0编辑  收藏  举报