CodeForces 1307
目錄
題目連結:
https://codeforces.com/contest/1307
A. Cow and Haybales
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n, m, k;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
for (int cs = 1; cs <= T; cs++) {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int res = a[1];
int d = 0;
for (int i = 2; i <= n; i++) {
if (d + a[i] * (i - 1) <= m) {
res += a[i];
d += a[i] * (i - 1);
} else {
int x = (m - d) / (i - 1);
res += x;
break;
}
}
cout << res << endl;
}
return 0;
}
B. Cow and Friend
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;//inf=(1ll<<60)
const int N = 1e6 + 10;
ll a[N],x;
int n, m;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
for (int cs = 1; cs <= T; cs++) {
cin >> n >> x;
ll res = inf;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (x >= a[i] && (x % a[i] == 0)) {
res = min(res, x / a[i]); //全部用一種長度鋪滿
}
if (x <= a[i] * 2) {
res = min(res, 2ll); // 兩根就能到
}
}
// 用最長的長度鋪直線
sort(a + 1, a + 1 + n, greater<ll>());
if (x >= a[1]) {
ll cnt = x / a[1];
//三角形
if (x % a[1]) { // 還差一點點 再拿一根和最後鋪的那根組成三角形
cnt++;
}
res = min(res, cnt);
}
cout << res << endl;
}
return 0;
}
C. Cow and Message
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n, m, k;
string s;
int cnt[N][26];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> s;
n = s.length();
s = " " + s;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 26; j++) {
cnt[i][j] = cnt[i - 1][j];
}
cnt[i][s[i] - 'a']++;
}
ll res = 0;
for (int i = 0; i < 26; i++) {
res = max(res, 1ll * cnt[n][i]);
}
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 26; j++) {
ll sum = 0;
for (int l = 1; l <= n; l++) {
if (s[l] == i + 'a') {
sum += cnt[n][j] - cnt[l][j];
}
}
res = max(res, sum);
}
}
cout << res << endl;
return 0;
}
D. Cow and Fields · 最短路最長
在圖中給定點中選兩個新增一條邊,使得最短路最長
求出1號起始點到達各個點的距離 d1(x)
,和n號終點到達各個點的距離 d2(x)
,最終的答案求得便是
max
(
d
1
(
u
)
+
1
+
d
2
(
u
)
)
\max(\,d1(u)+1+d2(u)\,)
max(d1(u)+1+d2(u))
嘗試對每一對點對進行添邊操作,最短路必定存在於
min
(
d
1
(
u
)
+
1
+
d
2
(
v
)
,
d
1
(
v
)
+
1
+
d
2
(
u
)
)
\min(\,d1(u)+1+d2(v)\,,\,d1(v)+1+d2(u)\,)
min(d1(u)+1+d2(v),d1(v)+1+d2(u))之中,現在要使最短路最大,按照下面的規則,對每一對點進行排序,
d
1
(
u
)
+
1
+
d
2
(
v
)
≤
d
1
(
v
)
+
1
+
d
2
(
u
)
d1(u)+1+d2(v)\le d1(v)+1+d2(u)
d1(u)+1+d2(v)≤d1(v)+1+d2(u)
d
1
(
u
)
−
d
2
(
u
)
≤
d
1
(
v
)
−
d
2
(
v
)
d1(u)-d2(u)\le d1(v)-d2(v)
d1(u)−d2(u)≤d1(v)−d2(v)
⇒
u
<
v
\Rightarrow u<v
⇒u<v求出符合的順序假設:
a
<
b
<
c
a<b<c
a<b<c,根據規則可以得到下面三個關係:
d
1
(
a
)
+
1
+
d
2
(
b
)
≤
d
1
(
b
)
+
1
+
d
2
(
a
)
d1(a)+1+d2(b)\le d1(b)+1+d2(a)
d1(a)+1+d2(b)≤d1(b)+1+d2(a)
d
1
(
b
)
+
1
+
d
2
(
c
)
≤
d
1
(
c
)
+
1
+
d
2
(
b
)
d1(b)+1+d2(c)\le d1(c)+1+d2(b)
d1(b)+1+d2(c)≤d1(c)+1+d2(b)
d
1
(
a
)
+
1
+
d
2
(
c
)
≤
d
1
(
c
)
+
1
+
d
2
(
a
)
d1(a)+1+d2(c)\le d1(c)+1+d2(a)
d1(a)+1+d2(c)≤d1(c)+1+d2(a)
且根據題目要求求最大,右邊式子被捨去只留下左邊(主人公優先走最短路),即在左邊的等式中求出最大的那一個(不會有式子缺少,否則會引起排序變化)
單從上面是看不出左邊哪個式子權值最大,因為前後式子之間沒有直接or間接的關係,顯然需要暴力找了,假設固定右端點d2,顯然如果符合條件的話左端點d1的值應該希望是儘可能大的,
並且,假設存在關係: a < b < c < d < e a<b<c<d<e a<b<c<d<e 中,固定右端點 d 2 ( c ) d2(c) d2(c),能成為左端點的只有 d 1 ( a ) d1(a) d1(a)、 d 1 ( b ) d1(b) d1(b)中較大的那一個,
如果選擇了後面的點,比如說構成 d 1 ( e ) + 1 + d 2 ( c ) d1(e)+1+d2(c) d1(e)+1+d2(c)(右側的式子) ,通過排序可知,連線兩點後,圖上存在更短的路: d 1 ( c ) + 1 + d 2 ( e ) d1(c)+1+d2(e) d1(c)+1+d2(e)(左側的式子),這顯然並非正確答案
因此,對於每個點來說,假設當前點為邊的一端,則另一端一定為在該點之前出現的那一堆點中d1最大的那個
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
vector<int> e[N];
int vis[N];
int n, m, k;
int d1[N], d2[N], inq[N];
struct MinDist {
int to, dist;
bool operator<(const MinDist &b) const {
return dist > b.dist;
}
};
priority_queue<MinDist> q;
void Dijkstra(int st, int d[]) {
fill(d + 1, d + 1 + n, INF);
fill(inq + 1, inq + 1 + n, 0);
d[st] = 0;
q.push({st, d[st]});
while (!q.empty()) {
int u = q.top().to;
q.pop();
if (inq[u])continue;
inq[u] = 1;
for (int v:e[u]) {
if (d[v] > d[u] + 1) {
d[v] = d[u] + 1;
q.push({v, d[v]});
}
}
}
}
vector<int> special;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> k;
for (int i = 1, x; i <= k; i++) {
cin >> x;
special.push_back(x);
vis[x] = 1;
}
int flag = 0, u, v;
while (m--) {
cin >> u >> v;
if (vis[u] && vis[v]) {
flag = 1;
}
e[u].push_back(v);
e[v].push_back(u);
}
if (flag) {
Dijkstra(1, d1);
cout << d1[n] << endl;
} else {
Dijkstra(1, d1);
Dijkstra(n, d2);
sort(special.begin(), special.end(), [](int u, int v) {
return d1[u] + 1 + d2[v] < d1[v] + 1 + d2[u];
});
int res = 0;
int Mx = d1[special[0]];
for (int i = 1; i < k; i++) {
res = max(res, Mx + 1 + d2[special[i]]);
Mx = max(Mx, d1[special[i]]);
}
res = min(res, d1[n]);//添邊 添了個寂寞
cout << res << endl;
}
return 0;
}
E. Cow and Treats · 組合數
https://www.cnblogs.com/ttttttttrx/p/12372422.html
https://www.cnblogs.com/heyuhhh/p/12326887.html
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const ll mod = 1e9 + 7;
const int N = 1e6 + 10;
int n, m, k;
int s[N], h[N], f[N], l[N], r[N];
vector<int> v[N];
ll Mul(ll a, ll b) {
return (a * b) % mod;
}
ll Add(ll a, ll b) {
return (a + b) % mod;
}
ll qpow(ll a, ll b) {
a %= mod;
ll res = 1;
while (b) {
if (b & 1)res = Mul(res, a);
b >>= 1;
a = Mul(a, a);
}
return res;
}
ll Inv(ll a) {
return qpow(a, mod - 2);
}
ll Div(ll a, ll b) {
return Mul(a, Inv(b));
}
int x[N], y[N];
void run() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> s[i];
r[s[i]]++;
}
for (int i = 1; i <= m; i++) {
cin >> f[i] >> h[i];
v[f[i]].push_back(h[i]);
}
for (int i = 1; i <= n; i++) {
sort(v[i].begin(), v[i].end());
}
pii ans(0, 0);
auto update = [&](int x, int y) {
if (x > ans.first) ans = {x, 0};
if (x == ans.first) ans.second = Add(ans.second, y);
};
auto calc = [&](int i) {
int A = upper_bound(v[i].begin(), v[i].end(), l[i]) - v[i].begin();// 右邊的牛能到達當前位置的個數
int B = upper_bound(v[i].begin(), v[i].end(), r[i]) - v[i].begin();// 左邊的牛能到達當前位置的個數
int cnt1 = A * B - min(A, B); // 兩隻睡牛的情況 A * B - min(A, B) 組合一下減去重複的部分
int cnt2 = A + B; // 一隻睡牛
if (cnt1 > 0) {
x[i] = 2;// 睡牛的個數
y[i] = cnt1;//種類數
} else if (cnt2 > 0) {
x[i] = 1;
y[i] = cnt2;
} else {
x[i] = 0;
y[i] = 1;
}
};
int tx = 0, ty = 1;// 初始值 無論怎麼安排都無解
// 先遍歷 只有一頭睡牛的情況
for (int i = 1; i <= n; i++) {
calc(i);
tx += x[i];
ty = Mul(ty, y[i]);
}
//統計所有答案
update(tx, ty);
// 再遍歷一遍每一個位置 增加可以做到兩頭睡牛的情況
for (int i = 1; i <= n; i++) {
int now = s[i];
tx -= x[now]; // 將原來小的答案減去
ty = Div(ty, y[now]);
l[now]++, r[now]--;
if (binary_search(v[now].begin(), v[now].end(), l[now])) { // 如果有牛從右側出發 會睡在當前l[i]的位置
int t = upper_bound(v[now].begin(), v[now].end(), r[now]) - v[now].begin(); // 檢視左側出發的牛不超過r[i]的有幾隻
if (r[now] >= l[now]) --t;// 如果查到了本身 把睡在當前位置的牛減去
// 因為沒有兩頭牛h[i]是重複的 所以 得到的t就是第i個牛睡在l[i]位置上時 與其他牛能組合出來的情況
if (t > 0) {
x[now] = 2;
y[now] = t;
} else { // 只有與1頭牛 第i個牛睡在l[i]的位置上只有1種方法
x[now] = y[now] = 1;
}
int nx = tx + x[now], ny = Mul(ty, y[now]); // 疊加答案
update(nx, ny);
}
calc(now);
tx += x[now];
ty = Mul(ty, y[now]);
}
cout << ans.first << " " << ans.second << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
run();
return 0;
}
F. Cow and Vacation
G. Cow and Exercise
相關文章
- 2024.9.6 CF1307 模擬賽記錄
- Codeforces
- mysql無法建立儲存過程問題 ERROR 1307 (HY000)MySql儲存過程Error
- 9.11 codeforces
- 【CodeForces訓練記錄】Codeforces Global Round 27
- codeforces Photo of The Sky
- Codeforces 專區
- codeforces 11/10
- CodeForces 1935A
- Codeforces Round 955
- Codeforces - Jzzhu and Numbers
- 【CodeForces訓練記錄】Codeforces Round 982 (Div. 2)
- 【CodeForces訓練記錄】Codeforces Round 986 (Div. 2)
- 【CodeForces訓練記錄】Codeforces Round 981 (Div. 3)
- 【CodeForces訓練記錄】Codeforces Round 984 (Div. 3)
- 【CodeForces訓練記錄】Codeforces Round 991 (Div. 3)
- 【CodeForces訓練記錄VP】Codeforces Round 933 (Div. 3)
- codeforces_1131_D
- codeforces_B. Barnicle
- Educational Codeforces Round 163
- CodeForces - 1363B
- Codeforces——231A Team
- A - Fence CodeForces - 1422A
- Codeforces 1969 A-F
- Codeforces 1847 A-F
- CodeForces - 765F
- codeforces ECR169
- Codeforces ICPC那場
- CodeForces - 702F
- CodeForces - 1982E
- CodeForces - 1485F
- CodeForces - 1984E
- Codeforces Global Round 26
- Codeforces Global Round 27
- Codeforces 983 A-E
- Codeforces Global Round 13
- Codeforces C. Colored Rooks 構造 (Codeforces Round #518 (Div. 2) )
- 【CodeForces訓練記錄】Educational Codeforces Round 171 (Rated for Div. 2)