日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【COCI 2018/2019 Round #2】Kocka

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。