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));
}
}
}