zkw树,25分求助
查看原帖
zkw树,25分求助
598113
Deahe楼主2023/11/28 21:45

想的是zkw,区间修改+区间最小值,只有1,2,3,7,8,21过了

#include<bits/stdc++.h>
using namespace std;
namespace hw {
	const int MAXN=1e6+5;
	int n,m,r[MAXN],N;
	struct node {
		int val,f;
	}seg[MAXN<<2];
	void pushup(int now) {
		seg[now].val=min(seg[now<<1].val+seg[now<<1].f,seg[now<<1|1].val+seg[now<<1|1].f);
	}
	void Build() {
		N=log2(n)+1;
		N=1<<N; 
		seg[N].val=1e9+5;
		for (int i=1;i<=n;i++) {
			seg[N+i].val=r[i];
		}
		for (int i=n+1;i<=N;i++) {
			seg[N+i].val=1e9+5;
		}
		for (int i=N-1;i>=1;i--) { 
			pushup(i);
		}
	}
	int Query(int s,int t) {
		s+=N,t+=N;
		int sans=seg[s].val,tans=seg[t].val;
		if (s==t) {
			for (;s;s>>=1) sans+=seg[s].f;
			return sans;
		}
		for (;s^t^1;s>>=1,t>>=1) {
//			printf("%d %d ",s,t);
			sans+=seg[s].f;
			tans+=seg[t].f;
			if (~s&1) { 
				sans=min(sans,seg[s^1].val+seg[s^1].f);
			}
			if (t&1) { 
				tans=min(tans,seg[t^1].val+seg[t^1].f);
			}
//			printf("%d %d\n",sans,tans);
		}
//		printf("%d %d\n",s,t);
		sans=min(sans,tans);
		for (;s;s>>=1) {
//			printf("%d %d\n",seg[s].f,sans);
			sans+=seg[s].f;
		}
		return sans;
	}
	void Modify(int s,int t,int val) {
		s+=N-1,t+=N+1;
		for (;s^t^1;s>>=1,t>>=1) {
//			printf("%d %d\n",s,t);
			if (~s&1) {
				seg[s^1].f+=val; 
			}
			if (t&1) {
				seg[t^1].f+=val;
			}
			if (s<N) pushup(s);
			if (t<N) pushup(t);
		}
		for (;s;s>>=1) pushup(s);
	} 
	void out() {
		for (int i=1;i<=N;i++) {
//			printf("%d : %d\n",i,Query(i,i));
			printf("%d : %d %d\n",i,seg[N+i-1].val,seg[N+i-1].f);
		} 
		printf("\n");
	}
	int main() {
		scanf("%d%d",&n,&m);
		for (int i=1;i<=n;i++) {
			scanf("%d",&r[i]);
		}
		Build();
//		out();
		int d,s,t;
		for (int i=1;i<=m;i++) {
			scanf("%d%d%d",&d,&s,&t);
//			printf("Q%d : %d\n",i,Query(s,t));
			if (Query(s,t)<d) {
				printf("-1\n%d",i);
				return 0;
			}
			Modify(s,t,-d);
//			out();
		}
		printf("0");
		return 0;
	}
}
int main() {
//	freopen("P1083_4.in","r",stdin);
	hw::main();
	return 0;
} 
/*
10 10
225657656 994645291 999202796 999202796 999202796 942745784 962612348 842542128 73554493 491166
768987635 2 8
223039613 1 5
169200644 6 7
4066339 3 9
52812425 7 9
16184563 7 9
44670 3 10
2618043 1 5
4032936 7 7
446496 3 10

-1
5

10 10
225657656 994645291 999202796 999202796 999202796 942745784 962612348 842542128 73554493 491166
768987635 2 8
223039613 1 5
169200644 6 7
4066339 3 9
52812425 7 9
16184563 7 9
44670 3 10
2618043 1 5
4032936 7 7
446496 3 10

-1
5

10 10
42323424 633675939 990396626 965164370 965164370 965164370 972489810 619351082 619351082 0
586780256 2 9
316471206 3 7
42323424 1 3
8081621 3 9
36667522 3 7
110729 3 6
4572259 2 9
7436169 7 9
3834281 3 9
8646496 4 9

-1
6

4 3 
2 5 4 3 
2 1 3 
3 2 4 
4 2 4
*/
2023/11/28 21:45
加载中...