为什么我的代码比同学的快? 我的:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,B=2e5+5;
int a[N],L[B],R[B],pos[N];
vector<int>block[B],sum[B];
int query(int l,int r,int d)
{
int x=pos[l],y=pos[r],ans=0;
if(x==y)
{
for(int i=l;i<=r;++i)
if(a[i]<=d)
ans+=a[i];
return ans;
}
ans+=query(l,R[x],d)+query(L[y],r,d);
for(int i=x+1;i<y;++i)
{
int pos=upper_bound(block[i].begin(),block[i].end(),d)-block[i].begin()-1;
if(pos>=0&&block[i][pos]<=d)
ans+=sum[i][pos];
}
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
int t=sqrt(n);
for(int i=1;i<=t;++i)
L[i]=(i-1)*t+1,R[i]=i*t;
if(R[t]<n)
{
++t;
L[t]=R[t-1]+1;
R[t]=n;
}
for(int i=1;i<=t;++i)
{
for(int j=L[i];j<=R[i];++j)
{
pos[j]=i;
block[i].emplace_back(a[j]);
}
sort(block[i].begin(),block[i].end());
sum[i].emplace_back(block[i][0]);
for(int j=1;j<(int)block[i].size();++j)
sum[i].emplace_back(block[i][j]+sum[i][j-1]);
}
cin>>m;
int lst=0;
while(m--)
{
int l,r,k;
cin>>l>>r>>k;
l^=lst,r^=lst,k^=lst;
cout<<(lst=query(l,r,k))<<'\n';
}
}
AC
同学(stars_visitor_tyw)的
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+5;
int a[N];
int L[N], R[N], pos[N], n, m, t;
vector<int> num[N],sum[N];
int query(int lt, int rt, int val)
{
int ans=0, x=pos[lt], y=pos[rt];
if(x==y)
{
for(int i=lt;i<=rt;i++)
{
if(a[i]<=val)
{
ans+=a[i];
}
}
}
else
{
for(int i=lt;i<=R[x];i++)
{
if(a[i]<=val)ans+=a[i];
}
for(int i=L[y];i<=rt;i++)
{
if(a[i]<=val)ans+=a[i];
}
for(int i=x+1;i<y;i++)
{
ans+=sum[i][upper_bound(num[i].begin(),num[i].end(),val)-num[i].begin()];
}
}
return ans;
}
int lst;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
}
cin>>n;
t=sqrt(m);
for(int i=1;i<=t;i++)
{
L[i]=(i-1)*t+1;
R[i]=i*t;
}
if(R[t]<m)
{
t++;
L[t]=R[t-1]+1;
R[t]=m;
}
for(int i=1;i<=t;i++)
{
for(int j=L[i];j<=R[i];j++)
{
pos[j]=i;
num[i].push_back(a[j]);
}
sort(num[i].begin(),num[i].end());
sum[i].resize(num[i].size()+1);
for(int j=1;j<=num[i].size();++j)sum[i][j]=sum[i][j-1]+num[i][j-1];
}
for(int i=1;i<=n;i++)
{
int x, y, c;
cin>>x>>y>>c;
x^=lst,y^=lst,c^=lst;
int tmp=query(x,y,c);
cout<<tmp<<"\n";
lst=tmp;
}
}
TLE 题目:ABC339G