C. Good Prefixes
思路:用一个前缀和,一直判断当前的最大值是否为当前所有元素之和的一半。
AC代码:
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9+7;
ll w[N], v[N], f[N], cnt, n, m, k,t, dp[N], sum[N],a[N];
ll f1[M], f2[M];
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
ll ans = 0, mx = a[1];
sum[1] = a[1];
if (a[1] == 0) ans++;
for (int i = 2; i <= n; i++)
{
sum[i] = sum[i - 1] + a[i];
if (a[i] > mx) mx = a[i];
if (sum[i] % 2 == 0)
{
if (sum[i] / 2 == mx) ans++;
}
}
cout << ans << "\n";
}
int main()
{
cin >> t;
while(t--)
solve();
return 0;
}
D. Manhattan Circle
模拟判断
AC代码:
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9+7;
ll w[N], v[N], f[N], cnt, n, m, k,t, dp[N], sum[N],a[N],c1=0,c2=0;
ll f1[M], f2[M];
void solve()
{
int n, m;
cin >> n >> m;
vector<vector<char>> mp(n, vector<char>(m));
int cnt = 0;
int r = 0, l = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> mp[i][j];
if (mp[i][j] == '#')
{
++cnt;
r += i + 1;
l += j + 1;
}
}
}
int x = r / cnt;
int y = l / cnt;
cout << x << " " << y<<"\n";
}
int main()
{
cin >> t;
while(t--)
solve();
return 0;
}
E. Secret Box
AC代码:
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9+7;
ll gcd(ll a, ll b)
{
if (b == 0) return a;
return gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);
}
ll w[N], v[N], f[N], cnt, n, m, t, dp[N], sum[N],a[N],c1=0,c2=0;
ll f1[M], f2[M];
void solve()
{
ll x, y, z, k;
cin >> x >> y >> z >> k;
ll ans = 0;
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
if (k % (i * j)) continue;
ll c = k / (i * j);
if (c > z) continue;
ll p = (x - i + 1) * (y - j + 1) * (z - c + 1);
ans = max(ans, p);
}
}
cout << ans << "\n";
}
int main()
{
cin >> t;
while(t--)
solve();
return 0;
}
F. Final Boss
二分查找优化。
AC代码:
#include<iostream>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
#define ll long long
using namespace std;
const int N = 200010;
const int M = 100100;
const ll mod = 1e9+7;
ll w[N], v[N], f[N], cnt, n, m, t, dp[N], sum[N],a[N],c1=0,c2=0;
ll f1[M], f2[M];
ll next1[100010];
ll h;
bool check(ll mid)
{
ll sum = 0;
for (int i = 1; i <= n; i++)
{
ll cnt = (mid-1) / w[i]+1;
if (cnt >= h) return true;
sum += cnt * v[i];
}
return sum >= h;
}
void solve()
{
cin >> h >> n;
for (int i = 1; i <= n; i++) cin >> v[i];
for (int i = 1; i <= n; i++) cin >> w[i];
ll l = 1, r = 1e12;
while (l < r)
{
ll mid = (l + r) / 2;
if (check(mid))
{
r = mid;
}
else l = mid+1;
}
cout << l<<"\n";
}
int main()
{
cin >> t;
while(t--)
solve();
return 0;
}