MLE求助:(
查看原帖
MLE求助:(
59317
legend_life楼主2020/8/4 21:25
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define mp make_pair
#define pb push_back
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;

int read()
{
	char c = getchar(); int flag = 1, ans = 0;
	while (c < '0' || c > '9') {if (c == '-') flag = -flag; c = getchar();}
	while (c >= '0' && c <= '9') {ans = ans * 10 + c - '0'; c = getchar();}
	return ans * flag;
}

const ll INF = 1e16;
const int MAXN = 100010;
const int MOD = 998244353;
int a[MAXN], b[MAXN];
int pos, n, m;

struct Query
{
	int op;
	int l, r;
}q[MAXN];

struct Tree
{
	int lazy;
	int val;
}t[MAXN << 2];

void build_tree (int now, int l, int r)
{
	if (l == r)
	{
		t[now].val = b[l];
		t[now].lazy = -1;
		return;
	}
	int mid = (l + r) >> 1;
	build_tree (now << 1, l, mid);
	build_tree (now << 1 | 1, mid + 1, r);
	t[now].val = t[now << 1].val + t[now << 1 | 1].val;
	t[now].lazy = -1;
}

void push_down (int now, int l, int r)
{
	if (t[now].lazy != -1)
	{
		int mid = (l + r) >> 1;
		t[now << 1].lazy = t[now].lazy;
		t[now << 1 | 1].lazy = t[now].lazy;
		t[now << 1].val = t[now].lazy * (mid - l + 1);
		t[now << 1 | 1].val = t[now].lazy * (r - mid);
		t[now].lazy = -1;
	}
}

void change (int now, int l, int r, int L, int R, int x)
{
	if (L <= l && r <= R)
	{
		t[now].val = (r - l + 1) * x;
		t[now].lazy = x;
		return;
	}
	int mid = (l + r) >> 1;
	if (mid >= L)
		change (now << 1, l, mid, L, R, x);
	if (mid < R)
		change (now << 1 | 1, mid + 1, r, L, R, x);
	t[now].val = t[now << 1].val + t[now << 1 | 1].val;
}

int query (int now, int l, int r, int L, int R)
{
	if (L <= l && r <= R)
		return t[now].val;
	push_down (now, l, r);
	int mid = (l + r) >> 1, ans = 0;
	if (mid >= L)
		ans += query (now << 1, l, mid, L, R);
	if (mid < R)
		ans += query (now << 1 | 1, mid + 1, r, L, R);
	return ans;
}

int main()
{
	n = read(), m = read();
	for (int i = 1; i <= n; ++ i)
		a[i] = read();
	for (int i = 1; i <= m; ++ i)
		q[i].op = read(), q[i].l = read(), q[i].r = read();
	pos = read();
	int l = 1, r = n;
	while (l < r)
	{
		int mid = (l + r + 1) >> 1;
		for (int i = 1; i <= n; ++ i)
		{
			if (a[i] >= mid)	b[i] = 1;
			else				b[i] = 0;
		}
		build_tree (1, 1, n);
		for (int i = 1; i <= m; ++ i)
		{
			int now = query (1, 1, n, q[i].l, q[i].r);
			if (q[i].op)
			{
				change (1, 1, n, q[i].l, q[i].l + now - 1, 1);
				change (1, 1, n, q[i].l + now, q[i].r, 0);
			}
			else
			{
				change (1, 1, n, q[i].l, q[i].r - now, 0);
				change (1, 1, n, q[i].r - now + 1, q[i].r, 1);
			}
		}
		if (query (1, 1, n, pos, pos) == 1)
			l = mid;
		else
			r = mid - 1;
	}
	printf ("%d\n", l);
	return 0;
}

这份代码MLE8个点,WA2个点,有没有带师帮帮我啊/kel

2020/8/4 21:25
加载中...