代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e4+10;
int n,s,t;
int a[N];
struct tr{
int l,r,lazy;
double sum,fac,minn=0x3f3f3f3f;
}tree[N*4];
void pushup(int u){
tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;
tree[u].minn=min(tree[u<<1].minn,tree[u<<1|1].minn);
}
void build(int u,int l,int r){
tree[u].l=l;tree[u].r=r;
if(l==r){
tree[u].sum=a[l];
tree[u].minn=a[r];
return ;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void pushdown1(int u){
if(tree[u].fac&&tree[u].lazy){
tree[u<<1].sum=tree[u<<1].sum*(tree[u<<1].r-tree[u<<1].l+1)*tree[u].fac;
tree[u<<1|1].sum=tree[u<<1|1].sum*(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].fac;
tree[u<<1].fac=tree[u<<1].fac*(0.1*tree[u].fac);
tree[u<<1|1].fac=tree[u<<1|1].fac*(0.1*tree[u].fac);
tree[u].fac=0;
}
if(tree[u].lazy){
tree[u<<1].sum-=(tree[u<<1].r-tree[u<<1].l+1)*tree[u].lazy;
tree[u<<1|1].sum-=(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].lazy;
tree[u<<1].lazy+=tree[u].lazy;
tree[u<<1|1].lazy+=tree[u].lazy;
tree[u].lazy=0;
}
}
void modify1(int u,int l,int r,int k){
if(l<=tree[u].l&&tree[u].r<=r){
tree[u].sum-=(tree[u].r-tree[u].l+1)*k;
tree[u].minn-=k;
tree[u].lazy+=k;
return ;
}
pushdown1(u);
int mid=(tree[u].l+tree[u].r)>>1;
if(l<=mid) modify1(u<<1,l,r,k);
if(mid<r) modify1(u<<1|1,l,r,k);
pushup(u);
}
void pushdown2(int u){
if(tree[u].fac){
tree[u<<1].sum=tree[u<<1].sum*(tree[u<<1].r-tree[u<<1].l+1)*tree[u].fac;
tree[u<<1|1].sum=tree[u<<1|1].sum*(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].fac;
tree[u<<1].fac=tree[u<<1].fac*(0.1*tree[u].fac);
tree[u<<1|1].fac=tree[u<<1|1].fac*(0.1*tree[u].fac);
tree[u].fac=0;
pushup(u);
}
}
void modify2(int u,int l,int r,int k){
if(l<=tree[u].l&&tree[u].r<=r){
tree[u].sum=tree[u].sum*(tree[u].r-tree[u].l+1)*(0.1*k);
tree[u].fac=tree[u].fac*(0.1*k);
return ;
}
pushdown2(u);
int mid=(tree[u].l+tree[u].r)>>1;
if(l<=mid) modify2(u<<1,l,r,k);
if(mid<r) modify2(u<<1|1,l,r,k);
pushup(u);
}
double query1(int u,int l,int r){
if(l<=tree[u].l&&tree[u].r<=r){
return tree[u].sum;
}
int mid=(tree[u].l+tree[u].r)>>1;
double ans=0;
if(l<=mid) ans+=query1(u<<1,l,r);
if(mid<r) ans+=query1(u<<1|1,l,r);
return ans;
}
double query2(int u,int l,int r){
if(l<=tree[u].l&&tree[u].r<=r){
return tree[u].minn;
}
int mid=(tree[u].l+tree[u].r)>>1;
double ans=0x3f3f3f3f;
if(l<=mid) ans=min(query2(u<<1,l,r),ans);
if(mid<r) ans=min(query2(u<<1|1,l,r),ans);
return ans;
}
signed main(){
scanf("%lld%lld",&n,&s);
for(int i=1;i<=n;i++) scanf("%lld",a+i);
scanf("%lld",&t);
build(1,1,n);
while(t--){
int op,x,y,k;
scanf("%lld%lld%lld",&op,&x,&y);
if(op==1){
scanf("%lld",&k);
modify1(1,x,y,k);
}else if(op==2){
scanf("%lld",&k);
modify2(2,x,y,k);
}else if(op==3){
double ans=query1(1,x,y),mi=query2(1,x,y);
if(ans<=s) printf("You know I can do it!\n%.2lf\n",ans);
else printf("That's ok for me.\n%.2lf\n",ans-mi);
// printf("%.2lf\n",ans-mi);
}
}
return 0;
}
个人感觉应该是在打折上面出了问题。。。
求调j
sto sto sto 巨佬 orz orz orz