1007 Photoshop Layers
比赛的时候想着模拟,tle了,想到m[i]为1则前面无论如何都变成当前的数,结果还是tle了,最后修修整整也没想到正解,正解其实就是因为从m[i]为1从后再将每个数相加和255比较,所以提前处理,将所有的数先加起来,到每求一个区间再相减,就不想每次都再算,大大降低复杂度,还有一个就是%X十六进制的这个,比赛的时候字符串转数字再转字符串太麻烦了,也是没想到这个,学到了.下次有十六进制数的时候考虑一下这个.
#includeusing 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%02Xn",solve(r,l,p),solve(g,l,p),solve(b,l,p)); } } }



