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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 1332D Walk on Matrix(构造)

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1332D Walk on Matrix(构造) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一個錯誤的dp程序,目的是為了求從點 ( 1 , 1 ) 到點 ( n , m ) 只能向下移動或向右移動,找出一條路徑,使得 與運算 的結果最大,給出一個 k ,構造出正確答案與錯誤dp答案相差恰好為 k 時的一個矩陣

題目分析:首先要明白為什么題目給出的dp是錯誤的,乍一看其實沒什么錯誤,但是仔細想一下,題目維護的dp是局部最大值,而對于位運算來說,局部最大值不一定能推出全局最大值的,舉個很簡單的例子,如果同時要和 3 進行 與運算 ,4 & 3 = 0,但 3 & 3 = 3,這樣看來顯然題目給出的dp無法求出全局最大值

到這里如果直接構造的話實際上難度是非常大的,但這個題目很良心的給出了樣例二,我們只需要對于樣例二稍微分析一下就能提取出構造的核心

樣例二的 k 為 1 ,給出的答案為:

3 4

7 3 3 1

4 8 3 6

7 7 7 3

而dp矩陣為:

7 3 3 1

4 0 3 2

4 4 4 2

提示中也說了,最終答案應該是 3 ,而不是程序給出的 2 ,問題就出在了第 ( 3 , 3 ) 這一格上,本來應該將答案 3 一直下傳的,但是到了第 ( 3 , 3 ) 這里,被一個較大的數給沖掉了,使得 3 & 4 = 0 ,故最終答案只能是 2 & 3 = 2 了

有了上面樣例的提示,我們就知道了,應該在 ( 1 , 1 ) 處兵分兩路,一路維護全局最大值,一路維護局部最大值,最后在 ( n , m ) 前一格匯合,最后在 ( n , m ) 這一格使得全局最大值與 a[ n ][ m ] 運算后的答案為 0 ,而實際最大值為 k 即可

最后放一下官方題解的構造方案吧:

這個矩陣從 ( 1 , 1 ) 到 ( 2 , 2 ) 只有兩條路,( 1 , 1 ) -> ( 1 , 2 ) -> ( 2 ,?2 ) 維護的是 2^17,另一條路維護的是 k ,顯然 dp[ 2 ][ 2 ] 的值應該是 2^17 ,最后與 k 異或一下,會發現錯誤的dp的答案為 0 ,而實際上的答案為 k

非常巧妙的一道題

代碼:
?

#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int k;int num=1<<17;scanf("%d",&k);printf("2 3\n");printf("%d %d %d\n",num+k,num,0);printf("%d %d %d\n",k,num+k,k);return 0; }

?

總結

以上是生活随笔為你收集整理的CodeForces - 1332D Walk on Matrix(构造)的全部內容,希望文章能夠幫你解決所遇到的問題。

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