TLE 求卡常
查看原帖
TLE 求卡常
252549
Iwara楼主2024/5/9 12:40

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(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0); 
	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]){
				ll res=0;
				for(int i=t[block_num[x]].l;i<=t[block_num[x]].r;i++)if(a[i].num>=z&&a[i].id>=x&&a[i].id<=y)res++;
				cout<<res<<'\n';
				continue;
			}
			ll res=0;
			for(int i=t[block_num[x]].l;i<=t[block_num[x]].r;i++)if(a[i].num>=z&&a[i].id>=x&&a[i].id<=y)res++;
			for(int i=t[block_num[y]].l;i<=t[block_num[y]].r;i++)if(a[i].num>=z&&a[i].id>=x&&a[i].id<=y)res++;
			for(int i=block_num[x]+1;i<=block_num[y]-1;i++)res+=solve(t[i].l,t[i].r,z);
			cout<<res<<'\n';
		}
	}
	return 0;
} 
2024/5/9 12:40
加载中...