求助,整体二分T上天了
查看原帖
求助,整体二分T上天了
417018
dark_moon楼主2024/1/26 10:41
#include<bits/stdc++.h>
#define int long long
using namespace std;
auto mread = [](){
	int x;
	scanf("%lld", &x);
	return x;
};
const int N = 3e5 + 5;
int n = mread(), m = mread(), belong[N], p[N], ans[N], a[N], k, t[N], t1[N], t2[N];
struct Node{
	int l, r, a;
}s[N];
vector<int> v[N];
int lowbit(int x){
	return x & (-x);
}
void add(int x, int k){
	while(x <= m){
		a[x] += k;
		x += lowbit(x);
	}
	return;
}
int query(int x){
	int ans = 0;
	while(x){
		ans += a[x];
		x -= lowbit(x);
	}
	return ans;
}
void makeAns(int l, int r, int nl, int nr){
	if(l == r){
		for(int i = nl; i <= nr; i ++)
		ans[t[i]] = l;
		return;
	}
	int mid = (l + r) >> 1;
	for(int i = 1; i <= mid; i ++){
		if(s[i].l <= s[i].r){
			add(s[i].l, s[i].a);
			add(s[i].r + 1, -s[i].a);
		}
		else{
			add(1, s[i].a);
			add(s[i].r + 1, -s[i].a);
			add(s[i].l, s[i].a);
		}
	}
	int cnt1 = 0, cnt2 = 0;
	for(int i = nl; i <= nr; i ++){
		int x = t[i], s = 0;
		for(int j = 0; j < v[x].size(); j ++){
			int y = v[x][j];
			s += query(y);
		}
		if(s >= p[x])
		t1[++cnt1] = x;
		else
		t2[++cnt2] = x;
//		printf("*** %lld %lld\n", x, s);
	}
	for(int i = 1; i <= mid; i ++){
		if(s[i].l <= s[i].r){
			add(s[i].l, -s[i].a);
			add(s[i].r + 1, s[i].a);
		}
		else{
			add(1, -s[i].a);
			add(s[i].r + 1, s[i].a);
			add(s[i].l, -s[i].a);
		}
	}
	for(int i = nl; i <= nl + cnt1 - 1; i ++)
	t[i] = t1[i - nl + 1];
	for(int i = nr - cnt2 + 1, j = 1; i <= nr; i ++, j ++)
	t[i] = t2[j];
	makeAns(l, mid, nl, nl + cnt1 - 1);
	makeAns(mid + 1, r, nr - cnt2 + 1, nr);
	return;
}
signed main(){
	for(int i = 1; i <= m; i ++){
		belong[i] = mread();
		v[belong[i]].push_back(i);
	}
	for(int i = 1; i <= n; i ++)
	p[i] = mread(), t[i] = i;
	k = mread();
	for(int i = 1; i <= k; i ++)
	s[i].l = mread(), s[i].r = mread(), s[i].a = mread();
	vector<int> t;
	for(int i = 1; i <= n; i ++)
	t.push_back(i);
	makeAns(1ll, k + 1, 1, n);
	for(int i = 1; i <= n; i ++)
	if(ans[i] == k + 1)
	printf("NIE\n");
	else
	printf("%lld\n", ans[i]);
	return 0;
}

复杂度应该是对的,两个log,但是除了前两个点都T了qwq。

2024/1/26 10:41
加载中...