Homework Introduction

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int a[N],n,len;//len=sqrt(n)
int id[N],sum[N],tag[N]; //id[i]第i个点所在的块.sum[i]第i块的和,tag[i]代表第i块修改的值 
int query(int x)
{
	return a[x]+tag[id[x]];
}
void add(int l,int r,int c)
{
	int fx = id[l],fy=id[r];
	if(fx==fy){
		for(int i=l;i<=r;i++)a[i]+=c;
	}
	else{
		//先处理起点的一块,暴力
		for(int i=l;id[i]==fx;i++){
			a[i]+=c;
		}
		//处理中间的所有块
		for(int i=fx+1;i<fy;i++){
			tag[i]+=c;
		} 
		//处理最后一块
		for(int i=r;id[i]==fy;i--){
			a[i]+=c;
		} 
	}
} 
int main()
{
	cin>>n;
	len = sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		id[i] = (i-1)/len+1;
		sum[id[i]]+=a[i];
	}
	for(int i=1;i<=n;i++){
		int opt,l,r,c;
		cin>>opt>>l>>r>>c;
		if(opt==0){
			add(l,r,c);
		}
		else{
			cout<<query(r)<<endl;
		}
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int n,a[N],len,id[N],tag[N];
vector<int>v[N];
void update(int p)
{
	v[p].clear();
	for(int i=(p-1)*len+1;id[i]==p;i++){
		a[i]+=tag[p];
		v[p].push_back(a[i]);
	}
	tag[p] = 0;
	sort(v[p].begin(),v[p].end());
}
void add(int l,int r,int c)
{
	int fx = id[l],fy = id[r];
	if(fx==fy){
		for(int i=l;i<=r;i++){
			a[i]+=c;
		}
		update(fx);
	}
	else{
		for(int i=l;id[i]==fx;i++){
			a[i]+=c;
		}
		update(fx);
		for(int i=fx+1;i<fy;i++){
			tag[i]+=c;
		}
		for(int i=r;id[i]==fy;i--){
			a[i]+=c;
		}
		update(fy);
	}
}
int query(int l,int r,int c)
{
	int fx=id[l],fy=id[r],cnt=0;
	if(fx==fy){
		for(int i=l;i<=r;i++){
			if(a[i]+tag[id[i]]<c)cnt++;
		}
		return cnt;
	}
	else{
		for(int i=l;id[i]==fx;i++){
			if(a[i]+tag[id[i]]<c)cnt++;
		}
		for(int i=fx+1;i<fy;i++){
			cnt+=lower_bound(v[i].begin(),v[i].end(),c-tag[i])-v[i].begin();
		}
		for(int i=r;id[i]==fy;i--){
			if(a[i]+tag[id[i]]<c)cnt++;
		}
		return cnt;
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	len = sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		id[i] = (i-1)/len+1;
		v[id[i]].push_back(a[i]);
	}
	for(int i=1;i<=(n-1)/len+1;i++){
		sort(v[i].begin(),v[i].end());
	}
	for(int i=1;i<=n;i++){
		int opt,l,r,c;
		cin>>opt>>l>>r>>c;
		if(opt==0){
			add(l,r,c);
		}
		else cout<<query(l,r,c*c)<<"\n";
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n,id[N],a[N],tag[N],len;
vector<int>v[N];
void update(int p)
{
	v[p].clear();
	for(int i=(p-1)*len+1;id[i]==p;i++){
		a[i]+=tag[p];
		v[p].push_back(a[i]);
	}
	tag[p] = 0;
	sort(v[p].begin(),v[p].end());
}
void add(int l,int r,int c)
{
	int fx=id[l],fy=id[r];
	if(fx==fy){
		for(int i=l;i<=r;i++){
			a[i]+=c;
		}
		update(fx);
	}
	else{
		for(int i=l;id[i]==fx;i++){
			a[i]+=c;
		}
		update(fx);
		for(int i=fx+1;i<fy;i++){
			tag[i]+=c;
		}
		for(int i=r;id[i]==fy;i--){
			a[i]+=c;
		} 
		update(fy);
	}
}
int query(int l,int r,int c)
{
	int fx = id[l],fy=id[r],res=-2147483648;
	if(fx==fy){
		for(int i=l;i<=r;i++){
			if(a[i]+tag[id[i]]<c)res = max(res,a[i]+tag[id[i]]);
		}
		if(res==-2147483648)res = -1;
		return res;
	}
	else{
		for(int i=l;id[i]==fx;i++){
			if(a[i]+tag[id[i]]<c)res = max(res,a[i]+tag[id[i]]);
		}
		for(int i=fx+1;i<fy;i++){
			int pos = lower_bound(v[i].begin(),v[i].end(),c-tag[i])-v[i].begin()-1;
			if(pos>=0){
				res = max(res,v[i][pos]+tag[i]);
			}
		}
		for(int i=r;id[i]==fy;i--){
			if(a[i]+tag[id[i]]<c)res = max(res,a[i]+tag[id[i]]);
		}
		if(res==-2147483648)res = -1;
		return res;
	}
}
int main()
{
	cin>>n;
	len = sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		id[i] = (i-1)/len+1;
		v[id[i]].push_back(a[i]);
	}
	for(int i=1;i<=(n-1)/len+1;i++){
		sort(v[i].begin(),v[i].end());
	}
	for(int i=1;i<=n;i++){
		int opt,l,r,c;
		cin>>opt>>l>>r>>c;
		if(opt==0){
			add(l,r,c);
		}
		else cout<<query(l,r,c)<<endl;
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+5;
int a[N],id[N],Max[N],sum[N];
int n,len;
void update(int l,int r)
{
	int fx=id[l],fy=id[r];
	if(fx==fy){
		if(Max[fx]!=1 && Max[fx]!=0){
			for(int i=l;i<=r;i++){
				if(a[i]==0 || a[i]==1)continue;
				sum[id[i]]-=a[i];
				a[i] = sqrt(a[i]);
				sum[id[i]]+=a[i];
			}
			Max[fx] = 0;
			for(int i=(fx-1)*len+1;id[i]==fx;i++){
				Max[fx] = max(Max[fx],a[i]);
			}
		}
	}
	else{
		if(Max[fx]!=0 && Max[fx]!=1){
			for(int i=l;id[i]==fx;i++){
				if(a[i]==0 || a[i]==1)continue;
				sum[id[i]]-=a[i];
				a[i] = sqrt(a[i]);
				sum[id[i]]+=a[i];
			}
			Max[fx] = 0;
			for(int j=(fx-1)*len+1;id[j]==fx;j++){
				Max[fx] = max(Max[fx],a[j]);
			}
		}
		for(int i=fx+1;i<fy;i++){
			if(Max[i]!=0 && Max[i]!=1){
				for(int j=(i-1)*len+1;id[j]==i;j++){
					if(a[j]==0 || a[j]==1)continue;
					sum[id[j]]-=a[j];
					a[j] = sqrt(a[j]);
					sum[id[j]]+=a[j];
				} 
				Max[i] = 0;
				for(int j=(i-1)*len+1;id[j]==i;j++){
					Max[i] = max(Max[i],a[j]);
				}
			}
		}
		if(Max[fy]!=0 && Max[fy]!=1){
			for(int i=r;id[i]==fy;i--){
				if(a[i]==0 || a[i]==1)continue;
				sum[id[i]]-=a[i];
				a[i] = sqrt(a[i]);
				sum[id[i]]+=a[i];
			}
			Max[fy] = 0;
			for(int j=(fy-1)*len+1;id[j]==fy;j++){
				Max[fy] = max(Max[fy],a[j]);
			}
		}
	}
}
int query(int l,int r)
{
	int fx=id[l],fy=id[r],res=0;
	if(fx==fy){
		for(int i=l;i<=r;i++)res+=a[i];
		return res;
	}
	else{
		for(int i=l;id[i]==fx;i++)res+=a[i];
		for(int i=fx+1;i<fy;i++)res+=sum[i];
		for(int i=r;id[i]==fy;i--)res+=a[i];
		return res;
	}
}
int main()
{
	cin>>n;
	len = sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		id[i] = (i-1)/len+1;
		Max[id[i]] = max(Max[id[i]],a[i]);
		sum[id[i]]+=a[i];
	}
	for(int i=1;i<=n;i++){
		int opt,l,r,c;
		cin>>opt>>l>>r>>c;
		if(opt==0){
			update(l,r);
		}
		else cout<<query(l,r)<<endl;
	}
	return 0;
}
Status
Done
Problem
9
Open Since
2024-8-30 0:00
Deadline
2024-9-7 23:59
Extension
24 hour(s)