ps:
题意:有n次操作,操作有两种①操作一:使这次操作后的颜色都为当前RGB,②操作二:使当前的颜色RGB为上一次操作的颜色的RGB加上输入的RGB,超过255时为255,现在有q次询问,每次询问输入l,r,问一颜色RGB初始为(00,00,00)的背景通过l-r的操作后是什么颜色
解析:模拟+前缀和
当操作是操作二时,RGB加上即可(不管上限),当是操作一时,直接赋值RGB即可
AcCode:
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
const int N =2e5+100;
int arr[N][4];
int sum[N][4];
inline int min(int a,int b){return (a<b)?a:b;}
signed main(){
int t;scanf("%d",&t);
while(t--){
int n,q;scanf("%d %d",&n,&q);
for(int i=1,p;i<=n;i++){
scanf("%d %X",&arr[i][0],&p);
sum[i][3]=p%256;
p>>=8;
sum[i][2]=p%256;
p>>=8;
sum[i][1]=p;
sum[i][0]=i;
if(arr[i][0]==2){
sum[i][0]=sum[i-1][0];
sum[i][1]+=sum[i-1][1];
sum[i][2]+=sum[i-1][2];
sum[i][3]+=sum[i-1][3];
}
}
while(q--){
int l,r;scanf("%d %d",&l,&r);
if(l>sum[r][0]) printf("%02X%02X%02X\n",min(sum[r][1]-sum[l-1][1],255),min(sum[r][2]-sum[l-1][2],255),min(sum[r][3]-sum[l-1][3],255));
else printf("%02X%02X%02X\n",min(sum[r][1],255),min(sum[r][2],255),min(sum[r][3],255));
}
}
}