分块 WA 求调
查看原帖
分块 WA 求调
252549
Iwara楼主2024/5/8 17:24

rt

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5;
ll n,blen,q,op,x,y,z;
struct node{
	ll num,id;
}a[MAXN];
struct block{
	ll l,r;
}t[1005]; 
ll cnt,block_num[MAXN];
bool cmp_num(node n1,node n2){
	return n1.num<n2.num;
}
bool cmp_id(node n1,node n2){
	return n1.id<n2.id;
}
ll solve(ll L,ll R,ll X){
	if(X>a[R].num)return 0;
	ll mid=0,reg=R,ans=R;
	while(L<=R){
		mid=(L+R)>>1;
		if(a[mid].num>=X)R=mid-1,ans=min(ans,mid);
		else L=mid+1; 
	}
	return reg-ans+1;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i].num;
	for(int i=1;i<=n;i++)a[i].id=i;
	blen=sqrt(n);
	for(int i=1;i<=n;i+=blen){
		cnt++;
		t[cnt].l=i;
		t[cnt].r=min(i+blen-1,n);
		for(int j=t[cnt].l;j<=t[cnt].r;j++)block_num[j]=cnt;
	}
	for(int i=1;i<=cnt;i++)sort(a+t[i].l,a+1+t[i].r,cmp_num);
	cin>>q;
	for(int i=1;i<=q;i++){
		cin>>op;
		if(op){
			cin>>x>>y;
			ll b_id=block_num[x];
			sort(a+t[b_id].l,a+1+t[b_id].r,cmp_id);
			a[x].num=y;
			sort(a+t[b_id].l,a+1+t[b_id].r,cmp_num);
		}
		else{
			cin>>x>>y>>z;
			if(block_num[x]==block_num[y]){
				cout<<solve(x,y,z)<<endl;
				continue;
			}
			ll res=0;
			res+=solve(x,t[block_num[x]].r,z);
			res+=solve(t[block_num[y]].l,y,z);
			for(int i=block_num[x]+1;i<=block_num[y]-1;i++)res+=solve(t[i].l,t[i].r,z);
			cout<<res<<endl;
		}
	}
	return 0;
} 

不知道哪里错了。

2024/5/8 17:24
加载中...