ZR國慶Round2解題報告

2022-04-30 03:06:08 字數 4874 閱讀 5120

預計得分:100 + 10 - 20 + 10 = 120

實際得分:100 + 0 + 10 = 110

感覺這場打的挺穩的。開場秒掉a題,寫+調差不多1h

然後剛t3暴力,剛完還有2h左右。。然後,,這時候我zz的選擇去打t2的暴力,然而t2暴力真的不是一般的難寫。。

終於又花了1h打完t2暴力,又打了打\(n <= 10\)的表,感覺穩的一批。

然後開始跑\(n = 11\)的,結果到比賽結束也沒跑出來qwq。。

離比賽結束還有5min的時候發現t3跟k無關又少拿了20

下午看成績的時候發現t2 \(n = 1\)的點玩錯了完美爆零。。。。。。。

如果。。。再給我20min讓我打完t2的表、、、、

如果。。。再給我15min讓我打完t3的優化版暴力。。。。

好像就win了啊可惜沒如果。。。。。

單調佇列隨便做。。。

維護最大最小值,貪心的pop一下就好了。。

因為資料是隨機的,所以單調佇列裡的元素不會很多,deque維護一下。。

#include#define ll long long 

using namespace std;

const int maxn = 2e7 + 10;

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}struct node ;

int n, k, seed, l, r;

dequeqmx, qmn;

int main() );

qmn.push_back((node) );

while(!qmx.empty() && !qmn.empty() && (1ll * qmx.front().val > 1ll * qmn.front().val * k) )

if(!qmx.empty() && !qmn.empty()) ans += i - pre;

} cout << ans;

return 0;}/*

20000000 6

1234 4321 8765

*/

這題是真神仙題啊。。。

直接說標算吧。

設\(f[i][j]\)表示\(i\)個節點的無根樹,最大深度至多為\(j\)的方案數,

設\(g[i][j]\)表示\(i\)個節點的無根樹,最大最大深度恰好為\(j\)的方案數,顯然\(g[i][j] = f[i][j] - f[i][j - 1]\)

那麼\(f[i][j] = i * \sum_^i \frac * f[k][j - 1] * c_^\)

乙個公式。。包含了無數個trick。。orz xudyh。

首先把無根樹計數變成有根樹計數,然後列舉與根節點相連的編號最小的點\(k\)

前面要除掉\(i - k\)的原因是因為此時我們不清楚根節點

最後\(c_^\)的意思是我們欽定了根節點和它相連的編號最小的點之後的答案

那麼統計答案的時候

\[\sum g[k][j] * g[n - k][j] * c_^

\]這個應該比較好理解,就是左右分別算一算。

\(g[n][j] - \sum g[k][j - 1] * f[n - k][j - 1] * c_n^k\)

這個就比較有意思了,解釋一下

現在我們欽定了乙個根節點,只需要統計以它為中心的答案

\(g[n][j]\)表示的是深度最大為\(j\)的方案數,但是這裡面會有一些不滿足答案(只有一條長為\(j\)的鏈)

考慮減去不滿足條件的

列舉兩棵子樹,\(g[k][j - 1]\)保證了其中的乙個滿足條件,另乙個不滿足條件的方案就是從根節點開始深度至多為\(j - 1\)的方案

標算**看不懂。。。自己寫的調不出來。。咕咕咕。。

#include#define chmax(a, b) (a = (a < b ? b : a))

#define chmin(a, b) (a = (a < b ? a : b))

//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? eof : *p1++)

using namespace std;

const int maxn = 501;

// char buf[1 << 21], *p1 = buf, *p2 = buf;

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, m, f[maxn][maxn], g[maxn][maxn], c[maxn][maxn], mod;

int fastpow(int a, int p)

return base;

}int inv(int x)

main()

for(int i = 0; i <= n; i++) f[0][i] = g[0][i] = f[1][i] = g[1][i] = 1;

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

