AcWing第四场周赛
比赛链接:Here
AcWing 3694. A还是B
签到题
void solve() {
int n; string s;
cin >> n >> s;
int t = count(s.begin(), s.end(), 'A');
if (t * 2 == n)cout << "T";
else if (t * 2 < n)cout << "B";
else cout << "A";
}
AcWing 3695. 扩充序列
思维构造题
这题目本身并不难,只不过出得有 一些 “委婉”罢了。
先来研究一下题目,每次“扩充”都会将序列复制一次,然后在中间会插入一个还未使用过的最小正整数。
其实“还未使用过的 最小 正整数”,其实不过就是添加原数列中最大的值+1。
再看,扩充
那么对于
输出
注意点:long long
void solve() {
ll n, k; cin >> n >> k;
int cnt = 1;
while (!(k & 1))k >>= 1, cnt++;
cout << cnt << "\n";
}
AcWing 3696. 构造有向无环图
对图进行拓扑排序,其中我们只加有向边,不考虑无向边。
若无法拓扑排序,则说明有向边已经构成了环,输出 NO。
否则,在拓扑排序的时候,对于所有点,我们可以得到一个时间戳,而对于所有无向边,将其方向定位从时间戳小的连向时间戳大的边即可。
时间复杂度:
typedef pair<int, int> E;
const int N = 200005;
int n, m;
int d[N], p[N];
vector<int> g[N];
bool topo() {
static int q[N], hh, tt, s;
hh = tt = 0, s = 0;
for (int x = 1; x <= n; ++x)
if (!d[x]) q[tt++] = x;
while (hh != tt) {
int t = q[hh++];
++s, p[t] = s;
for (int i = 0; i < g[t].size(); ++i) {
int v = g[t][i];
if (!--d[v]) q[tt++] = v;
}
}
return s == n;
}
void solve() {
cin >> n >> m;
memset(d + 1, 0, n << 2);
memset(p + 1, 0, n << 2);
for (int i = 1; i <= n; ++i) g[i].clear();
vector<E> res;
for (int i = 0; i < m; ++i) {
int a, b, t;
cin >> t >> a >> b;
res.push_back({a, b});
if (t) g[a].push_back(b), ++d[b];
}
if (topo()) {
puts("YES");
for (auto [a, b] : res) {
if (p[a] > p[b]) swap(a, b);
printf("%d %d\n", a, b);
}
} else puts("NO");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战