2020杭電多校第五場題解

2022-07-22 22:48:46 字數 4785 閱讀 2476

施工中。。。

已知 \(a\times b\times c\) 的四面體,以 \(a\) 為 \(x\) 軸,\(b\) 為 \(y\) 軸, \(c\) 為 \(z\) 軸

以 \(z\) 為軸做切面,為 \(c\times \frac}\) 的三角形

則易知 \(h= \frac}\)

\(\frac=\frac+\frac+\frac\),\(o(n\log n)\) 求 \(\frac\) 的期望即可

比賽時一發過。

#include#define ll long long

#define maxn 6000010

#define mod 998244353

using namespace std;

ll pe[maxn], sum[maxn];

ll po(ll x)

return bas;

}int main()

int t;

scanf("%d", &t);

while (t--)

return 0;

}

手模一下一張紙的情況,多折幾次就基本明白了。

每一次摺紙實際上就是將當前的狀態複製乙份,然後翻轉。

比賽時一發過。

#include using namespace std;

vectorp[12];

void init() ;

for (int i = 1; i <= 10; i++)

}int a[500][2000];

int b[500 * 2000];

int col[2000];

int main()

else

flag ^= true;

} for (int i = 1; i <= 2 * n - 1; i++)

for (int j = 1; j <= (1 << k) - 1; j++)

printf("%d ", b[a[2 * n][j]]);

printf("%d\n", b[a[2 * n][1 << k]]);

} return 0;

}

題意為求乙個樹上的子圖,使得子圖全連通、子圖上度數大於 \(k\) 的點至多為 \(1\) 個、子圖邊權值和最大

我們任取一點為根,做樹形 \(dp\),令 \(dp[i][j]\) 表示

\(dp[i][0]\) 為子樹中最大的 \(k-1\) 個 \(dp[j][0]\)

\(dp[i][1]\) 為所有子樹的 \(dp[j][0]\) 之和或 \(dp[i][0]\) 刪除乙個子樹換成 \(dp[j][1]\)

對於每個 \(i\) 容易由 \(dp[i][0]\) 和 \(dp[i][1]\) 得到以 \(i\) 為根的子圖的最大值,求最值即可

比賽時一發過。

#include using namespace std;

typedef long long ll;

typedef pairpii;

typedef pairpll;

const int maxn = 2e5 + 5;

ll dp[maxn][2];

vectore[maxn];

int main()

if (k == 0)

ll ans = 0;

functiondfs;

dfs = [&](int now, int fa)

ll ansl = 0, ansr = 0;

sort(a.begin() + 1, a.begin() + 1 + g,

(const pll& a, const pll& b) );

for (int i = 1; i <= min(k - 1, g); i++)

dp[now][0] += a[i].first;

if (g >= k)

ansl = dp[now][0] + a[k].first;

else

ansl = dp[now][0];

ans = max(ans, ansl);

for (int i = 1; i <= g; i++)

dp[now][1] += a[i].first;

ansr = dp[now][1];

for (int i = 1; i <= min(k - 1, g); i++)

dp[now][1] =

max(dp[now][1], dp[now][0] - a[i].first + a[i].second);

for (int i = k; i <= g && (k - 1 > 0); i++)

dp[now][1] =

max(dp[now][1], dp[now][0] - a[k - 1].first + a[i].second);

for (int i = 1; i <= min(k, g); i++)

ansr = max(ansr, ansl - a[i].first + a[i].second);

for (int i = k + 1; i <= g && (k > 0); i++)

ansr = max(ansr, ansl - a[k].first + a[i].second);

ans = max(ans, ansr);

};dfs(1, 0);

printf("%lld\n", ans);

} return 0;

}

該題為 \(1012\) 的變式,由於 \(n\leq 5000\),所以可以用 \(o(n^2)\) 的 \(dp\) 解決。

\(dp[i]\) 表示倒數第 \(i\) 個存活的機率,首先要計算最後剩餘數,將其 \(dp\) 值賦為 \(1\) 。

然後加入人數,直到 \(n\) 個人。如果這個數不是一定被取出,就做更新一次 \(dp\),否則 \(dp[i]=0\) 。

\[\begindp[i]=dp[i]\times \frac+dp[i-1]\times \frac,j 為當前數字全部數量\end

\]比賽時對剩餘人數處理和題目表達的方式有出入,導致wa1,理清處理方法後就過了。

#include#define ll long long

#define maxn 100010

#define mod 998244353

using namespace std;

ll inv[maxn], ans[maxn];

ll qpow(ll x, ll y)

return bas;

}ll po(ll x)

return bas;

}int main()

int t;

scanf("%d", &t);

while (t--)

for (int i = res; i < n; i++)

else

}} for (int i = n - 1; i > 0; i--) printf("%lld ", ans[i]);

printf("%lld\n", ans[0]);

} return 0;

}

純粹找規律(大霧)

期望為\(1+2^n+(3^n)/(2^)\)

比賽時一發過。

#include#define ll long long

#define maxn 1000010

#define mod 998244353

using namespace std;

ll qpow(ll x, ll y)

return bas;

}ll po(ll x)

return bas;

}int main()

ll ans = qpow(2, n) + 1;

ans %= mod;

ans = ans + qpow(3, n) * po(qpow(2, n - 1)) % mod;

ans %= mod;

printf("%lld\n", ans);

} return 0;

}

由 \(1008\) 的 \(dp\) 式可以得到正解,但 \(o(n^2)\) 的 \(dp\) 會 \(\text\),所以找找規律。不難得出規律:

\[\begin對於任意乙個合法的n,前 \lfloor \frac \rfloor 個數都是 0 \\dp[\frac]=\frac}} \\dp[i+1]=dp[i]\times \frac+i}\ (i

比賽時一發過。

#include#define ll long long

#define maxn 1000010

#define mod 998244353

using namespace std;

ll qpow(ll x, ll y)

return bas;

}ll po(ll x)

return bas;

}int main()

for (int i = 1; i <= n / 2; i++) printf("0 ");

ll ans = po(qpow(2, n / 2));

printf("%lld ", ans);

for (int i = 1; i < n / 2; i++)

printf("%lld\n", ans);

} return 0;

}

2019杭電多校第五場

有兩個題隊友補的,先安利一波 1005 permutation 1 hdu 6628 題意 給你乙個n和k,求n的全排列中,相鄰兩數的差值的陣列字典序第k小的排列 思路 其實就是兩個字,暴力.字典序第k小,k的範圍是n!跟10000取min,8!40320,是第乙個大於10000的數,所以當n小於等...

20190805杭電多校第五場

1004 equation 做法很簡單,寫起來容易混。首先想到去絕對值。因為滿足a 0,顯然當x增大時ax b的值也在增大,所以可以對所有 a,b 按 顯然存在n 1個區間,每個區間都可以將式子分為兩部分,前半部分均為 ax b,後半部分均為ax b。區間依次為 預處理a和b的負的字首和與正的字尾和...

2019杭電多校第五場補題

1001 fraction bx a mod p 可以轉換為 bx kp a.因為a的範圍是 0,b 則列出不等式 又因為1p x b k p x 1 frac frac frac xp k b x 1p 據說是乙個經典問題 給你a,b,c,d,求最簡分式x y frac yx 滿足a b x y ...