Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
75221 赵诗蕾 【J】T3 C++ 通过 100 73 MS 4440 KB 1935 2026-06-22 21:33:45

Tests(25/25):


#include<bits/stdc++.h> #define int long long using namespace std; const int INS=1e18; signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; /* nxt[j]表示从位置j开始,第一个乘法的位置 val[i]表示位置i的乘法操作的乘数 sum[i]表示到位置i为止,所有加法操作的累加和 */ vector<int> sum(n+5,0),nxt(n+5,0),val(n+5,0),v; int lst=0;//上一个乘法操作的位置 for(int i=1;i<=n;i++) { int op,x; cin>>op>>x; if(op==2&&x==1)//*1相当于+0 { op=1; x=0; } if(op==1) { sum[i]=sum[i-1]+x;//在前面数的基础上加一个数 v.push_back(i); } else { for(int j=lst+1;j<=i;j++) { nxt[j]=i; } lst=i;//更新位置编号 val[i]=x;//存储这个乘法操作的乘数 sum[i]=sum[i-1];//乘法位置本身不贡献加法,所以前缀和保持不变 } } while(q--) { int l,r; cin>>l>>r; auto it=lower_bound(v.begin(),v.end(),l);//找到区间内第一个加法位置 if(it==v.end()||*it/*迭代器指向的位置*/>r)//判断区间内是否全是乘法 { cout<<0<<"\n"; continue; } int x/*要处理的位置(第1个加法开始)*/=*it,now/*当前计算结果(从0开始)*/=0; while(x<=r) { int jt=nxt[x]; if(!jt||jt>r)//没有乘法 或 乘法在r之后 { now=min(INS,now+sum[r]-sum[x-1]);//直接加上加法的和 break; } else//遇到了乘法 { now=min(INS,now+sum[jt-1]-sum[x-1]);//先加从x到jt-1的所有加法 now=min(INS,now*val[jt]);//再乘以jt位置的乘数 x=jt+1;//再从乘法后面开始 } if(now==INS)//如果溢出,就直接退出循环 { break; } } cout<<(now==INS?-1:now)<<"\n"; } return 0; }


测评信息: