单点时限: 2.5 sec
内存限制: 256 MB
OLED 是一种新兴的显示技术。相比于传统 LED 屏幕,可以实现更高的显示亮度、对比度,同时更轻更薄。然而发展至今,OLED 仍然有一个根源性的缺陷:由于 OLED 的每一个像素点单独发光,所以发光时常更长、发光亮度更大的像素,老化速度更快。因此,如果屏幕长时间显示静止的画面,各个像素由于衰减速度不一,时间一长,画面的纹路就好像被烙在了屏幕上。这个现象俗称”烧屏”。
由于现在 OLED 技术的发展,屏幕寿命更加持久,因此烧屏现象不再那么明显。此外,手机厂商也利用了一些软件方面的技术缓解烧屏问题。
屏保(熄屏图像)由于是静止图像,且显示时常非常长,自然是烧屏的重灾区。如今的手机厂商往往会采取以下技术方案:每过一定时间,随机地平移屏保图像。这样,各个像素的发光时常就会更加均匀,不易引发烧屏。
可是,即便如此,烧屏的隐患也没有根本去除。理论上说,虽然屏保图像的位置会移动,但是屏幕上的所有像素的发光时常也不完全均等。只要时间足够长,烧屏依然会发生。Cuber QQ 非常好奇他的手机屏幕在很久以后烧屏情况如何。因此他把他的屏保图像和屏幕尺寸告诉了你,请求出期望的烧屏情况。
为了简化问题,我们规定如下。
屏幕是一个 a 行 b 列(下简称 a×b)的矩阵。屏保图像是一个 ()n×m(1≤n≤a,1≤m≤b) 的黑白图像。1 表示白色,0 表示黑色。当屏保图像显示在屏幕上时,白色对应的像素发光,屏幕上其余的所有像素不发光 (显然, 屏保至少有一点发光, 也就是图像中至少有一个 1)。
每分钟,这个屏保图像会等概率地随机出现在屏幕上的任何一个合法位置(合法位置满足:屏保图像上的每一个像素不超过屏幕边界,图像不缩放,不旋转)。因此学过数学的同学肯定会发现,屏幕一共有 (a−n+1)⋅(b−m+1) 种等概率的显示状态。
Cuber QQ 发现,一个像素的衰减系数和它的发光时长成正比。为了方便后续研究,Cuber QQ 规定屏幕上衰减程度最大(也就是发光时长最长)的像素的衰减系数为 100,其余像素的衰减系数以此为基准可以相应得出。
给定屏幕尺寸和屏保图案,请你求出经过足够长的时间,每一个像素期望的衰减系数。
输入格式
第一行 n,m,a,b (1≤a≤3840, 1≤b≤2160, 1≤n≤a, 1≤m≤b)。
接下来一个 n×m 的 01 矩阵表示屏保图案, 且矩阵中至少有一个 1。
输出格式
输出一个 a×b 的整数矩阵表示每个像素的衰减系数的整数部分 (即将衰减系数从小数向下取整)。根据题目描述,矩阵中的最大值显然为 100。
做法:
对于每一个像素矩阵中的‘1’点,可以在一个矩形区域上平移出现在其中任何一个位置
换句话说,原像素矩阵中的每一个‘1’,都对大矩阵上某一矩阵的每个点都有一次贡献
例如样例1中的这个像素点(1,2),可以通过平移到它右下矩形区域的任一位置,并对这些位置上的像素点有1的贡献
可以想到利用二维前缀和来统计矩阵上每个点‘1’像素出现的次数
通过观察很容易发现当table[i][j] = 1时,此时的‘1’能通过平移出现在(i,j)~(i + a - n, j + b - n)这个矩阵范围内
通过算二维前缀和在O(ab)的复杂度下可以得到每个格子‘1’像素点出现的次数
此时每个点的答案 = 该点出现‘1’的次数 * 100 / max(矩阵中各点‘1’的出现次数)
CODE
1 #include <bits/stdc++.h> 2 #define dbg(x) cout << #x << "=" << x << endl 3 #define eps 1e-8 4 #define pi acos(-1.0) 5 6 using namespace std; 7 typedef long long LL; 8 9 const int inf = 0x3f3f3f3f; 10 11 template<class T>inline void read(T &res) 12 { 13 char c;T flag=1; 14 while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0'; 15 while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag; 16 } 17 18 namespace _buff { 19 const size_t BUFF = 1 << 19; 20 char ibuf[BUFF], *ib = ibuf, *ie = ibuf; 21 char getc() { 22 if (ib == ie) { 23 ib = ibuf; 24 ie = ibuf + fread(ibuf, 1, BUFF, stdin); 25 } 26 return ib == ie ? -1 : *ib++; 27 } 28 } 29 30 int qread() { 31 using namespace _buff; 32 int ret = 0; 33 bool pos = true; 34 char c = getc(); 35 for (; (c < '0' || c > '9') && c != '-'; c = getc()) { 36 assert(~c); 37 } 38 if (c == '-') { 39 pos = false; 40 c = getc(); 41 } 42 for (; c >= '0' && c <= '9'; c = getc()) { 43 ret = (ret << 3) + (ret << 1) + (c ^ 48); 44 } 45 return pos ? ret : -ret; 46 } 47 48 int n,m,a,b; 49 50 int table[4000][4000]; 51 int ans[4000][4000]; 52 int sum[4000][4000]; 53 54 vector<pair<int,int>> v; 55 56 int main() 57 { 58 read(n); read(m); read(a); read(b); 59 for ( int i = 0; i < n; ++i ) { 60 for ( int j = 0; j < m; ++j ) { 61 int x; 62 read(x); 63 if(x == 1) { 64 table[i][j] ++; 65 table[i + a - n + 1][j]--; 66 table[i][j + b - m + 1]--; 67 table[i + a - n + 1][j + b - m + 1]++; 68 } 69 } 70 } 71 int temp = -1; 72 // for ( int i = 0; i <= a - n; ++i ) { 73 // for ( int j = 0; j <= b - m; ++j ) { 74 // for ( int k = 1; k <= n; ++k ) { 75 // for ( int z = 1; z <= m; ++z ) { 76 // table[i + k][j + z] += c[k][z]; 77 // } 78 // } 79 // } 80 // } 81 // for ( int i = 1; i <= n; ++i ) { 82 // for ( int j = 1; j <= m; ++j ) { 83 // table[i][j] = c[i][j]; 84 // } 85 // } 86 for ( int i = 0; i <= a; ++i ) { 87 for ( int j = 0; j <= b; ++j ) { 88 if(i) { 89 table[i][j] += table[i - 1][j]; 90 } 91 if(j) { 92 table[i][j] += table[i][j - 1]; 93 } 94 if(i && j) { 95 table[i][j] -= table[i - 1][j - 1]; 96 } 97 temp = max(temp, table[i][j]); 98 } 99 } 100 // for ( int i = 0; i <= a; ++i ) { 101 // for ( int j = 0; j <= b; ++j ) { 102 // cout << table[i][j] << ' '; 103 // } 104 // puts(""); 105 // } 106 // dbg(temp); 107 // for ( int i = 1; i <= a; ++i ) { 108 // for ( int j = 1; j <= b; ++j ) { 109 // cout << table[i][j] << ' '; 110 // } 111 // puts(""); 112 // } 113 // for ( int i = 1; i <= a; ++i ) { 114 // for ( int j = 1; j <= b; ++j ) { 115 // cout << table[i][j] << ' '; 116 // } 117 // puts(""); 118 // } 119 for ( int i = 0; i < a; ++i ) { 120 for ( int j = 0; j < b; ++j ) { 121 printf("%d ",table[i][j] * 100 / temp); 122 } 123 puts(""); 124 } 125 return 0; 126 }