社区讨论

95pts TLE #20 求助

P10516数据结构参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lwd3uec4
此快照首次捕获于
2024/05/19 13:36
2 年前
此快照最后确认于
2024/05/19 15:56
2 年前
查看原帖
rt,主要思路是记录区间内 ai×bia_i\times b_i 的最小值,如果 >k>k 说明这个区间不需要修改。然后 TLE 最后一个点,感觉是 long long 计算太慢,不知如何优化。
CPP
#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 条回复,欢迎继续交流。

正在加载回复...