QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#256734#3300. Cactus Competitionlnwbs200Compile Error//C++142.1kb2023-11-18 21:18:562023-11-18 21:18:56

Judging History

你现在查看的是最新测评结果

  • [2023-11-18 21:18:56]
  • 评测
  • [2023-11-18 21:18:56]
  • 提交

answer

// NOIP 2023 T3
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;

const int N = 2e5 + 5, INF = 2e9 + 5;
int a[N], b[N], d[N], cnt, ans;
int maxl[N], minl[N], h[N], c[N], suf1[N], suf2[N], g[N];
bool vis[N];

int main()
{
    int n, m;
	cin >> n >> m;
	int D = -1e9, F = 1e9;
	for (int i = 1; i <= m; i++) cin >> b[i];
	for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        a[i] = -a[i];
        D = max(D, a[i]), F = min(F, a[i]);
    }
	minl[0] = INF;
	maxl[1] = minl[1] = a[1];
	for (int i = 2; i <= n; i++)
    {
        maxl[i] = max(maxl[i - 1], a[i]);
        minl[i] = min(minl[i - 1], a[i]);
    }
	suf1[n] = suf2[n] = a[n];
	suf2[n + 1] = INF;
	for (int i = n - 1; i > 0; i--)
    {
        suf1[i] = max(suf1[i + 1], a[i]);
        suf2[i] = min(suf2[i + 1], a[i]); 
    }
	for (int i = 1; i <= m; i++)
    {
		if (b[i] >= D)
        {
            d[++cnt] = i;
            vis[i] = true;
            c[cnt]=1;
        }
		else
        {
			h[i] = upper_bound(maxl + 1, maxl + n + 1, b[i]) - maxl - 1;
			int l = 1, r = n, pos = n + 1;
			while (l <= r)
            {
				int mid = l+r >> 1;
				if (suf1[mid] <= b[i]) r = mid - 1, pos = mid;	
				else l = mid + 1;
			}
			g[i] = pos;
		}
	}
	int x = 0, y, z;
	for (int i = d[1]; i <= m; i++)
    {
		if (vis[i])
        {
			x++;
            y = d[i];
            z = INF;
			continue;
		}
		z = min(z, b[i]);
		if (z >= suf2[g[i]])
        {
			c[x]++;
			z = INF;
		}
	}
	bool ok = false;
	for (int i = cnt - 1; i > 0; i--)
    {
		ok = true;
		for(int j = d[i + 1] - 1; j > d[i];j--)
        {
			if (b[j] < F)
            {
                ok = false;
                break;
            }
        }
		if (ok) c[i] += c[i + 1];
	}
	x = cnt + 1;
	for (int i = d[cnt]; i > 0; i--)
    {
		if (vis[i])
        {
			x--;
            y = d[i];
            z = INF;
			ans += c[x];
			continue;
		}
		z = min(z, b[i]);
		if (z >= minl[h[i]])
        {
			ans += c[x];
			z = INF;
		}
	}
	cout << ans << endl;
	return 0; 
}

詳細信息

cc1plus: error: ‘::main’ must return ‘int’