Photoshop Layers
题目链接:
题目大意:
给你 N 个RGB颜色数据,每个数据有一个操作,如果是1的话就覆盖上一个颜色,如果是2的话就叠加上一个颜色(颜色的最高强度不会超过255)。给你 K 次询问,每次询问X,Y两个值,输出从X到Y的颜色相加的结果。
题解:
在说题解之前先介绍几个大家都会的基本知识(估计就我忘了 呜~库鲁西):
- c语言是可以直接读入十六进制的数的,方法为 scanf(“%x”)
- c语言是可以直接输出十六进制的数的,方法为 printf(“%x”)或(“%X”)(对应字母大小写)。
所以我们需要做的事情比较简单,将整个颜色数据分成三个十六进制数,分别将对应数据以及对应前缀和存储下来,再用一个数组存储上一个出现的‘1’操作的位置,然后在询问的时候只要O(1)输出右端点和左端点与上一个‘1‘ 操作位置的最大值相减再加上当前位置的数即可。
由于HDU的评测机过慢,数据卡的过死,这题除了printf以外的所有输出方式都会导致tle(在比赛的时候这题是1s,比赛结束之后改成3s了,HDU真有你的)
有人不会用十六进制输入输出,但是我不说是谁
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
const int inf=0x3f3f3f3f;
int R[N],G[N],B[N];
int R1[N],G1[N],B1[N];
int vx[N];
int las[N];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(vx,0,sizeof(vx));
int n,k;
cin>>n>>k;
vx[1]=1;
for(int i=1;i<=n;i++)
{
int d;
scanf("%d%x",&d,&R[i]);
B[i]=R[i]%256;
R[i]/=256;
G[i]=R[i]%256;
R[i]/=256;
R[i]%=256;
if(d==1){
vx[i]=i;
}else{
vx[i]=vx[i-1];
}
R1[i]=R1[i-1]+R[i];
G1[i]=G1[i-1]+G[i];
B1[i]=B1[i-1]+B[i];
}
while(k--)
{
int x,y;
scanf("%d%d",&x,&y);
x=max(x,vx[y]);
int a1,a2,a3;
a1=R1[y]-R1[x]+R[x];
a2=G1[y]-G1[x]+G[x];
a3=B1[y]-B1[x]+B[x];
if(a1>255) a1=255;
if(a2>255) a2=255;
if(a3>255) a3=255;
// printf("%x\n",()%256);
// printf("%x\n",(G1[y]-G1[x]+G[x])%256);
// printf("%x\n",(B1[y]-B1[x]+B[x])%256);
printf("%02X%02X%02X\n",a1,a2,a3);
}
}
return 0;
}