ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HDU 6979. Photoshop Layers

2021-07-28 14:33:24  阅读:165  来源: 互联网

标签:Layers Photoshop HDU 颜色 int res 0xFF 图层 255


HDU 6979. Photoshop Layers

题意:

颜色可以通过\((R,G,B)\)来表示,其中\(R,G,B\)是\([0,255]\)​上的整数,从而一个像素的颜色可以用一个\(6\)位十六进制数表示。例如:\((R=100,G=255,B=50)\)可以被表示成64FF32​。

现有\(n\)​​个图层,每一图层的所有像素颜色都相同,从底到顶依次编号为\(1,2,3,...,n\)​​​​。屏幕将会从底到顶地处理这些图层。为方便描述,记第\(i\)​层的颜色是\(c_i=(R_i,G_i,B_i)\)​,混合方式为\(m_i(m_i\in \{1,2\})\)​

  • 若\(m_i=1\)​​​,混合方式为“普通”,即假定前面所有层的显示的颜色为\((R_p,G_p,B_p)\),加上这一层后的颜色后为\((R_i,G_i,B_i)\)​。
  • 若\(m_i=2\),混合方式为“线性减淡”,即假定前面所有层的显示的颜色为\((R_p,G_p,B_p)\)​,加上这一层后的颜色为\((\min(R_p+R_i,255),\min(G_p+G_i,255),\min(B_p+B_i,255))\)

现在有\(q\)个询问,第\(i\)个询问中会给出\(l_i,r_i(1\leq l_i\leq r_i \leq n)\)​,问:只保留\([l_i,r_i]\)​​区间的图层,最终屏幕上显示的颜色。

分析:

不涉及修改操作,可以考虑维护前\(i\)个图层的颜色前缀和\(r_i,g_i,b_i\)以及对于第\(i\)个图层,它底下离它最近的(包括它本身)混合方式为“普通”的图层编号\(f_i\)​。询问时,若\(f_r<l\),答案则为区间\([l,r]\)的和(超过255按255计算),反之,答案则为\([f_r,r]\)的和。

由于一个十六进制数的\(1\)​位恰好对应二进制数的\(4\)位,故对于一个用\(6\)位十六进制表示的颜色\(x\),可以使用位运算来取出它对应分量(\(R,G,B\))的值。

取出方法:

r[i] = (x >> 16) & 0xFF;
g[i] = (x >> 8) & 0xFF;
b[i] = x & 0xFF;

C/C++中的scanfcin都自带读入十六进制数的方法,具体方法可以上网查找。

代码:

#include <cstdio>
const int maxn = 1e5 + 10;
int r[maxn], g[maxn], b[maxn], f[maxn];
int query(int* p, int l, int r) {
    int t = f[r], res;
    if (t < l)
        res = p[r] - p[l - 1];
    else
        res = p[r] - p[t - 1];
    return res > 0xFF ? 0xFF : res;
}
void solve() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        int t, x;
        scanf("%d%X", &t, &x);
        r[i] = (x >> 16) & 0xFF;
        g[i] = (x >> 8) & 0xFF;
        b[i] = (x)&0xFF;
        r[i] += r[i - 1];
        g[i] += g[i - 1];
        b[i] += b[i - 1];
        if (t == 1)
            f[i] = i;
        else
            f[i] = f[i - 1];
    }
    while (m--) {
        int x, y;
        scanf("%d%d", &x, &y);
        printf("%02X%02X%02X\n", query(r, x, y), query(g, x, y),
               query(b, x, y));
    }
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) solve();
    return 0;
}

标签:Layers,Photoshop,HDU,颜色,int,res,0xFF,图层,255
来源: https://www.cnblogs.com/Bamboo-Wind/p/15070286.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有