萌新刚学OI $1\times10^{-998244353}$ ms求助
查看原帖
萌新刚学OI $1\times10^{-998244353}$ ms求助
307453
云浅知处はなび楼主2020/6/6 14:27

怎么肥似鸭,这题卡分块吗

#include<bits/stdc++.h>
/*#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define min(x,y) x>y?y:x
#define max(x,y) x>y?x:y*/
#define N 500005
using namespace std;
int a[N],f[N],sum[N],sumr[N];
int n,p,sq;
/*void printt(){
	for(int i=1;i<=n;i++){
		cout<<f[i]<<" ";
	}
	cout<<endl;
}
void print(){
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}*/
void change(int l,int r,int k){
	for(int i=l;i<=min(f[l]*sq,r);i++){
		a[i]+=k;
		sum[f[i]]+=k;
	}
	for(int i=f[l]+1;i<=f[r]-1;i++){
		sum[i]+=sq*k;
		sumr[i]+=k;
	}
	if(f[l]!=f[r]){
		for(int i=(f[r]-1)*sq+1;i<=r;i++){
			a[i]+=k;
			sum[f[i]]+=k;
		}
	}
}
/*int query(int l,int r){
	int ans=0;
	for(int i=l;i<=min(f[l]*sq,r);i++){
		ans+=a[i];
		ans+=sumr[f[i]];
	}
	for(int i=f[l]+1;i<f[r];i++){
		ans+=sum[i];
	}
	if(f[l]!=f[r]){
		for(int i=(f[r]-1)*sq+1;i<=r;i++){
			ans+=a[i];
			ans+=sumr[f[i]];
		}
	}
	return ans;
}*/
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>p;
	sq=sqrt(n);
	for(int i=1;i<=n;i++){
		f[i]=(i-1)/sq+1;
		cin>>a[i];
		sum[f[i]]+=a[i];
	}
	//printt();
	while(p--){
		int cmd,x,y,k;
		cin>>cmd;
		if(cmd==1){
			cin>>x>>y>>k;
			change(x,y,k);
		}
		else if(cmd==2){
			cin>>x;
			cout<<a[x]+sumr[f[x]]<<endl;
		}
		//cout<<endl;
		//print();
	}
	return 0;
}

已经开了 C艹17 吸氧......然鹅还是T掉两个点....../kk/kk

评测结果

这题不会真的卡分块吧/jk/jk

但是我分块过了树状数组1就有点谔谔....../yiw/yiw

求大佬帮忙卡卡常呗/kel/kel

2020/6/6 14:27
加载中...