0
点赞
收藏
分享

微信扫一扫

杭电多校三

有点d伤 2022-03-27 阅读 65

1007 Photoshop Layers

比赛的时候想着模拟,tle了,想到m[i]为1则前面无论如何都变成当前的数,结果还是tle了,最后修修整整也没想到正解,正解其实就是因为从m[i]为1从后再将每个数相加和255比较,所以提前处理,将所有的数先加起来,到每求一个区间再相减,就不想每次都再算,大大降低复杂度,还有一个就是%X十六进制的这个,比赛的时候字符串转数字再转字符串太麻烦了,也是没想到这个,学到了.下次有十六进制数的时候考虑一下这个.

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int m[N],x,r[N],g[N],b[N],w[N];

int solve(int a[],int l,int r){
	int ll=max(l,w[r]);
	int ans=(a[r]-a[ll-1])<255?a[r]-a[ll-1]:255;
	return ans;
}

signed main() {
	int t;
	scanf("%lld",&t);
	while(t--) {
		int n,q;
		scanf("%lld %lld",&n,&q);
		for(int i=1; i<=n; i++) {
//			cin>>m[i];
			scanf("%lld %X",&m[i],&x);
			b[i]=b[i-1]+x%256;
			x=x/256;
			g[i]=g[i-1]+x%256;
			x=x/256;
			r[i]=r[i-1]+x;
			if(m[i]==1)w[i]=i;
			else w[i]=w[i-1];
		}
		while(q--){
			int l,p;
			scanf("%lld %lld",&l,&p);
//			cin>>l>>p;
			printf("%02X%02X%02X\n",solve(r,l,p),solve(g,l,p),solve(b,l,p));
		}
	}
}

举报

相关推荐

0 条评论