生活随笔
收集整理的這篇文章主要介紹了
【COCI 2018/2019 Round #2】Kocka
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這道題也是一個ex的模擬題
不過他比Zamjena可愛
作為一個帥氣的小哥哥,讓我們一起,
開啟你的模擬ex大門,C++從入門到放棄!
題目
題目描述
我又來了!我又來了!
在清晨來到兒童游樂園的時候,出題人看到了一些有趣的物體:這些物體是由金屬棒組成的大小不一的立方體。
在觀察這些立方體的時候,出題人想到了一個有趣的問題,下面是這個問題的二維版本(因為沒有人喜歡涉及三維對象的問題):你得到一個n*n的矩形(參考正方形),矩形中的一些方格是空的,有些不是。出題人從四面八方查看這個矩形,首先,他從矩形的左邊開始看,記錄下第一個不為空的方格的前面有多少個空格,如果這一行沒有非空方格,則記錄為-1。然后,他重復前面的操作,從右邊,上面和下面觀察這個矩形,這樣,他得到了4n個這樣的數字(每個邊記錄n個數字),然而,某個未知惡魔破壞了這個矩形,只留下了出題人留下的數字。出題人想知道,留下的這些數字是否有意義,即通過這些數字,是否能夠組成一個正方形。
輸入格式
第一行包含正整數n(1≤n≤100000),表示這個正方形的邊長。
第二行輸入n個數字Li(-1≤Li<n),表示從左邊觀察時第一個到第n個數字。
第三行輸入n個數字Ri(-1≤Ri<n),表示從右邊觀察時第一個到第n個數字。
第四行輸入n個數字Ui(-1≤Ui<n),表示從上邊觀察時第一個到第n個數字。
第五行輸入n個數字Di(-1≤Di<n),表示從下邊觀察時第一個到第n個數字。
輸出格式
如果這些數字能組成一個正方形,輸出“DA”,否則輸出“NE”
樣例
樣例輸入1
3
-1 2 0
-1 0 1
2 2 1
0 0 1
樣例輸出1
DA
樣例輸入2
3
-1 0 1
-1 2 1
-1 2 -1
1 0 -1
樣例輸出2
NE
題解
既然要輸出DA,NE,那肯定是綁點了的,想單純騙分很考技術!
讀完題后肯定知道如果相互矛盾就是NE,不然就是DA,
沒有必要去把整個矩陣給模擬構造出來,
只需要去判斷四個數組條件是否相互沖突即可
接下來沖突的情況口頭上講解是比較難以理解
可以畫一畫樣例跟著一起推幫助理解
左右,上下沖突的情況:l+r>=n,u+d>=n
證明:只有1個非空點i,那么l應該為i-1,r應該為n-i,相加是n-1,證畢
左與上下,右與上下,上與左右,下與左右,垂直沖突的情況:
以證明左與上下為例:
如果l=-1,那么這一行就都是空,
那么任何一個u,d的非空位置都不能出現在這一行上
可以把這四種情況合成一個for循環完成
因為每一個l,r,u,d是第一個非空的位置-1
這中間可能有很多個非空
我們就只能找到第一個進行判斷
代碼實現
因為我的代碼力。。。
這道題我把n砍成了一半,里面有些許變化
#include <cstdio>
#define MAXN 100005
int n
;
int l
[MAXN
], r
[MAXN
], u
[MAXN
], d
[MAXN
];
bool L
[MAXN
], R
[MAXN
], U
[MAXN
], D
[MAXN
];
int main() {scanf ( "%d", &n
);for ( int i
= 1;i
<= n
;i
++ )scanf ( "%d", &l
[i
] );for ( int i
= 1;i
<= n
;i
++ )scanf ( "%d", &r
[i
] );for ( int i
= 1;i
<= n
;i
++ )scanf ( "%d", &u
[i
] );for ( int i
= 1;i
<= n
;i
++ )scanf ( "%d", &d
[i
] );for ( int i
= 1;i
<= n
;i
++ ) {if ( l
[i
] + r
[i
] >= n
|| u
[i
] + d
[i
] >= n
) return ! printf ( "NE" );if ( l
[i
] != r
[i
] && ( l
[i
] == -1 || r
[i
] == -1 ) ) return ! printf ( "NE" );if ( u
[i
] != d
[i
] && ( u
[i
] == -1 || d
[i
] == -1 ) ) return ! printf ( "NE" );}for ( int i
= 1;i
<= n
/ 2;i
++ ) {if ( l
[i
] != -1 && u
[l
[i
] + 1] == -1 ) return ! printf ( "NE" );if ( r
[i
] != -1 && u
[n
- r
[i
]] == -1 ) return ! printf ( "NE" );if ( u
[i
] != -1 && l
[u
[i
] + 1] == -1 ) return ! printf ( "NE" );if ( d
[i
] != -1 && l
[n
- d
[i
]] == -1 ) return ! printf ( "NE" );if ( l
[i
] != -1 && ! L
[l
[i
]] ) {L
[l
[i
]] = 1;if ( u
[l
[i
] + 1] > i
- 1 ) return ! printf ( "NE" );}if ( r
[i
] != -1 && ! R
[r
[i
]] ) {R
[r
[i
]] = 1;if ( u
[n
- r
[i
]] > i
- 1 ) return ! printf ( "NE" );}if ( u
[i
] != -1 && ! U
[u
[i
]] ) {U
[u
[i
]] = 1;if ( l
[u
[i
] + 1] > i
- 1 ) return ! printf ( "NE" );}if ( d
[i
] != -1 && ! D
[d
[i
]] ) {D
[d
[i
]] = 1;if ( l
[n
- d
[i
]] > i
- 1 ) return ! printf ( "NE" );}}for ( int i
= 1;i
<= n
;i
++ )L
[i
] = R
[i
] = U
[i
] = D
[i
] = 0;for ( int i
= n
;i
> n
/ 2;i
-- ) {if ( l
[i
] != -1 && d
[l
[i
] + 1] == -1 ) return ! printf ( "NE" );if ( r
[i
] != -1 && d
[n
- r
[i
]] == -1 ) return ! printf ( "NE" );if ( u
[i
] != -1 && r
[u
[i
] + 1] == -1 ) return ! printf ( "NE" );if ( d
[i
] != -1 && r
[n
- d
[i
]] == -1 ) return ! printf ( "NE" );if ( l
[i
] != -1 && ! L
[l
[i
]] ) {L
[l
[i
]] = 1;if ( d
[l
[i
] + 1] > n
- i
) return ! printf ( "NE" );}if ( r
[i
] != -1 && ! R
[r
[i
]] ) {R
[r
[i
]] = 1;if ( d
[n
- r
[i
]] > n
- i
) return ! printf ( "NE" );}if ( u
[i
] != -1 && ! U
[u
[i
]] ) {U
[u
[i
]] = 1;if ( r
[u
[i
] + 1] > n
- i
) return ! printf ( "NE" );}if ( d
[i
] != -1 && ! D
[d
[i
]] ) {D
[d
[i
]] = 1;if ( r
[n
- d
[i
]] > n
- i
) return ! printf ( "NE" );}}printf ( "DA" );return 0;
}
我終于A了一道結論題,
過不了多久,我會再發一篇ex至極的博客,Zamjena,仙女還沒A這道題
有什么問題,歡迎留言,后會有期,bye~~
總結
以上是生活随笔為你收集整理的【COCI 2018/2019 Round #2】Kocka的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。