• 板块灌水区
  • 楼主lfxxx_
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/10/9 13:58
  • 上次更新2024/10/9 18:00:24
查看原帖
795344
lfxxx_楼主2024/10/9 13:58

为什么我的代码比同学的快? 我的:

#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

2024/10/9 13:58
加载中...