CF1638C
蒟蒻有一种用 set
的乱搞(?)做法。
将题目中的连边要求反着说一遍:
考虑遍历
将每个连通块看作一个整体,只要
因此可以用 set
维护每个连通块的最大值(因为只需要小于最大值即可),在其中 lower_bound
或 upper_bound
出第一个大于 set
中所有大于
剩下的一些细节看代码:
#include<bits/stdc++.h>
using namespace std;
set<int>st;
int main(){
int t;cin>>t;
while(t--){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);//干脆在线搞,x即为上文a[i]
auto it=st.upper_bound(x);
if(it==st.end())st.insert(x);//it==st.end()说明没有比x大的,因此x独立成为一个连通块
else while(++it!=st.end())//判断当前是否最大的元素
it=st.erase(--it);//由于刚才++了,现在要--回来。erase的返回值为下一个元素的迭代器
}
printf("%d\n",st.size());
st.clear();
}
return 0;
}
时间复杂度:
一次 upper_bound
的时间复杂度为 bound
总复杂度
一次 erase
的时间复杂度为 erase
总复杂度
总复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构