for(int j = 0; j <= n; j++) g[i][j] = (f[i][j] - f[i][j - 1] + mod) % mod, printf("%d %d %d\n", i, j, f[i][j]);

} for(int i = 0; i < n; i++) else }}

/**/

首先與\(k\)無關,因為可以取到\(=\)號

也就是說每個點只有選或不選兩種狀態

直接01分數規劃,把每個\(a[i] - x\),問題轉化為能不能刪去一些點,使得剩下的權值\(>0\)

那麼乙個點能成為答案,當且僅當它不是孤立點且與其他不選的點形成了獨立集(因為兩條邊之間最小有乙個要選)

也就是說我們要找出\(a[i] - val\)最小的獨立集,

但是似乎並不好搞,取一下負,找出\(val - a[i]\)最大的獨立集

然後就可以dp了。

\(dp[i]\)表示考慮右側的\(i\)個點,列舉上乙個點\(j\),再列舉一下左邊的點。觀察能否加入獨立集

第三維字首和優化一下,時間複雜度:\(o(n^2)\)

換一種dp方式,加乙個\(f[j]\)表示從\(j\)轉移到當前點的最優代價

for i = 1...n

dp[i] = max(f[j], 1 <= j < i)

f[i] = dp[i]

for all 區間 r = i

[l, r] = w

f[0....l - 1] += w

線段樹優化一下,interesting。

複雜度:\(o(nlog^2n)\)

#include#define chmax(a, b) (a = (a < b ? b : a))

#define chmin(a, b) (a = (a < b ? a : b))

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? eof : *p1++)

#define ls k << 1

#define rs k << 1 | 1

using namespace std;

const int maxn = 30001;

const double inf = 1e18, eps = 1e-9;

char buf[1 << 21], *p1 = buf, *p2 = buf;

inline int read()

while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();

return x * f;

}int n, m, k, l[maxn], r[maxn];

vectorv[maxn];

double dp[maxn], a[maxn], b[maxn], ta[maxn], tb[maxn];

struct node t[maxn << 2];

void add(int k, double val)

void pushdown(int k)

void update(int k)

void build(int k, int ll, int rr)

void intadd(int k, int ll, int rr, double val)

pushdown(k);

int mid = t[k].l + t[k].r >> 1;

if(ll <= mid) intadd(ls, ll, rr, val);

if(rr > mid) intadd(rs, ll, rr, val);

update(k);

}double query(int k, int ll, int rr)

bool check(double val)

double ans = 0;

for(int i = 1; i <= m + 1; i++) ans = max(ans, dp[i]);

return sum + ans > -eps;

}main()

double ans = -1;

while(r - l > eps)

printf("%.10lf", ans);

}

暑期十測 round2

vo lume 2 da y11 度熊的全1串 斐波那契數 高精度。區間交 離線排序 線段樹 尺取。拍照 運動學 字首和 線掃。da y12沙漠喝水 癟三題。區間的價值 預處理區間最小最大的在 用快排的方式分割區間,暴力更新答案。l國貨物運輸 二分判定,對不等式進行分析。da y13車站檢票 癟三二...

dp 雜練 專練 round2

上次題似乎有點水 大概到noi之前會進行一些針對自己薄弱點的專項訓練吧 bz oj1419re disg ood 額.dp i j 表示re d剩i張 bla ck剩j 張的期望 每次期望 概率 轉移就行 注意如果期望在 0以下就 不取了 空間不夠 所以滾 一下 code by liuchenrui...

SDOI2016Round1 解題報告

題意 求 n?1i 0 m?1j 0max ixorj k,0 因為是抑或操作,每一位都是獨立的,所以可以一位一位的算貢獻。f i a b c 表示第i位時,每個數跟n,m,k的大小關係,0表示小於,1表示i位之前都相等,2表示大於。轉移的時候美劇當前這一位的數是什麼,從高位向低位轉移就行了。複雜度...