제출 #51324

#제출 시각아이디문제언어결과실행 시간메모리
51324ho94949Rope (JOI17_rope)C++17
100 / 100
2232 ms83504 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1048576;
int idx[2*MAXN];
int getv(int a, int b)
{
	a += MAXN; b += MAXN;
	int ans = 0;
	while(a<=b)
	{
		if(a%2==1) ans = max(ans, idx[a++]);
		if(b%2==0) ans = max(ans, idx[b--]);
		a/=2; b/=2;
	}
	return ans;
}
void setv(int a, int v)
{
	idx[a+=MAXN] = v;
	while((a=a/2))
		idx[a] = max(idx[2*a], idx[2*a+1]);
}
void addv(int a, int v)
{
	idx[a+=MAXN] += v;
	while((a=a/2))
		idx[a] = max(idx[2*a], idx[2*a+1]);
}


int N, K;
vector<int> adj[MAXN];

int arr[MAXN];
int anseven[MAXN], ansodd[MAXN];
void even()
{
	for(int i=0; i<N/2; ++i)
	{
		int l = arr[2*i], r = arr[2*i+1];
		if(l == r)
			addv(l, 2);
		else
		{
			addv(l, 1); addv(r, 1);
			adj[l].push_back(r);
			adj[r].push_back(l);
		}
	}
	if(N%2==1) addv(arr[N-1], 1);
	for(int c=1; c<=K; ++c)
	{
		int idxc = idx[c+MAXN]; setv(c, 0);
		
		for(auto x: adj[c])
			addv(x, -1);
		
		anseven[c] = idxc + idx[1];
		
		for(auto x: adj[c])
			addv(x, +1);
		
		setv(c, idxc);
	}
}

void odd()
{
	addv(arr[0], 1);
	for(int i=0; i<(N-1)/2; ++i)
	{
		int l = arr[2*i+1], r = arr[2*i+2];
		if(l == r)
			addv(l, 2);
		else
		{
			addv(l, 1); addv(r, 1);
			adj[l].push_back(r);
			adj[r].push_back(l);
		}
	}
	if(N%2==0) addv(arr[N-1], 1);
	
	for(int c=1; c<=K; ++c)
	{
		int idxc = idx[c+MAXN]; setv(c, 0);
		
		for(auto x: adj[c])
			addv(x, -1);
		
		ansodd[c] = idxc + idx[1];
		
		for(auto x: adj[c])
			addv(x, +1);
		
		setv(c, idxc);
	}
	
}

int main()
{
	scanf("%d%d", &N, &K);
	for(int i=0; i<N; ++i) scanf("%d", arr+i);
	even();
	for(int i=1; i<=K; ++i) adj[i].clear();
	memset(idx, 0, sizeof idx);
	odd();
	for(int i=1; i<=K; ++i)
		printf("%d\n", N-max(anseven[i], ansodd[i]));
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

rope.cpp: In function 'int main()':
rope.cpp:103:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &N, &K);
  ~~~~~^~~~~~~~~~~~~~~~
rope.cpp:104:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=0; i<N; ++i) scanf("%d", arr+i);
                         ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...