結果

問題 No.318 学学学学学
ユーザー asugen0402
提出日時 2019-02-08 14:34:44
言語 C
(gcc 13.3.0)
結果
AC  
実行時間 81 ms / 2,000 ms
コード長 8,584 bytes
コンパイル時間 1,258 ms
コンパイル使用メモリ 33,280 KB
実行使用メモリ 7,220 KB
最終ジャッジ日時 2024-06-22 18:47:37
合計ジャッジ時間 3,918 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 26
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
//
#define D_ARRAY_MAX 100000 //
#define D_SEGT_CNT 131072 // (2)
#define D_SEGT_INI 0 //
#define D_TREE_MAX D_ARRAY_MAX //
#define D_TREE_WCNT 2 //
#define D_TREE_LEFT 0 // -
#define D_TREE_RIGHT 1 // -
// -
typedef struct Tree {
int miVal; //
int miMin; //
int miMax; //
int mi1Height[D_TREE_WCNT]; //
struct Tree *mzp1Child[D_TREE_WCNT]; //
} Tree;
//
static FILE *szpFpI; //
static int si1Array[D_ARRAY_MAX]; //
static int siACnt; //
static int si1SegT[D_SEGT_CNT * 2]; //
static Tree sz1Tree[D_TREE_MAX]; //
static int siTCnt; //
static Tree *szpTop; //
// -
int
fSegTUp(
int piUpS // <I> - 0
, int piUpE // <I> - 0
, int piUpVal // <I>
, int piSNo // <I> 1
, int piSCrgS // <I> - 0
, int piSCrgE // <I> - 0
)
{
//
if (piUpE < piSCrgS || piSCrgE < piUpS) {
return 0;
}
//
if (piUpS <= piSCrgS && piSCrgE <= piUpE) {
si1SegT[piSNo] = piUpVal; //
return 0;
}
//
if (si1SegT[piSNo] != D_SEGT_INI) { //
si1SegT[piSNo * 2] = si1SegT[piSNo];
si1SegT[piSNo * 2 + 1] = si1SegT[piSNo];
si1SegT[piSNo] = D_SEGT_INI; //
}
//
int liHalf = (piSCrgE - piSCrgS + 1) / 2;
//
fSegTUp(piUpS, piUpE, piUpVal, piSNo * 2, piSCrgS, piSCrgS + liHalf - 1);
fSegTUp(piUpS, piUpE, piUpVal, piSNo * 2 + 1, piSCrgE - liHalf + 1, piSCrgE);
return 0;
}
// -
int
fSegTGet(
int piSNo // <I> 1
)
{
int liRet;
//
liRet = si1SegT[piSNo];
//
while (piSNo > 1) {
piSNo /= 2; //
if (si1SegT[piSNo] != D_SEGT_INI) { //
liRet = si1SegT[piSNo];
}
}
return liRet;
}
// -
Tree *
fTreeMake(
int piVal // <I>
, int piNo // <I>
)
{
//
Tree *lzpTree = &(sz1Tree[siTCnt]);
siTCnt++;
//
memset(lzpTree, 0, sizeof(Tree)); //
lzpTree->miVal = piVal; //
lzpTree->miMin = piNo; //
lzpTree->miMax = piNo; //
return lzpTree;
}
// - -
int
fTreeCmp(
Tree *pzpTree // <I>
, int piVal // <I>
)
{
//
if (piVal < pzpTree->miVal) { //
return -1;
}
else if (piVal > pzpTree->miVal) { //
return 1;
}
return 0;
}
// -
int
fTreeGetHeight(
Tree *pzpTree // <I>
)
{
//
if (pzpTree == NULL) {
return 0;
}
if (pzpTree->mi1Height[D_TREE_LEFT] >= pzpTree->mi1Height[D_TREE_RIGHT]) {
return pzpTree->mi1Height[D_TREE_LEFT] + 1;
}
else {
return pzpTree->mi1Height[D_TREE_RIGHT] + 1;
}
}
// - ()
int
fTreeRttR(
Tree **pzppTree // <I>
)
{
//
Tree *lzpChild = (*pzppTree)->mzp1Child[D_TREE_LEFT];
//
(*pzppTree)->mzp1Child[D_TREE_LEFT] = lzpChild->mzp1Child[D_TREE_RIGHT]; // =
(*pzppTree)->mi1Height[D_TREE_LEFT] = lzpChild->mi1Height[D_TREE_RIGHT]; // () = ()
lzpChild->mzp1Child[D_TREE_RIGHT] = *pzppTree; // =
lzpChild->mi1Height[D_TREE_RIGHT] = fTreeGetHeight(*pzppTree); // () -
*pzppTree = lzpChild; // =
return 0;
}
// - ()
int
fTreeRttL(
Tree **pzppTree // <I>
)
{
//
Tree *lzpChild = (*pzppTree)->mzp1Child[D_TREE_RIGHT];
//
(*pzppTree)->mzp1Child[D_TREE_RIGHT] = lzpChild->mzp1Child[D_TREE_LEFT]; // =
(*pzppTree)->mi1Height[D_TREE_RIGHT] = lzpChild->mi1Height[D_TREE_LEFT]; // () = ()
lzpChild->mzp1Child[D_TREE_LEFT] = *pzppTree; // =
lzpChild->mi1Height[D_TREE_LEFT] = fTreeGetHeight(*pzppTree); // () -
*pzppTree = lzpChild; // =
return 0;
}
// -
// [1] [0]
int
fTreeComAddDel(
Tree **pzppNow // <I>
, int piWay // <I>
)
{
//
int liNew = fTreeGetHeight((*pzppNow)->mzp1Child[piWay]);
if ((*pzppNow)->mi1Height[piWay] == liNew) { //
return 0;
}
(*pzppNow)->mi1Height[piWay] = liNew; //
//
if ((*pzppNow)->mi1Height[D_TREE_LEFT] - (*pzppNow)->mi1Height[D_TREE_RIGHT] > 1) { //
fTreeRttR(pzppNow); //
}
else if ((*pzppNow)->mi1Height[D_TREE_RIGHT] - (*pzppNow)->mi1Height[D_TREE_LEFT] > 1) { //
fTreeRttL(pzppNow); //
}
return 1;
}
// -
// [1] [0] [-1]
int
fTreeAdd(
Tree **pzppNow // <I>
, int piVal // <I>
, int piNo // <I>
)
{
//
if (*pzppNow == NULL) {
*pzppNow = fTreeMake(piVal, piNo);
return 1;
}
//
int liRet = fTreeCmp(*pzppNow, piVal);
//
if (liRet == 0) {
(*pzppNow)->miMax = piNo; // -
return -1;
}
//
int liWay;
if (liRet < 0) { //
liWay = D_TREE_LEFT;
}
else { //
liWay = D_TREE_RIGHT;
}
//
liRet = fTreeAdd(&((*pzppNow)->mzp1Child[liWay]), piVal, piNo);
if (liRet < 1) { // or
return liRet;
}
//
return fTreeComAddDel(pzppNow, liWay);
}
// -
int
fTreeAll(
Tree *pzpNow // <I>
)
{
//
if (pzpNow == NULL) {
return 0;
}
//
fTreeAll(pzpNow->mzp1Child[D_TREE_LEFT]);
// -
fSegTUp(pzpNow->miMin, pzpNow->miMax, pzpNow->miVal, 1, 0, D_SEGT_CNT - 1);
//
fTreeAll(pzpNow->mzp1Child[D_TREE_RIGHT]);
return 0;
}
//
int
fMain(
int piTNo // <I> 1
)
{
int i;
char lc1Buf[1024];
// -
memset(si1SegT, 0, sizeof(si1SegT)); //
siTCnt = 0; //
szpTop = NULL; //
// -
#ifdef D_TEST
sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
szpFpI = fopen(lc1Buf, "r");
#else
szpFpI = stdin;
#endif
// -
fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
sscanf(lc1Buf, "%d", &siACnt);
// -
for (i = 0; i < siACnt; i++) {
int liVal;
fscanf(szpFpI, "%d", &liVal);
// -
fTreeAdd(&szpTop, liVal, i);
}
fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
//
fTreeAll(szpTop);
// -
for (i = 0; i < siACnt; i++) {
si1Array[i] = fSegTGet(D_SEGT_CNT + i);
}
// -
printf("%d", si1Array[0]);
// -
for (i = 1; i < siACnt; i++) {
printf(" %d", si1Array[i]);
}
//
printf("\n");
//
#ifdef D_TEST
fclose(szpFpI);
#endif
return 0;
}
int
main()
{
#ifdef D_TEST
int i;
for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
fMain(i);
}
#else
fMain(0);
#endif
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0