站外题求助,算法为分块
  • 板块学术版
  • 楼主lrx___
  • 当前回复7
  • 已保存回复7
  • 发布时间2025/1/30 18:04
  • 上次更新2025/1/31 11:18:45
查看原帖
站外题求助,算法为分块
989792
lrx___楼主2025/1/30 18:04

原题

中文题面

结果:WA*1。

代码:

#include <bits/stdc++.h>
#ifndef ONLINE_JUDGE
#define debug(...) fprintf(stderr,__VA_ARGS__)
#else
#define debug(...)
#endif
using namespace std;
using namespace chrono;
typedef signed char i8;typedef short i16;typedef int i32;typedef long long i64;typedef unsigned char u8;typedef unsigned short u16;typedef unsigned u32;typedef unsigned long long u64;typedef float f32;typedef double f64;typedef long double f96;
template<typename A,typename B>void to_max(A& a,B b){if(a<b)a=b;}
template<typename A,typename B>void to_min(A& a,B b){if(b<a)a=b;}
#define __use_fast_io
namespace fast_io{
#ifndef __cplusplus
#define __cplusplus 201402L
#endif
const unsigned is(1<<21),os(1<<14);bool ne;char i[is],o[os],*ib(i),*ie(i),*ob(o),*oe(o+os),a[20],&c(*a),*b;void f(){ob-=fwrite(o,1,ob-o,stdout);}void p(char c){if(ob==oe)f();*ob++=c;}template<typename T>void _write(T&r){if(r==0)return p('0');if(r<0)p('-'),r=~(r-1);for(b=a;r;r/=10)*++b=(r%10)^'0';while(b!=a)p(*b--);}
#define g (ib==ie&&(ie=(ib=i)+fread(i,1,is,stdin),ib==ie)?-1:*ib++)
void reads(char*s){for(c=g;~c&&isspace(c);c=g);for(*s++=c,c=g;~c&&!isspace(c);c=g)*s++=c;*s=0;}template<typename T>void read(T&r){ne=false;for(c=g;~c&&(c<'0'||c>'9');c=g)ne=(c=='-');for(r=c^'0',c=g;isdigit(c);c=g)r=(r<<3)+(r<<1)+(c^'0');if(ne)r=~(r-1);}template<>void read<char>(char&r){for(c=g;~c&&isspace(c);c=g);r=c;}template<>void read<string>(string&r){r.clear();for(c=g;~c&&isspace(c);c=g);for(r.push_back(c),c=g;~c&&!isspace(c);c=g)r.push_back(c);}
#undef g
#if(__cplusplus>=201703L)
template<typename...Args>void read(Args&...args){(read(args),...);}template<typename...Args>void _write(Args&...args){(_write(args),...);}
#else
template<typename T,typename...args>void read(T&a,args&...b){read(a);read(b...);}template<typename T,typename...args>void _write(T&a,args&...b){_write(a);_write(b...);}
#endif
template<>void _write<char>(char&r){p(r);}template<>void _write<char*>(char*&r){for(;*r;p(*r++));}template<>void _write<const char*>(const char*&r){for(;*r;p(*r++));}template<>void _write<string>(string&r){const char*s(r.data());_write(s);}template<typename...args>void write(args...a){_write(a...);}struct _des{~_des(){f();}}d;}using fast_io::read;using fast_io::reads;using fast_io::write;

constexpr int N(1e5+5),SQ(320);
int n,m,sq,a[N],fun_l[N],fun_r[N],pos[N],block_l[SQ],block_r[SQ],cover[SQ][N];
i64 fun_sum[SQ],block_sum[SQ],subblock_sum[SQ][SQ];

i64 pre_sum(int x){
	if(!x){return 0;}
	return block_sum[pos[x]-1]+subblock_sum[pos[x]][x-block_l[pos[x]]+1];
}
i64 seq_sum(int l,int r){
	return pre_sum(r)-pre_sum(l-1);
}
int main(){
	int i,j,opt,x,y;
	i64 ans;
	read(n);
	sq=sqrt(n);
	for(i=1;i<=n;++i){
		read(a[i]);
		pos[i]=(i<=sq?1:pos[i-sq]+1);
		if(pos[i]!=pos[i-1]){
			block_l[pos[i]]=i;
		}
		block_r[pos[i]]=i;
		block_sum[pos[i]]+=a[i];
		subblock_sum[pos[i]][i-block_l[pos[i]]+1]=
		subblock_sum[pos[i]][i-block_l[pos[i]]]+a[i];
	}
	for(i=1;i<=n;++i){
		read(fun_l[i],fun_r[i]);
	}
	for(i=1;i<=pos[n];++i){
		block_sum[i]+=block_sum[i-1];
		for(j=block_l[i];j<=block_r[i];++j){
			++cover[i][fun_l[j]];
			--cover[i][fun_r[j]+1];
		}
		for(j=1;j<=n;++j){
			cover[i][j]+=cover[i][j-1];
			fun_sum[i]+=cover[i][j]*(i64)(a[j]);
		}
	}
	read(m);
	for(i=1;i<=m;++i){
		read(opt,x,y);
		if(opt==1){
			for(j=1;j<=pos[n];++j){
				fun_sum[j]+=cover[j][x]*(i64)(y-a[x]);
			}
			for(j=x;j<=block_r[pos[x]];++j){
				subblock_sum[pos[x]][j-block_l[pos[x]]+1]+=y-a[x];
			}
			for(j=pos[x];j<=pos[n];++j){
				block_sum[j]+=y-a[x];
			}
			a[x]=y;
		}else{
			ans=0;
			if(pos[x]==pos[y]){
				for(;x<=y;ans+=seq_sum(fun_l[x],fun_r[x]),++x);
			}else{
				for(;pos[x]==pos[x-1];++x){
					ans+=seq_sum(fun_l[x],fun_r[x]);
				}
				for(;pos[y]==pos[y+1];--y){
					ans+=seq_sum(fun_l[y],fun_r[y]);
				}
				for(x=pos[x],y=pos[y];x<=y;++x){
					ans+=fun_sum[x];
				}
			}
			write(ans,'\n');
		}
	}
	return 0;
}
2025/1/30 18:04
加载中...