반응형
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
2568번: 전깃줄 - 2
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100,000 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결
www.acmicpc.net
[ 한국정보올림피아드 2007년 지역본선 중등부 전깃줄 입출력 데이터 ]
[ 한국정보올림피아드 2007년 지역본선 초등부 전깃줄 소스 코드 ]
[ 한국정보올림피아드 2007년 지역본선 중등부 전깃줄 소스 코드 ]
#include <stdio.h>
#include <algorithm>
using namespace std;
struct cc
{
int a;
int b;
}aa[1200000];
int sortf(cc x, cc y)
{
if(x.a<y.a) return 1;
else return 0;
}
int a[1200000], b[1200000], c[1200000], d[1200000];
int i, l, r, _max=0, t, n, x, dab=0, s, k;
int main()
{
scanf( "%d", &n);
t=524288;
for(i=t;i<t+n;i++)
scanf("%d %d", &aa[i].a, &aa[i].b);
std::sort(aa+t, aa+t+n, sortf);
for(i=t;i<t+n;i++)
{
x=aa[i].b;
l=t;
r=t+x-1;
_max=1;
s=-1;
while(1)
{
if(l==r)
{
if(a[l]>=_max)
{
_max=a[l];
s=b[l];
}
break;
}
if(l&1)
{
if(a[l]>=_max)
{
_max=a[l];
s=b[l];
}
l++;
}
if(!(r&1))
{
if(a[r]>=_max)
{
_max=a[r];
s=b[r];
}
r--;
}
if(l>r)
{
if(a[l]>=_max)
{
_max=a[l];
s=b[l];
}
if(a[r]>=_max)
{
_max=a[r];
s=b[r];
}
break;
}
l>>=1; //l = l / 2;
r>>=1; //r = r / 2;
}
l=t+x-1;
c[i]=s;
while(1)
{
if(_max+1>=a[l])
{
a[l]=_max+1;
b[l]=i;
}
else break;
l>>=1;
if(l==0) break;
}
if(a[t+x-1]>=dab)
{
dab=a[t+x-1];
k=i;
}
}
while(1)
{
if(k<1) break;
d[k]=1;
k=c[k];
}
printf("%d\n", n-dab+1);
for(i=t;i<t+n;i++)
{
if(d[i]==0)
printf("%d\n", aa[i].a);
}
return 0;
}
반응형
'백준 문제풀이' 카테고리의 다른 글
백준 10825번 - 국영수 소스 코드 (0) | 2021.04.18 |
---|---|
백준 2504번 - 괄호의 값 (0) | 2021.04.16 |
백준 2503번 - 숫자 야구 (0) | 2021.04.15 |
백준 2591번 - 숫자 카드 (0) | 2021.04.15 |
백준 2607번 - 비슷한 단어 (0) | 2021.04.14 |