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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019-08-15下午三道練習題CF1199
思路有點難想 but很好實現
這是原網站鏈接:傳送門 這里只完成D, E, F三題

文章目錄

  • D:Welfare State
    • 題目大意
    • 正解
    • 瞅瞅代碼
  • E:Matching vs Independent Set
    • 題目大意
    • 正解
    • 代碼實現
  • F:Rectangle Painting 1
    • 題目大意
    • 正解
    • 代碼實現

D:Welfare State

題目大意

=
n個人
接下來一行有n個數,第i個數表示第i個人手上的錢a[i]
q次操作
操作分為兩種:
1): 1 x 表示所有人手上的不能低于x ,即錢數少于x的人,把它的錢數變為x
2): 2 x y 表示第x個人的錢變為y
數據范圍:
n (1≤n≤2?10^5) (0≤ai≤10^9) (1≤q≤2?10^5) (1≤p≤n, 0≤x≤10^9) (0≤x≤10^9)

正解

=
第二種操作很好解決,直接賦值覆蓋即可
問題就在于第一種操作
如果我們讀入一條語句就進行操作,那么就必須在線O(n)操作 坑定會炸!
想一下,在i個人的最后一次2操作j時,那么j+1~q次操作中的1操作都有可能影響i
所以我們就從后往前離線操作,記錄到j次操作為止中1操作的最大值,與這個人最后一次2操作進行比較max

瞅瞅代碼

#include <cstdio> #include <iostream> using namespace std; #define MAXN 500005 struct node {int kind, x, y; }a[MAXN]; int n, q, Max; int res[MAXN]; bool flag[MAXN]; int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ )scanf ( "%d", &res[i] );scanf ( "%d", &q );for ( int i = 1;i <= q;i ++ ) {a[i].y = -1;scanf ( "%d", &a[i].kind );if ( a[i].kind == 1 ) scanf ( "%d %d", &a[i].x, &a[i].y );else scanf ( "%d", &a[i].x );}for ( int i = q;i >= 1;i -- ) {if ( a[i].kind == 1 ) {if ( flag[a[i].x] ) continue;elseres[a[i].x] = max ( a[i].y, Max );flag[a[i].x] = 1;}elseMax = max ( Max, a[i].x );}for ( int i = 1;i <= n;i ++ ) {if ( ! flag[i] ) res[i] = max ( res[i], Max );printf ( "%d ", res[i] );}return 0; }

E:Matching vs Independent Set

題目大意

T組數據,第一行輸入n,m 共有3n個點,m條邊
接下來m行,表示u,v兩點之間有無向邊相連
1)如果任選n條邊,滿足這n條邊上的點只被一條邊覆蓋,即這些點的入度和出度和為1.eg:選兩條邊1,2和2,3就不符合題意因為2被兩條邊覆蓋了
符合題意就輸出Matching,第二行輸出這n條邊的編號
2)如果任選n條邊后,滿足至少n個點是孤立的,eg:選兩條邊1,2和2 3那么1,3就滿足題意因為它們之間無直接邊相連 (且1,3算兩個點)
滿足題意就輸出IndSet,第二行輸出這n個點的編號
3)如果都不滿足就輸出Impossible
(1≤n≤10^5, 0≤m≤5*10^5)1≤vi,ui≤3?n)

正解

首先要想明白,根本沒有Impossible的可能,證明一下:因為共有3n個點,選n條邊,最多也只能覆蓋2n個點,那么剩下的n個點也是孤立的。
其次,這個如果是考試一般要綁點,就別想著騙分了

那么很好想不能滿足邊,就一定滿足點
我們就在線操作,對u,v進行打標,滿足邊就tot++,最后判斷tot輸出就好了
還可用打標的flag數組進行答案輸出

代碼實現

#include <cstdio> #include <cstring> #define MAXN 300005 #define MAXM 500005 int n, m, t, cnt; bool flag[MAXN]; int a[MAXM]; int main() {scanf ( "%d", &t );while ( t -- ) {for ( int i = 1;i <= 3 * n;i ++ )flag[i] = 0;cnt = 0;scanf ( "%d %d", &n, &m );for ( int i = 1;i <= m;i ++ ) {int u, v;scanf ( "%d %d", &u, &v );if ( flag[u] || flag[v] ) continue;else {flag[u] = flag[v] = 1;a[++ cnt] = i;}}if ( cnt >= n ) {printf ( "Matching\n" );for ( int i = 1;i <= n;i ++ )printf ( "%d ", a[i] );printf ( "\n" );}else {printf ( "IndSet\n" );int tot = 0;for ( int i = 1;i <= 3 * n;i ++ ) {if ( tot >= n ) break;if ( ! flag[i] ) {tot ++;printf ( "%d ", i );}}printf ( "\n" );}}return 0; }

F:Rectangle Painting 1

題目大意

輸入n,接下來輸入nn的字符矩陣,‘#’, ‘.’
求最少把整個矩陣全都變為‘.’的代價和
自選矩陣大小hw以及矩陣的位置,然后被這個矩陣所包含的所有點都變為‘.’
代價為max (h, w)
n (1≤n≤50)

正解

首先拿到這個題,坑定暴搜是有分的,但會炸
那我們就思考假設對于一個23的矩陣,那么影響這個矩陣的方案有13+23(把第一行和第二行斷開),12+22(把第一列和第二三列斷開),22+12(把第一二列和第三列斷開)然后在對于每一種斷開繼續以上操作,直到分出11的矩陣,就知道答案了
所以我們就要記憶化搜索,防止重復遍歷超時,不斷更新最小值

代碼實現

#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXN 55 int n; bool flag[MAXN][MAXN]; int dp[MAXN][MAXN][MAXN][MAXN]; int dfs ( int sx, int sy, int ex, int ey ) {if ( dp[sx][sy][ex][ey] != -1 ) return dp[sx][sy][ex][ey];if ( sx == ex && sy == ey ) return dp[sx][sy][ex][ey] = flag[sx][sy];int result1 = 0x7f7f7f7f, result2 = 0x7f7f7f7f;if ( sx != ex )for ( int i = sx;i < ex;i ++ )result1 = min ( result1, dfs ( sx, sy, i, ey ) + dfs ( i + 1, sy, ex, ey ) );if ( sy != ey )for ( int i = sy;i < ey;i ++ )result2 = min ( result2, dfs ( sx, sy, ex, i ) + dfs ( sx, i + 1, ex, ey ) );return dp[sx][sy][ex][ey] = min ( min ( result1, result2 ), max ( ( ex - sx + 1 ), ( ey - sy + 1 ) ) ); } int main() {scanf ( "%d", &n );for ( int i = 1;i <= n;i ++ ) {scanf ( "\n" );for ( int j = 1;j <= n;j ++ ) {char tu;scanf ( "%c", &tu );if ( tu == '#' ) flag[i][j] = 1;else flag[i][j] = 0;}}memset ( dp, -1, sizeof ( dp ) );int result = dfs ( 1, 1, n, n );printf ( "%d", result );return 0; }


連A三道,偶的媽呀!大神這是要逆天啦!!!
你這次考了倒數第五名,從倒數第一進步了五名,這么學下去,你不得牛死!
好了代碼,或者思路有任何不懂的,在評論區留言,我看見會給你進行答復知道你懂為止 ,讓我們下期再見,bye~~

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【CF1199 D,E, F】Welfare State // Matching vs Independent Set // Rectangle Painting 1的全部內容,希望文章能夠幫你解決所遇到的問題。

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