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瓶汽水,喝掉...