tg 82 solution
T1
对于每个包,时间复杂度要求
Subtask 1
这个包考虑
Subtask 2
考虑充分利用"连续"这个性质
事实上我们考虑查
Subtask 3
这一部分的做法显然不能
注意到
对于每个
否则接着扫就完了,扫完记得更新
询问
Subtask 4
上面的东西询问变成
手动二分一下,倒着按
然后就没有然后了,对于每个点每个分支至多查
查询
这一部分没讲太细,所以放码了
点击查看代码
struct node{
int id,val;
bool operator<(node y){return id<y.id;}
}l[o];
int Query(int l,int r){
if(q[l].find(r)!=q[l].end())return q[l][r];
return q[l][r]=query(l,r);
}
void solve4(int n){
memset(l, 0, sizeof(l));
l[1].val = l[1].id = 1;
l[2].val = 2; l[3].val = 3; l[4].val = 4;
memset(c, 0, sizeof(c));
c[1] = 1;
ans.emplace_back(1);
for(int i=2;i<=n;i++){
sort(l + 1,l + 5);
if(query(max(l[3].id, 1),i) == 3){
if(query(max(1, l[2].id), i) == 3){
c[i] = l[2].val;
l[2].id = i;
}
else{
c[i] = l[1].val;
l[1].id = i;
}
}
else{
if(query(max(1, l[4].id), i) == 1){
c[i] = l[4].val;
l[4].id = i;
}
else{
c[i] = l[3].val;
l[3].id = i;
}
}
ans.emplace_back(c[i]);
}
// for(int i=1;i<=n;i++)ans.push_back(c[i]);
}
Subtask 5
出题人不会放出
如果有,那直接
否则,找到第一个重的位置,然后直接把重掉的位置换掉
如果重复,会有
扫第二遍重复的时候就是把
查询次数
Subtask 6
这个放给暴力
Subtask 7
这个时候暴力废了,二分就完事了
如果端点一定,那区间长度增大,查询结果单调不降
考虑二分找到上一个和它相同的点
如果在
如果直接查询的话,询问
考虑去掉常数,因为
花费在暴扫上的时间复杂度
T2
把连续段缩到一起,问题可以有很简洁的表述方式。
对于长度为
每次选择--c[i],++c[j]
。
每种颜色是独立的,只用考虑可以得到哪些c,这个可以用前缀和限制。
问题转化成了普通的子序列匹配问题。
T3
没有细想,直接看沈老师题解
问题明显是构造出连通图。
连通图至少有
这个就是存在解的充要条件。
把奇数段放在头尾,构造
画个图很清楚,好像这样构造出来是一条链。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具