In the 2018 Six-School Joint Weekly Competition last semester, the third middle and second disease must also type the code 2, the minimum value of the continuous interval of the line segment tree

topic link

In fact, question D is a line segment tree. The line segment tree is used to maintain the minimum value of the subinterval. Because it is a ring, there are two cases to consider. One is the case where the minimum value in 1 to n is the answer, and the second is sum - the maximum value of [1 , n], both cases are fine. But the question requires that you can't take all of them, so we have to consider the situation of taking all of them. If you take all of them, you have to subtract the maximum value, so that's OK.

Then you may ask how does the segment tree maintain all the subintervals? We need to understand one thing, how to maintain the maximum value of all subintervals?

First we maintain the maximum value that ends at the leftmost edge of an interval, the maximum value that ends at the rightmost end of an interval, and the maximum value of the subintervals of the entire interval.

 

 

///                 .-~~~~~~~~~-._       _.-~~~~~~~~~-.
///             __.'              ~.   .~              `.__
///           .'//                  \./                  \\`.
///        .'//                     |                     \\`.
///       .'// .-~"""""""~~~~-._     |     _,-~~~~"""""""~-. \\`.
///     .'//.-"                 `-.  |  .-'                 "-.\\`.
///   .'//______.============-..   \ | /   ..-============.______\\`.
/// .'______________________________\|/______________________________`.
#pragma GCC optimize("Ofast")
#pragma comment(linker, "/STACK:102400000,102400000")
#pragma GCC target(sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx) 
#include<bits/stdc++.h>
using namespace std;

