社区讨论
95pts TLE #20 求助
P10516数据结构参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lwd3uec4
- 此快照首次捕获于
- 2024/05/19 13:36 2 年前
- 此快照最后确认于
- 2024/05/19 15:56 2 年前
rt,主要思路是记录区间内 的最小值,如果 说明这个区间不需要修改。然后 TLE 最后一个点,感觉是
CPPlong long 计算太慢,不知如何优化。#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct Data
{
int l,r,a,b,minn,ok;
long long sum;
}t[400005];
int n,m,a[N],b[N];
void build(int k,int l,int r)
{
t[k].l=l,t[k].r=r;
if(l==r)
{
t[k].sum=a[l]+b[l];
t[k].a=a[l];
t[k].b=b[l];
if(a[l]>N&&b[l]>N) t[k].minn=INT_MAX;
else if((long long)a[l]*b[l]>N) t[k].minn=INT_MAX;
else t[k].minn=a[l]*b[l];
return;
}
int mid=l+r>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
t[k].sum=t[k*2].sum+t[k*2+1].sum;
t[k].minn=min(t[k*2].minn,t[k*2+1].minn);
return;
}
void update1(int k,int l,int r,int x,int y)
{
if(t[k].minn>x) return;
if(t[k].l==t[k].r)
{
t[k].a+=y;
t[k].b+=y;
t[k].sum+=y+y;
if(t[k].a>N&&t[k].b>N) t[k].minn=INT_MAX;
else if((long long)t[k].a*t[k].b>N) t[k].minn=INT_MAX;
else t[k].minn=t[k].a*t[k].b;
return;
}
int mid=t[k].l+t[k].r>>1;
if(l<=mid) update1(k*2,l,r,x,y);
if(r>mid) update1(k*2+1,l,r,x,y);
t[k].sum=t[k*2].sum+t[k*2+1].sum;
t[k].minn=min(t[k*2].minn,t[k*2+1].minn);
return;
}
void update2(int k,int l,int x,int y)
{
if(t[k].l==t[k].r&&t[k].l==l)
{
t[k].a=x;
t[k].b=y;
t[k].sum=x+y;
if(t[k].a>N&&t[k].b>N) t[k].minn=INT_MAX;
else if((long long)t[k].a*t[k].b>N) t[k].minn=INT_MAX;
else t[k].minn=t[k].a*t[k].b;
return;
}
int mid=t[k].l+t[k].r>>1;
if(l<=mid) update2(k*2,l,x,y);
if(l>mid) update2(k*2+1,l,x,y);
t[k].sum=t[k*2].sum+t[k*2+1].sum;
t[k].minn=min(t[k*2].minn,t[k*2+1].minn);
return;
}
long long query(int k,int l,int r)
{
if(l<=t[k].l&&t[k].r<=r) return t[k].sum;
int mid=t[k].l+t[k].r>>1;
long long ans=0;
if(l<=mid) ans+=query(k*2,l,r);
if(r>mid) ans+=query(k*2+1,l,r);
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
build(1,1,n);
while(m--)
{
int op,x,y,z,w;
cin>>op>>x>>y;
if(op==1) cin>>z>>w,update1(1,x,y,z,w);
if(op==2) cin>>z,update2(1,x,y,z);
if(op==3) cout<<query(1,x,y)<<"\n";
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...