noip2018 铺设道路
退役oier
day1t1见ancestor
一道ODT板子题都没人写?
主要(考场)思路
从小到大解决深度
每次解决一个深度,贡献就是与上一个深度之差乘上区间个数
之后就统统split
暴力枚举深度那里珂以用hash优化暴枚举的常数,懒得搞
复杂度因为每次split会删掉一个点,所以是严格nlogn
考场Code:
#include<bits/stdc++.h> using namespace std; #define gi getint() inline int getint() { int xi=0; bool f=0; char ch=getchar(); while(ch<'0'||ch>'9')ch=='-'?f=1:0,ch=getchar(); while(ch<='9'&&ch>='0')xi=xi*10+ch-48,ch=getchar(); return f?-xi:xi; } struct node{ int l,r; bool operator <(const node&b)const{ return l<b.l; } node(int l,int r=0):l(l),r(r){} }; set<node>p; typedef set<node>::iterator P; void split(int q) { P tmp=p.upper_bound(q);--tmp; if(tmp==p.end()||tmp->r<q)return; node ttmp=*tmp; p.erase(tmp); if(ttmp.r>=q+1)p.insert(node(q+1,ttmp.r)); if(ttmp.l<=q-1)p.insert(node(ttmp.l,q-1)); } vector<int>v[100001]; int main() { int n=gi; int maxi=0; for(int i=1,a;i<=n;i++)v[a=gi].push_back(i),maxi=max(maxi,a); p.insert(node(1,n)); int ans=0,last=0; for(int i=0;i<=maxi;++i) { if(v[i].empty())continue; ans+=(i-last)*p.size(); last=i; for(vector<int>::iterator j=v[i].begin();j!=v[i].end();++j)split(*j); } cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
· 大模型 Token 究竟是啥:图解大模型Token
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 短信接口被刷爆:我用Nginx临时止血
· 面试官:如果某个业务量突然提升100倍QPS你会怎么做?
· .NET 平台上的开源模型训练与推理进展
· 聊聊智商税:AI知识库