【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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ug8.0电脑的配置要求(ug8.0电脑
- 下一篇: 怎么解拆域名(怎么解拆域名密码)