2020杭電多校第三場

2022-09-06 15:30:25 字數 2736 閱讀 2679

求和為p的倍數的塊的最大數量,我用了比較暴力的做法,好像有dp的做法?

#include using

namespace

std;

typedef

long

long

ll;#define rep(i, a, b) for (register int i = a; i <= b; i++)

intn, p;

intf, ans, flag;

inline

void

solve()

}if(flag)

else

a.push_back(f);

}cout

<< ans <

}int

main()

}

view code

並查集維護塊的數量,每合併乙個塊減去對應產生的貢獻。

#include using

namespace

std;

typedef

long

long

ll;#define rep(i, a, b) for (register int i = a; i <= b; i++)

int mod = 1e9 + 7

;int pre[100010

];int find(int x)

int n, a[100010

];int

u, v;

int cnt1, cnt2, s1[100010], s2[100010

];ll ans;

inline

void

solve()

else

}ans = 1ll * cnt2 * (cnt2 - 1) * (cnt2 - 2) / 6 + 1ll * cnt2 * (cnt2 - 1) * cnt1 / 2

; cout

<< ans % mod <

rep(i,

1, n - 1

)

}int

main()

}

view code

邊權隨機的情況下,最短路的邊數很少?

求出最短路,再依次刪除這條路所有邊,遞迴求解。

複雜度為求最短路的複雜度*最短路邊數的k次方

#include using

namespace

std;

typedef

long

long

ll;#define rep(i, a, b) for (register int i = a; i <= b; i++)

intn, k;

int mp[55][55

], u, v, w;

int d[55], vis[55], f[10][55

];int

ans;

void dfs(int

step)

d[1] = 0

; rep(i,

1, n)

}if (step == 0

)

for (int i = n, j, k; i != 1; i =j)

}inline

void

solve()

ans = 0

; dfs(k);

cout

<< ans <

}int

main()

}

view code

將'*'換成 '(',')'或' ',求最短的,字典序最小的平衡字串。

先將左右括號的個數整相等,再判斷字串合不合法,不合法再成對的改變*號

#include using

namespace

std;

typedef

long

long

ll;#define rep(i, a, b) for (register int i = a; i <= b; i++)

char s[100010

];int cnt1, cnt2, num, sum[100010

];int tmp[100010

], l, r, id;

inline

void

solve()

if (cnt1 >cnt2)

rep(i,

1, cnt1 - cnt2) s[tmp[r--]] = ')'

;

if (cnt1

rep(i,

1, cnt2 - cnt1) s[tmp[l++]] = '('

; num = 0

; rep(i,

0, n - 1

)

s[tmp[l++]] = '('

; s[tmp[r--]] = ')'

; num = 0

; }

}if (num != 0

)

rep(i,

0, n - 1) if (s[i] == '

*') continue

;

else

putchar(s[i]);

puts(

"");

}int

main()

}

view code

2020牛客多校第三場

沒有魚,沒有魚餌 沒有魚,有魚餌 有魚,沒魚餌 有魚,有魚餌 每個只能做其中乙個操作,如果在某個點之前已經拿過魚餌,還沒用,就能拿個魚,如果在某個點有魚,就能拿個魚。現在問最多能拿多少條魚?思路 貪心,如果有魚那肯定拿魚,魚 1,然後就剩0和1操作了,如果遇到1操作,直接拿魚餌,遇到0操作,看有沒有...

hdu多校第三場

題意是將給出的數相加計算出 其中p 的倍數的最大個數。由題意可得,在任意兩個數相加時,其模值必在0 p 1之間,將兩數相加的模值替換掉之前的兩個數字,得到長度減一的效果,用0和1 標記對應模值是否出現,從而代表被處理過的但還沒有達到 p 的倍數的值,直到某次得到的模值為 0 時,再清空之前的標記 代...

2013第三場多校

第三場多校 至今最慘的一場多校。共作出兩題。1008 狀態壓縮優化的搜尋 0 比賽時候直接狀態壓縮dp,結果tle了。沒有算好時間複雜度,第一次交的時候沒有測大資料。應該多想幾種方法,做到一a才行,不然卡題會卡很久。1 後來直接搜尋,從最後乙個狀態開始搜,每次都用乙個回文串,然後搜另乙個的最小步數。...