性感代码,在线求调
查看原帖
性感代码,在线求调
502983
jhhh楼主2024/10/23 21:20

真c++,直接退出,悬

#include<bits/stdc++.h>
#define mid(a,b) (a+((b-a)>>1))
#define z(a) (2*a)
#define y(a) (2*a+1)
using namespace std;
template <typename T>
class seg {
		vector <T> tree,lazy,*arr;
		int n,n4,endd,root;
		void maintain(int s,int t,int p) {
			if(s!=t&&lazy[p]) {
				int m=mid(s,t);
				tree[2*p]+=lazy[p]*(m-s+1);
				tree[2*p+1]+=lazy[p]*(t-m);
				lazy[2*p]+=lazy[p];
				lazy[2*p+1]+=lazy[p];
				lazy[p]=0;
			}
		}
		void build(int s,int t,int p) {
			if(s==t) {
				tree[p]=(*arr)[s];
				return;
			}
			int m=mid(s,t);
			build(s,m,z(p));
			build(m+1,t,y(p));
			tree[p]=tree[z(p)]+tree[y(p)];
		}
		void range_add(int l,int r,int cl,int cr,int p,int x) {
			if(l<=cl&&cr<=r) {
				tree[p]+=(cr-cl+1)*x;
				lazy[p]+=x;
				return;
			}
			maintain(cl,cr,p);
			int m=mid(cl,cr);
			if(l<=m)range_add(l,r,cl,m,z(p),x);
			if(m<r)range_add(l,r,m+1,cr,y(p),x);
			tree[p]=tree[z(p)]+tree[y(p)];
		}
		T range_sum(int l,int r,int cl,int cr,int p) {
			if(l<=cl&&r<=cr) {
				return tree[p];
			}
			maintain(cl,cr,p);
			int m=mid(cl,cr);
			T sum=0;
			if(l<=m)sum+=range_sum(l,r,cl,m,z(p));
			if(m<r)sum+=range_sum(l,r,m+1,cr,y(p));
			return sum;
		}
	public:
		explicit seg<T>(vector <T> v) {
			arr=&v;
			n=v.size();
			n4=n*4;
			endd=n-1;
			root=1;
			vector <T> tree(n4,0);
			vector <T> lazy(n4,0);
			build(0,endd,root);
			arr=nullptr;
		}

		T range_sum(int l,int r) {
			return range_sum(l,r,0,endd,root);
		}
		void range_add(int l,int r,int x) {
			return range_add(l,r,0,endd,root,x);
		}

};
int main() {
	vector <int> v= {1};
	seg<int> s(v);
//	cout<<s.range_sum(0,2);
	return 0;
}

2024/10/23 21:20
加载中...