답안 #1058852

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1058852 2024-08-14T14:29:38 Z parsadox2 송신탑 (IOI22_towers) C++17
0 / 100
877 ms 2097152 KB
#include <bits/stdc++.h>
#include "towers.h"
#define F first
#define S second
using namespace std;
 
const int N = 1e5 + 10 , inf = 1e9 , Lg = 17;
 
int n , a[N] , rmxq[N][Lg] , rmnq[N][Lg] , lg2[N] , nexL[N] , nexR[N] , las;
int b[N] , psum[N] , m , mvR[N][Lg] , mvL[N][Lg];
vector <pair<int ,int>> all;

int mn_pos(int aa , int bb)
{
	if(a[aa] < a[bb])
		return aa;
	return bb;
}
 
int mx_pos(int aa , int bb)
{
	if(a[aa] > a[bb])
		return aa;
	return bb;
}
 
int Get_mx(int l , int r)
{
	r++;
	int sz = (r - l);  sz = lg2[sz];
	return mx_pos(rmxq[l][sz] , rmxq[r - (1 << sz)][sz]);
}
 
int Get_mn(int l , int r)
{
	r++;
	int sz = (r - l);  sz = lg2[sz];
	return mn_pos(rmnq[l][sz] , rmnq[r - (1 << sz)][sz]);
}

struct SEG{
	vector <int> vec[N << 2];
	int mn[N << 2] , mx[N << 2];
	void Build(int node = 1 , int nl = 0 , int nr = m)
	{
		if(nr - nl == 1)
		{
			vec[node].push_back(all[nl].S);
			mn[node] = all[nl].F;
			mx[node] = all[nl].F;
			return;
		}
		int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
		Build(lc , nl , mid);  Build(rc , mid , nr);
		vec[node] = vec[lc];
		for(auto u : vec[rc])
			vec[node].push_back(u);
		sort(vec[node].begin() , vec[node].end());
		mn[node] = min(mn[lc] , mn[rc]);
		mx[node] = max(mx[lc] , mx[rc]);
	}
	int Get(int val , int l , int r , int node = 1 , int nl = 0 , int nr = m)
	{
		if(mx[node] < val)
			return 0;
		if(mn[node] >= val)
		{
			return upper_bound(vec[node].begin() , vec[node].end() , r) - lower_bound(vec[node].begin() , vec[node].end() , l);
		}
		int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1;
		return Get(val , l , r , lc , nl , mid) + Get(val , l , r , rc , mid , nr);
	}
} seg;
 
void Build()
{
	lg2[1] = 0;
	for(int i = 2 ; i < N ; i++)
		lg2[i] = lg2[i / 2] + 1;
	for(int i = 0 ; i < n ; i++)
		rmnq[i][0] = rmxq[i][0] = i;
	for(int j = 1 ; j < Lg ; j++)
	{
		int len = (1 << j);
		for(int i = 0 ; i + len <= n ; i++)
		{
			rmnq[i][j] = mn_pos(rmnq[i][j - 1] , rmnq[i + len / 2][j - 1]);
			rmxq[i][j] = mx_pos(rmxq[i][j - 1] , rmxq[i + len / 2][j - 1]);
		}
	}
	vector <int> st;
	for(int i = 0 ; i < n ; i++)
	{
		nexL[i] = -1;
		nexR[i] = n;
		while(!st.empty())
		{
			if(a[st.back()] < a[i])
			{
				nexR[st.back()] = i;
				st.pop_back();
			}
			else
			{
				nexL[i] = st.back();
				break;
			}
		}
		st.push_back(i);
	}
	for(int i = 0 ; i < n ; i++)  if(i - nexL[i] > 1 && nexR[i] - i > 1)
	{
		int lc = Get_mn(nexL[i] + 1 , i - 1) , rc = Get_mn(i + 1 , nexR[i] - 1);
		all.push_back(make_pair(a[i] - max(a[lc] , a[rc]) , i));
	}
	sort(all.begin() , all.end());
	/*for(auto u : all)
		cout << u.F << " " << u.S << endl;
		*/
	for(int i = 0 ; i < n ; i++)
	{
		mvL[i][0] = nexL[i];
		mvR[i][0] = nexR[i];
	}
	for(int j = 1 ; j < Lg ; j++)  for(int i = 0 ; i < n ; i++)
	{
		if(mvL[i][j - 1] == -1)
			mvL[i][j] = -1;
		else
			mvL[i][j] = mvL[mvL[i][j - 1]][j - 1];
		if(mvR[i][j - 1] == n)
			mvR[i][j] = n;
		else
			mvR[i][j] = mvR[mvR[i][j - 1]][j - 1];
	}
	m = all.size();
	seg.Build();
}
 