#define pi acos(-1)
#define s_1(x) scanf("%d",&x)
#define s_2(x,y) scanf("%d%d",&x,&y)
#define s_3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define s_4(x,y,z,X) scanf("%d%d%d%d",&x,&y,&z,&X)
#define S_1(x) scan_d(x)
#define S_2(x,y) scan_d(x),scan_d(y)
#define S_3(x,y,z) scan_d(x),scan_d(y),scan_d(z)
#define PI acos(-1)
#define endl '\n'
#define srand() srand(time(0));
#define me(x,y) memset(x,y,sizeof(x));
#define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++)
#define close() ios::sync_with_stdio(0); cin.tie(0);
#define FOR(x,n,i) for(int i=x;i<=n;i++)
#define FOr(x,n,i) for(int i=x;i<n;i++)
#define fOR(n,x,i) for(int i=n;i>=x;i--)
#define fOr(n,x,i) for(int i=n;i>x;i--)
#define W while
#define sgn(x) ((x) < 0 ? -1 : (x) > 0)
#define bug printf("***********\n");
#define db double
#define ll long long
#define mp make_pair
#define pb push_back
#define sz size
#define fi first
#define se second
#define pf printf
typedef long long LL;
typedef pair <int, int> ii;
const int INF=0x3f3f3f3f;
const LL LINF=0x3f3f3f3f3f3f3f3fLL;
const int dx[]={-1,0,1,0,1,-1,-1,1};
const int dy[]={0,1,0,-1,-1,1,-1,1};
const int maxn=1e2+7;
const int _=1e5+10;
const double EPS=1e-8;
const double eps=1e-8;
const LL mod=1e9+7;
template<class T>inline T min(T a,T b,T c) { return min(min(a,b),c);}
template<class T>inline T max(T a,T b,T c) { return max(max(a,b),c);}
template<class T>inline T min(T a,T b,T c,T d) { return min(min(a,b),min(c,d));}
template<class T>inline T max(T a,T b,T c,T d) { return max(max(a,b),max(c,d));}
template <class T>
inline bool scan_d(T &ret){char c;int sgn;if (c = getchar(), c == EOF){return 0;}
while (c != '-' && (c < '0' || c > '9')){c = getchar();}sgn = (c == '-') ? -1 : 1;ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0' && c <= '9'){ret = ret * 10 + (c - '0');}ret *= sgn;return 1;}

inline bool scan_lf(double &num){char in;double Dec=0.1;bool IsN=false,IsD=false;in=getchar();if(in==EOF) return false;
while(in!='-'&&in!='.'&&(in<'0'||in>'9'))in=getchar();if(in=='-'){IsN=true;num=0;}else if(in=='.'){IsD=true;num=0;}
else num=in-'0';if(!IsD){while(in=getchar(),in>='0'&&in<='9'){num*=10;num+=in-'0';}}
if(in!='.'){if(IsN) num=-num;return true;}else{while(in=getchar(),in>='0'&&in<='9'){num+=Dec*(in-'0');Dec*=0.1;}}
if(IsN) num=-num;return true;}

void Out(LL a){if(a < 0) { putchar('-'); a = -a; }if(a >= 10) Out(a / 10);putchar(a % 10 + '0');}
void print(LL a){ Out(a),puts("");}
//cerr << "run time is " << clock() << endl;

struct node {
	int l,r;
	LL sum,min_dat,max_dat,lmax,rmax,lmin,rmin;
}seg[_<<2];
int n,m;
int a[_];
void push_up(int rt) {
	seg[rt].sum=seg[rt<<1].sum+seg[rt<<1|1].sum;
	seg[rt].lmax=max(seg[rt<<1].lmax,seg[rt<<1].sum+seg[rt<<1|1].lmax);
	seg[rt].rmax=max(seg[rt<<1|1].rmax,seg[rt<<1|1].sum+seg[rt<<1].rmax);
	seg[rt].lmin=min(seg[rt<<1].lmin,seg[rt<<1].sum+seg[rt<<1|1].lmin);
	seg[rt].rmin=min(seg[rt<<1|1].rmin,seg[rt<<1|1].sum+seg[rt<<1].rmin);
	seg[rt].min_dat=min(seg[rt<<1].min_dat,seg[rt<<1|1].min_dat,
					seg[rt<<1|1].lmin+seg[rt<<1].rmin);
	seg[rt].max_dat=max(seg[rt<<1].max_dat,seg[rt<<1|1].max_dat,
					seg[rt<<1|1].lmax+seg[rt<<1].rmax);
					
}
void build(int rt,int l,int r) {
	seg[rt].l=l;
	seg[rt].r=r;
	if(l==r) {
		seg[rt].sum=seg[rt].lmax=seg[rt].rmax=seg[rt].lmin=seg[rt].rmin=seg[rt].min_dat=
		seg[rt].max_dat=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	push_up(rt);
}
void update(int rt,int l,int r,int val) {
	if(seg[rt].l==seg[rt].r) {
		seg[rt].sum=seg[rt].lmax=seg[rt].rmax=seg[rt].lmin=seg[rt].rmin=seg[rt].min_dat=
		seg[rt].max_dat=val;
		return ;
	}
	int mid=(seg[rt].l+seg[rt].r)>>1;
	if(l<=mid) 
		update(rt<<1,l,r,val);
	else 
		update(rt<<1|1,l,r,val);
	push_up(rt);
}
void solve() {
	W(cin>>n) {
		FOR(1,n,i) 
			s_1(a[i]);
		build(1,1,n);
		s_1(m);
		W(m--) {
			int x,y;
			s_2(x,y);
			update(1,x,x,y);
			if(seg[1].sum==seg[1].min_dat) 
				print(seg[1].min_dat-seg[1].max_dat);
			else 
				print(min(seg[1].sum-seg[1].max_dat,seg[1].min_dat));
		}
	}
}
		
int main() { 
	//freopen( "1.in" , "r" , stdin );
    //freopen( "1.out" , "w" , stdout );
    int t=1;
    //init();
    //s_1(t);
    for(int cas=1;cas<=t;cas++) {
        //printf("Case #%d: ",cas);
        solve();
    }
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326546986&siteId=291194637