zoukankan      html  css  js  c++  java
  • EOJ月赛-OLED【二维前缀和】

    C. OLED

    单点时限: 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 }
  • 相关阅读:
    apache、php隐藏http头部版本信息的实现方法
    CentOs 设置静态IP 方法
    PHP如何判断远程图片文件是否存在
    linux删除乱码文件
    Linux基础学习1
    C#——继承
    解决简体输出乱码问题
    简单的Tuple声明和输出
    懒汉式与饿汉式的区别
    Java 反射
  • 原文地址:https://www.cnblogs.com/orangeko/p/13369803.html
Copyright © 2011-2022 走看看