9.12 模拟赛简明题解
A
设原序列为
人话:
不难发现,答案为
#include <cstdio>
#include <cstdlib>
int n, a[100050][2];long long q;
int main()
{
scanf("%d", &n);for(int i = a[0][0] = a[0][1] = 1, x;
i <= n << 1;++i) scanf("%d", &x), a[x][a[x][0] != 0] = i;
for(int i = 1;i <= n;++i) q += abs(a[i][0] - a[i - 1][0])
+ abs(a[i][1] - a[i - 1][1]);printf("%lld", q);return 0;
}
B
按照题意,两瓶体积为
按体积
不难发现,答案为合并过程中剩下的药水瓶数。
#include <cstdio>
int n, x, q, a[2000050];
int main()
{
scanf("%d", &n);while(n--) scanf("%d", &x),
++a[x];for(int i = 0;i <= 2000000;++i) q += a[i]
& 1, a[i + 1] += a[i] >> 1;printf("%d", q);return 0;
}
C
注意到如果存在合法分组方案,可以确定最小数
问题转化为
考虑用 map
暴力维护,时间复杂度为
好像可以用动态开点权值线段树优化成
#include <map>
#include <cstdio>
using namespace std;
int T, n, m, k, x;bool f;
int main()
{
scanf("%d", &T);while(T--)
{
map<int, int> c;f = 0;scanf("%d%d", &n, &m);for(int i = 0;i
< n;++i) scanf("%d", &x), ++c[x];if(n % m) puts("false");else
{
k = n / m;while(k--) {x = c.begin()->first;for(int i = x;i < x
+ m;++i) if(c.find(i) == c.end()) {puts("false");f = 1;break;}
else if(!--c[i]) c.erase(i);if(f) break;}if(!f) puts("true");
}
}
return 0;
}
D
不难发现,如果方程组有解,那么任意解可以转化为
证明:设
那么我们可以把
则方程有解当且仅当
#include <cstdio>
int T;long long a, b;
int main()
{
scanf("%d", &T);while(T--) scanf("%lld%lld", &a, &b), puts
((a | b - a) == a ? "Possible" : "Impossible");return 0;
}
分类:
未分类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具