CF Edu Round 131 简要题解 (ABCD)
A
分类讨论即可 .
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int main()
{
int T, a11, a12, a21, a22; scanf("%d", &T);
while (T--)
{
scanf("%d%d%d%d", &a11, &a12, &a21, &a22);
if (!a11 && !a12 && !a21 && !a22) puts("0");
else if (a11 && a12 && a21 && a22) puts("2");
else puts("1");
} return 0;
}
t 宝那个判 \(a\) 里所有数之和的是真妙 .
B
显然 \(d=2\) 最优,然后模拟即可 .
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 5e5 + 233;
vector<int> g[N];
inline void addedge(int u, int v){g[u].emplace_back(v);}
int n;
bool vis[N];
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
puts("2");
for (int i=1; i<=n; i++)
{
if (vis[i]) continue;
vis[i] = true;
for (int j=i; j<=n; j*=2) vis[j] = true, printf("%d ", j);
}
puts("");
for (int i=1; i<=n; i++) vis[i] = false;
} return 0;
}
C
二分答案,于是考虑把时间都用满可以做多少工作 check 即可 .
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 5e5 + 233;
int n, m, a[N];
inline bool check(int x)
{
ll ans = 0;
for (int i=1; i<=n; i++) ans += min(x, a[i]) + (x - min(x, a[i])) / 2;
return ans >= m;
}
inline void solve()
{
scanf("%d%d", &n, &m);
for (int i=1, x; i<=m; i++) scanf("%d", &x), ++a[x];
int l = 0, r = 2 * m, ans;
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(mid)){ans = mid; r = mid - 1;}
else l = mid + 1;
}
for (int i=1; i<=n; i++) a[i] = 0;
printf("%d\n", ans);
}
int main()
{
int T; scanf("%d", &T);
while (T--) solve();
return 0;
}
D
找到每个 \(a_i\) 能取的区间 \([l,r]\),于是问题就变成每个区间取一个数使得两两不重复 .
二分图匹配会 TLE on #4
可以贪心,枚举左端点,右端点扔到 priority_queue 里面取最小的选即可 .
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 5e5 + 233;
vector<pii> g[N];
int n;
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
for (int i=1, x; i<=n; i++)
{
scanf("%d", &x);
int L, R;
if (x == 0){L = i + 1; R = n;}
else {L = i / (x + 1) + 1; R = i / x;}
g[L].emplace_back(make_pair(R, i));
}
priority_queue<pii, vector<pii>, greater<pii> > q;
vector<int> ans(n+5);
for (int i=1; i<=n; i++)
{
for (auto _ : g[i]) q.emplace(_);
auto _ = q.top(); q.pop();
ans[_.second] = i;
}
for (int i=1; i<=n; i++) printf("%d ", ans[i]);
puts("");
for (int i=1; i<=n; i++) g[i].clear();
} return 0;
}
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16463447.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