void init(int nn , vector <int> vec)
{
	n = nn;
	for(int i = 0 ; i < n ; i++)
		a[i] = vec[i];
	Build();
}

 
int max_towers(int l , int r , int d)
{
	int L = l , R = r;
	for(int i = Lg - 1 ; i >= 0 ; i--)  if(mvR[L][i] <= r)
	{
		int id = mvR[L][i];
		if(a[id] - a[Get_mn(l , id)] < d)
			L = id;
	}
	for(int i = Lg - 1 ; i >= 0 ; i--)  if(mvL[R][i] >= l)
	{
		int id = mvL[R][i];
		if(a[id] - a[Get_mn(id , r)] < d)
			R = id;
	}
	//cout << L << " " << R << endl;
	if(L + 1 >= R)
		return 1;
	return 1 + seg.Get(d , L + 1 , R - 1);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 282 ms 40280 KB Output is correct
2 Correct 646 ms 42584 KB Output is correct
3 Correct 628 ms 42576 KB Output is correct
4 Runtime error 877 ms 2097152 KB Execution killed with signal 9
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 25176 KB Output is correct
2 Correct 4 ms 25176 KB Output is correct
3 Correct 3 ms 25176 KB Output is correct
4 Correct 3 ms 25176 KB Output is correct
5 Correct 3 ms 25368 KB Output is correct
6 Correct 3 ms 25176 KB Output is correct
7 Correct 3 ms 25176 KB Output is correct
8 Runtime error 806 ms 2097152 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 25176 KB Output is correct
2 Correct 4 ms 25176 KB Output is correct
3 Correct 3 ms 25176 KB Output is correct
4 Correct 3 ms 25176 KB Output is correct
5 Correct 3 ms 25368 KB Output is correct
6 Correct 3 ms 25176 KB Output is correct
7 Correct 3 ms 25176 KB Output is correct
8 Runtime error 806 ms 2097152 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 511 ms 47056 KB Output is correct
2 Correct 672 ms 47304 KB Output is correct
3 Correct 635 ms 47304 KB Output is correct
4 Correct 638 ms 49864 KB Output is correct
5 Correct 637 ms 49864 KB Output is correct
6 Correct 630 ms 49860 KB Output is correct
7 Correct 660 ms 49608 KB Output is correct
8 Runtime error 783 ms 2097152 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 176 ms 32616 KB Output is correct
2 Correct 632 ms 47048 KB Output is correct
3 Correct 676 ms 47556 KB Output is correct
4 Correct 640 ms 49864 KB Output is correct
5 Correct 633 ms 49688 KB Output is correct
6 Correct 617 ms 49864 KB Output is correct
7 Correct 644 ms 49864 KB Output is correct
8 Runtime error 802 ms 2097152 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 25176 KB Output is correct
2 Correct 4 ms 25176 KB Output is correct
3 Correct 3 ms 25176 KB Output is correct
4 Correct 3 ms 25176 KB Output is correct
5 Correct 3 ms 25368 KB Output is correct
6 Correct 3 ms 25176 KB Output is correct
7 Correct 3 ms 25176 KB Output is correct
8 Runtime error 806 ms 2097152 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 282 ms 40280 KB Output is correct
2 Correct 646 ms 42584 KB Output is correct
3 Correct 628 ms 42576 KB Output is correct
4 Runtime error 877 ms 2097152 KB Execution killed with signal 9
5 Halted 0 ms 0 KB -