1 条题解

  • 0
    @ 2026-8-19 9:09:59

    不会主席树怎么办?来尝试分块吧。

    这题不带修我不是很认可。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=2e5+10,M=1010;
    int a[N],a1[N],s1[N],n,B;
    void pushup(int x)
    {
    	int l=(x-1)*B+1,r=min(n,x*B);
    	for(int i=l;i<=r;i++)a1[i]=a[i];
    	sort(a1+l,a1+r+1);
    	s1[l]=a1[l];for(int i=l+1;i<=r;i++)s1[i]=s1[i-1]+a1[i];
    }
    int query(int l,int r,int x)
    {
    	int bl=(l-1)/B+1,br=(r-1)/B+1,ans=0;
    	if(bl==br)
    	{
    		for(int i=l;i<=r;i++)
    			if(a[i]<=x)ans+=a[i];
    	}
    	else
    	{
    		for(int i=l;i<=bl*B;i++)
    			if(a[i]<=x)ans+=a[i];
    		for(int i=(br-1)*B+1;i<=r;i++)
    			if(a[i]<=x)ans+=a[i];
    		for(int i=bl+1;i<br;i++)
    		{
    			if(a1[(i-1)*B+1]>x)continue;
    			int l=1,r=B,res=1;
    			while(l<=r)
    			{
    				int mid=(l+r)>>1;
    				if(a1[(i-1)*B+mid]<=x)l=mid+1,res=mid;
    				else r=mid-1;
    			}
    			ans+=s1[(i-1)*B+res];
    		}
    	}
    	return ans;
    }
    signed main()
    {
    	int q,lst=0;cin>>n;B=sqrt(n);
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=(n-1)/B+1;i++)pushup(i);
    	cin>>q;
    	while(q--)
    	{
    		int l,r,x;cin>>l>>r>>x;
    		l^=lst,r^=lst,x^=lst;
    		int ans=query(l,r,x);
    		cout<<ans<<'\n';
    		lst=ans;
    	}
    	return 0;
    }
    • 1

    信息

    ID
    8240
    时间
    3500ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    15
    已通过
    3
    上传者