比赛 |
2025.5.4 |
评测结果 |
WWWWWWWWWW |
题目名称 |
数列操作η |
最终得分 |
0 |
用户昵称 |
彭欣越 |
运行时间 |
3.194 s |
代码语言 |
C++ |
内存使用 |
11.77 MiB |
提交时间 |
2025-05-04 11:54:05 |
显示代码纯文本
#include <bits/stdc++.h>
#define ls p*2
#define rs p*2+1
using namespace std;
typedef long long ll;
const int N=100010;
ll n,q;
double a[N],s1[N],s2[N];
struct node {
int l,r;
double v,t;
}tr[N*4];
void build (int p,int l,int r) {
tr[p].l=l;
tr[p].r=r;
tr[p].t=0;
if (l==r) {
tr[p].v=0;
return;
}
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
tr[p].v=tr[ls].v+tr[rs].v;
}
void pushdown (int p) {
tr[ls].t+=tr[p].t;
tr[rs].t+=tr[p].t;
tr[ls].v+=tr[p].t*(s1[tr[ls].r]-s1[tr[ls].l-1])/(s2[tr[ls].r]/s2[tr[ls].l-1]);
tr[rs].v+=tr[p].t*(s1[tr[rs].r]-s1[tr[rs].l-1])/(s2[tr[rs].r]/s2[tr[rs].l-1]);
tr[p].t=0;
}
double query (int p,int l,int r) {
if (tr[p].l>=l&&tr[p].r<=r) return tr[p].v;
int mid=(tr[p].l+tr[p].r)/2;
double sum=0;
pushdown(p);
if (l<=mid) sum+=query(ls,l,r);
if (r>mid) sum+=query(rs,l,r);
return sum;
}
void update (int p,int l,int r) {
if (tr[p].l>=l&&tr[p].r<=r) {
tr[p].t+=1;
tr[p].v+=(s1[tr[p].r]-s1[tr[p].l-1])/(s2[tr[p].r]/s2[tr[p].l-1]);
return;
}
int mid=(tr[p].l+tr[p].r)/2;
pushdown(p);
if (l<=mid) update(ls,l,r);
if (r>mid) update(rs,l,r);
tr[p].v=tr[ls].v+tr[rs].v;
}
int main () {
freopen("eta.in","r",stdin);
freopen("eta.out","w",stdout);
cin >> n >> q;
memset(s2,1,sizeof(s2));
for (int i=1;i<=n;i++) {
cin >> a[i];
s1[i]=s1[i-1]+a[i];
s2[i]=s2[i-1]*a[i];
}
build(1,1,n);
while (q--) {
string s;
int l,r;
cin >> s >> l >> r;
if (s[0]=='a') {
update(1,l,r);
}else{
cout << (ll)query(1,l,r) <<endl;
}
}
return 0;
}