线段树+二分求助
查看原帖
线段树+二分求助
326254
LonginusMonkey楼主2022/8/30 11:19

呃呃呃,样例过了,自己手造数据也过了,调了100年,测试点一个也过不了

#include<bits/stdc++.h>
#define int long long
using namespace std;
int arr[100010];
int tree[100010<<2], tg[100010<<2];
void build(int l, int r, int index, int x) {
	tg[index] = -1;
	if(l == r) {
		if(arr[l] >= x) {
			tree[index] = 1;
		}
		else
		{
			tree[index] = 0;
		}
		return;
	}
	int mid = l + r >> 1;
	build(l,mid,index*2,x);
	build(mid+1,r, index*2+1,x);
	tree[index] = tree[index*2] + tree[index*2+1];
}
int ask(int askl, int askr, int l, int r, int index) {
	if(askl > askr) {
		return 0;
	}
	if(tg[index] != -1) {
		tree[index] = (r-l+1) * tg[index];
		tg[index*2] = tg[index];
		tg[index*2+1] = tg[index];
		tg[index] = -1;
	}
	if(l > askr || r < askl) {
		return 0;
	}
	if(l >= askl && r <= askr) {
		return tree[index];
	}
	int mid = l + r >> 1;
	int lc = ask(askl, askr, l, mid, index*2);
	int rc = ask(askl, askr, mid+1, r, index*2+1);
	return lc + rc;
}
int n, m, k;
struct node{
	int _1, _2, _3;
}que[100010];
void gai(int askl, int askr, int to, int l, int r, int index) {
	if(askl > askr) {
		return;
	}
	if(l > askr || r < askl) {
		return;
	}
	if(l >= askl && r <= askr) {
		tg[index] = to;
		return;
	}
	int mid = l + r >> 1;
	gai(askl, askr, to, l, mid, index*2);
	gai(askl, askr, to, mid+1, r, index*2+1);
}
void shuchu() {
	for(int i=1; i<=n; ++i) {
		cout << ask(i,i,1,n,1) << " ";
	}
	cout << endl;
}
int check(int mid) {
	memset(tree, 0, sizeof tree);
	build(1,n,1,mid);
	shuchu();
	for(int i=1; i<=m; ++i) {
		int l = que[i]._2, r = que[i]._3;
		if(que[i]._1 == 0) { // 升序 
			int sum = ask(que[i]._2, que[i]._3, 1, n, 1);
			gai(l, r-sum, 0, 1, n, 1);
			gai(r-sum+1,r,1,1,n,1);
		}
		else
		{
			int sum = ask(que[i]._2, que[i]._3, 1, n, 1);
			gai(l, l+sum-1, 1, 1, n, 1);
			gai(l+sum,r,0,1,n,1);
		}
		shuchu();
	}
	shuchu();
	if(ask(k,k,1,n,1) == 1) {
		return true;
	}
	else
	{
		return false;
	}
}
signed main() {
	cin >> n >> m;
	for(int i=1; i<=n; ++i) {
		cin >> arr[i];
	}
	for(int i=1; i<=m; ++i) {
		cin >> que[i]._1 >> que[i]._2 >> que[i]._3; 
	}
	cin >> k;
	int l=1, r=n, ans = -1;
	while(l<=r) {
		int mid = l+r>>1;
		cout << l << " " << r << " " << mid << endl;
		if(check(mid)) {
			ans = mid;
			l = mid+1;
		}
		else
		{
			r = mid-1;
		}
	}
	cout << ans;
	return 0;
} 
2022/8/30 11:19
加载中...