답안 #1056227

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1056227 2024-08-13T08:20:02 Z tolbi 송신탑 (IOI22_towers) C++17
4 / 100
576 ms 39388 KB
#include "towers.h"

#include <bits/stdc++.h>
using namespace std;
#define tol(bi) ((1LL)<<((int)(bi)))
constexpr int MAXN = 1e5;
constexpr int LOG = 20;
int st[MAXN*4][LOG], tin[MAXN], rev[MAXN*4];
vector<int> tree[MAXN];
map<int,int> hsh;
vector<int> H;
int query(int l, int r){
	int ara = r-l+1;
	int lg = log2(ara);
	return min(st[l][lg],st[r-tol(lg)+1][lg]);
}
int lca(int a, int b){
	if (tin[a]>tin[b]) swap(a,b);
	return rev[query(tin[a],tin[b])];
}
int ind;
void dfs(int node){
	st[ind][0]=ind;
	rev[ind]=node;
	tin[node]=ind++;
	for (auto it : tree[node]){
		dfs(it);
		st[ind++][0]=tin[node];
	}
}
bool sub1 = false;
void init(int N, std::vector<int> H) {
	::H=H;
	ind=0;
	int inc = 0;
	int dec = N-1;
	for (int i = 1; i < N; i++){
		if (H[i]>H[i-1]) inc++;
		else break;
	}
	for (int i = 1; i < N; i++){
		if (H[i]<H[i+1]) dec--;
		else break;
	}
	if (inc==dec) sub1=true;
	for (int i = 0; i < N; i++){
		hsh[H[i]]=i;
		st[i][0]=-H[i];
	}
	for (int j = 1; j < LOG; j++){
		for (int i = 0; i < N; i++){
			st[i][j]=-1;
			if (st[i][j-1]==-1 || i+tol(j-1)>=N) continue;
			st[i][j]=min(st[i][j-1],st[i+tol(j-1)][j-1]);
		}
	}
	function<int(int,int)> partition = [&](int l, int r)->int{
		if (l==r) return l;
		int ele = hsh[-query(l,r)];
		tree[ele].clear();
		if (l<=ele-1) tree[ele].push_back(partition(l,ele-1));
		if (ele+1<=r) tree[ele].push_back(partition(ele+1,r));
		return ele;
	};
	int root = partition(0,N-1);
	dfs(root);
	for (int j = 1; j < LOG; j++){
		for (int i = 0; i < ind; i++){
			st[i][j]=-1;
			if (st[i][j-1]==-1 || i+tol(j-1)>=ind) continue;
			st[i][j]=min(st[i][j-1],st[i+tol(j-1)][j-1]);
		}
	}
}

int max_towers(int L, int R, int D) {
	vector<int> leafs;
	for (int i = L; i <= R; ++i)
	{
		if (i==L+1) i=R;
		bool isleaf=true;
		assert(tree[i].size()<=2);
		for (auto it : tree[i]){
			if (it>=L && it<=R) isleaf=false;
		}
		if (isleaf) leafs.push_back(i);
	}
	assert(leafs.size()<=2);
	int ara = lca(L,R);
	if (ara==L || ara==R) return 1;
	if (max(H[L],H[R])<=H[ara]-D) return 2;
	return 1;
	sort(leafs.begin(), leafs.end(), [&](int a, int b){
		return tin[a]<tin[b];
	});
	int curn = leafs[0];
	int sz = 1;
	for (int i = 1; i < leafs.size(); i++){
		int ara = lca(curn,leafs[i]);
		if (max(H[leafs[i]],H[curn]) <= H[ara]-D){
			sz++;
			curn=leafs[i];
		}
		else if (sz==1 && H[curn]>H[leafs[i]]){
			curn=leafs[i];
		}
	}
	return sz;
}

Compilation message

towers.cpp: In function 'int max_towers(int, int, int)':
towers.cpp:98:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for (int i = 1; i < leafs.size(); i++){
      |                  ~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 216 ms 24808 KB Output is correct
2 Correct 503 ms 38740 KB Output is correct
3 Correct 576 ms 39080 KB Output is correct
4 Correct 521 ms 39260 KB Output is correct
5 Correct 479 ms 39332 KB Output is correct
6 Correct 511 ms 39248 KB Output is correct
7 Correct 551 ms 39388 KB Output is correct
8 Correct 1 ms 6744 KB Output is correct
9 Correct 2 ms 7000 KB Output is correct
10 Correct 2 ms 7000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 6744 KB 1st lines differ - on the 1st token, expected: '13', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 6744 KB 1st lines differ - on the 1st token, expected: '13', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 419 ms 28896 KB 1st lines differ - on the 1st token, expected: '11903', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 145 ms 10672 KB 1st lines differ - on the 1st token, expected: '7197', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 6744 KB 1st lines differ - on the 1st token, expected: '13', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 216 ms 24808 KB Output is correct
2 Correct 503 ms 38740 KB Output is correct
3 Correct 576 ms 39080 KB Output is correct
4 Correct 521 ms 39260 KB Output is correct
5 Correct 479 ms 39332 KB Output is correct
6 Correct 511 ms 39248 KB Output is correct
7 Correct 551 ms 39388 KB Output is correct
8 Correct 1 ms 6744 KB Output is correct
9 Correct 2 ms 7000 KB Output is correct
10 Correct 2 ms 7000 KB Output is correct
11 Incorrect 2 ms 6744 KB 1st lines differ - on the 1st token, expected: '13', found: '1'
12 Halted 0 ms 0 KB -