2021HDU多校联赛 3 Photoshop Layers

Photoshop Layers

题目链接:

Photoshop Layers

题目大意:

给你 N 个RGB颜色数据,每个数据有一个操作,如果是1的话就覆盖上一个颜色,如果是2的话就叠加上一个颜色(颜色的最高强度不会超过255)。给你 K 次询问,每次询问X,Y两个值,输出从X到Y的颜色相加的结果。

题解:

在说题解之前先介绍几个大家都会的基本知识(估计就我忘了 呜~库鲁西):

  1. c语言是可以直接读入十六进制的数的,方法为 scanf(“%x”)
  2. 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;
}

相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

鬼人明灯

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值