整体二分RE求调
查看原帖
整体二分RE求调
956071
Xiongzx楼主2023/3/22 14:19
#include <bits/stdc++.h>

#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define pre(i, a, b) for(int i = (a); i >= (b); i--)
#define Ede(i, u) for(int i = h[u]; i; i = ne[i])
#define go(i, a) for(auto i : a)
//#define int long long
#define LL long long
#define ULL unsigned long long
#define PII pair<int, int>
#define PIL pair<int, long long>
#define PLI pair<long long, int>
#define PLL pair<long long, long long>
#define mp make_pair
#define eb emplace_back
#define pb push_back
#define pf push_front
#define fi first
#define se second
#define sf scanf
#define prf printf
#define el putchar('\n')
#define mms(arr, n) memset(arr, n, sizeof(arr))
#define mmc(arr1, arr2) memcpy(arr1, arr2, sizeof(arr2))
const int inf = 0x3f3f3f3f;

template <typename T> inline void rd(T &x){
	x = 0; bool f = true; char ch = getchar();
	while(ch < '0' || ch > '9'){ if(ch == '-') f = false; ch = getchar();}
	while(ch >= '0' && ch <= '9'){ x = (x << 1) + (x << 3) + (ch ^ '0'); ch = getchar();}
	if(!f) x = -x;
}
template <typename T, typename ...Args> inline void rd(T &x, Args &...args){ rd(x); rd(args...);}

using namespace std;

const int N = 3e5 + 10;
struct Query{
	int h;
	int k, id;	
}q[N << 1], q1[N << 1], q2[N << 1]; 
int n, m, ans[N];
int l[N], r[N], val[N];
int e[N], ne[N], idx;
void add1(int a, int b){
	e[++idx] = b, ne[idx] = q[a].h, q[a].h = idx;
}

int ta[N << 1];
int lowbit(int x){ return x & (-x);}  
int add2(int x, int a){
	for(; x <= (m << 1); x += lowbit(x)) ta[x] += a;
}
int query(int x){
	int sum = 0;
	for(; x; x -= lowbit(x)) sum += ta[x];
	return sum;
}

void solve(int vl, int vr, int ql, int qr){
	if(ql > qr) return;
	if(vl == vr){
		rep(i, ql, qr){
			ans[q[i].id] = vl;
		}
		return;
	}
	
	int mid = (vl + vr) >> 1;
	int nl = 0, nr = 0;
	rep(i, vl, mid) add2(l[i], val[i]), add2(r[i] + 1, -val[i]);
	rep(i, ql, qr){
		int temp = 0;
		for(int j = q[i].h; j &&/*小剪枝*/(temp <= q[i].k); j = ne[j]){
			int v = e[j];
			temp += (query(v) + query(v + m)); 
		}
		if(temp >= q[i].k) q1[++nl] = q[i];
		else q[i].k -= temp, q2[++nr] = q[i];
	}
	
	rep(i, vl, mid) add2(l[i], -val[i]), add2(r[i] + 1, val[i]);
	
	rep(i, 1, nl) q[ql + i - 1] = q1[i];
	rep(i, 1, nr) q[ql + nl + i - 1] = q2[i];
	
	solve(vl, mid, ql, ql + nl - 1);
	solve(mid + 1, vr, ql + nl, qr);
}

int main(){
	/*
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);
	*/
	rd(n, m);
	int x;
	rep(i, 1, m) rd(x), add1(x, i);
	rep(i, 1, n) rd(q[i].k), q[i].id = i;
	int qq; rd(qq);
	rep(i, 1, qq){
		rd(l[i], r[i], val[i]);
		if(l[i] > r[i]) r[i] += m;
	} 
	
	solve(1, qq + 1, 1, n);
	
	rep(i, 1, n){
		if(ans[i] == qq + 1) prf("NIE\n");
		else prf("%d\n", ans[i]);
	}
	
	return 0;
}





2023/3/22 14:19
加载中...