AGC 049 部分簡要題解

2022-05-20 04:46:00 字數 3265 閱讀 5507

nmd 差1分鐘過 e,真就老年選手不配進第一頁/ll

計算每個點的貢獻,做完了

#includeusing namespace std;

typedef long long ll;

const int n = 110;

string s[n];

int n;

bitsettow[n];

int main()

int s[n], t[n], n;

int ss,tt;

int f=0;

int main()

+1, 1\) 出來,把 \(a_i\) 安排掉,或者直接把乙個 \(a_i-b_i\) 取到 \(\ge 0\),之後暴力就行。

#includeusing namespace std;

const int n = 2e5+5;

typedef pairpii;

int n;

int a[n], b[n], lst[n];

vectorvec;

vectorvec2;

int main()

else

} reverse(vec.begin(),vec.end());

reverse(vec2.begin(),vec2.end());

reverse(cost.begin(),cost.end());

if(vec.empty())else

for(int i=-1;i<(int)vec.size();++i)

// cout << i << ":" << w << endl;

ans = min(ans, w);

} cout << ans << endl;

}}

相當於是要求它是下凸的。

考慮分成斜率 \(>0,=0,<0\) 三個部分。

對於 \(1,3\) 部分,我們考慮斜率的差分:\(f[i][j]\) 表示 \(i\) 個數,和是 \(j\) 的結果。如果這個位置的斜率是 \(t\)(這個時候後面全部要斜率 \(+t\)),會增加 \(t*i*(i-1)/2\),暴力dp即可(第一維只有根號)

#includeusing namespace std;

typedef long long ll;

const int mod = 1e9+7;

inline int add(int a,int b)

inline int sub(int a,int b)

inline int mul(int a,int b)

inline int qpow(int a,int b)

/* math */

int n,m;

int dp[450][100010], f[450][100010], g[450][100010];

int main()

} for(int j=0;j<=m;j++)

} int ans=0;

// cout << mx << endl;

for(int i=1;i<=min(n,mx);i++)

} cout << ans << endl;

}

考慮原問題可以轉化成:

給乙個二維的矩陣,其中 \(\forall_ g(k,i) = 1\)。每次可以單點異或 \(1\) 或者一行顏色相同的異或 \(1\),代價分別是 \(1\) 或者 \(c\)。

於是原問題轉化成了 \(o(nk)\) 個 \(b_ = \\) 的問題。

考慮 \(b \in \\) 如何求解最大值的計數。

首先對於這種情況預先算出全部都是用區間操作的貢獻。

現在相當於是要對若干位置改成單點操作,顯然一段極長的區間要麼全部操作,要麼全部不操作,同樣不可能同時操作兩個相鄰的區間(這樣顯然一邊不操作不會變劣)。

那麼現在實際上有乙個 \(o(n)\) dp:記錄所有不相等位置 \(p\):\(f[i] = \max(f[i-1], p_i - p_ - c + f[i-2])\)。

考慮兩種轉移的差,不難發現每次遇到乙個連續相等的差會 \(+1\),遇到不相等的則根據差的正負重新算差,並且這個差的絕對值 \(\le n\)。

將兩種轉移的差記錄下來作為狀態,dp 值分別記錄方案數以及 dp 值之和即可。

#includeusing namespace std;

const int mod = 1e9+7;

inline int add(int a,int b)

inline int sub(int a,int b)

inline int mul(int a,int b)

inline int qpow(int a,int b)

/* math */

const int n = 55,s=n;

int n,c,k;

int b[n][n];

int w[2][n];

vectorv;

int dp[n][2][n*2],g[n][2][n*2];

inline int query()

int s0 = 0;

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

s0 = mul(s0, c);

// cout << s0 << endl;

for(int i=1;i<=n+1;v=mul(v,w[0][i++]))else

}} for(int j=s-n;j<=s+n;j++)

} }int ans = 0;

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

} // cout << s0 << ":" << ans << endl;

// cout << ans << endl;

// system("pause");

return sub(s0, ans);

}int main()

} v.push_back(0);

sort(v.begin(), v.end());

int ans = 0;

for(int t=0;t=v[t+1])w[1][i]++;

if(b[i][j]<=v[t])w[0][i]++;

}// cout << w[0][i] << ":" << w[1][i] << endl;

} int w = query();

ans = add(ans, mul(w, v[t+1]-v[t]));

} cout << ans << endl;

}

AGC049 題解 總結

agc仍舊是那麼毒瘤 gmh77 幹了1h多都幹不出來,自閉 操作相當於 選擇某個 1 將其左移一位,如果左邊也有 1 就抵消。從左往右掃,把遇到的 t 的 1 搞個佇列,遇到的 s 的 1 就先嘗試配對佇列中第乙個,如果隊列為空就嘗試消掉前面乙個未配對的。wa了4次最後10min內交的 可以發現 ...

AGC044 簡要題解(部分)

乍一看資料範圍非常唬人,但是仔細思考一下就可以發現這樣乙個事實 從 x 逆著執行操作回到 0 的時候,除了最後一次連續執行若干次 1 操作直至 0 之外,其餘的時候,每兩次除法之間,用 pm1 造成的增量只會在 2,2 之間。實際上,如果下一次除數是 2 或 3 那麼增量只會在 1,1 之間。證明只...

練習2部分題解

問題 g 汽水瓶 時間限制 1 sec 記憶體限制 128 mb提交 93 解決 45 201501010119 提交狀態討論版 題目描述 有這樣一道智力題 某商店規定 三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?答案是5瓶,方法如下 先用9個空瓶子換3瓶汽水,喝掉...