[loj3697]262144 Revisited
记表示答案的区间数量,则问题即求
记表示最大的右端点满足区间的答案,则
初始且,当时转移即,时间复杂度为
结论1:对于所有,答案为的极长区间数之和为
记为时的答案,归纳证明
设为最大值,则包含的极长区间数
在确定左端点后后,显然的答案的答案,因此至多个极长区间
对于所有个左端点,包含的极长区间数
代入原式显然成立,即得证
结合上述结论,考虑以下优化——
优化1:仅维护所有极长且非空的区间,由于单调不降,条件即
在此基础上,转移分为两步:
1.将区间替换为,其中可以双指针求出(注意判断是否极长)
2.对于的位置,新增区间,可以用归并排序与前者合并
优化2:若,则(转移不影响),将其单独存储在和上
显然每一个位置至多存储一个,并在时将和上存储的区间重新维护即可
结论2:上述做法的时间复杂度为
不难发现,所有维护/存储(包括优化2)的区间即答案的极长区间
关于转移的第1步,对是否极长分类讨论:
1.若不极长,即使得区间个数-1,可以均摊到加入区间时
2.若极长,结合,在和中总有一个答案
两者均包含,因此极长的必要条件为,进而的答案恰为(结合定义)
进一步的,必然是答案为的极长区间,根据结论1总复杂度至多为
另外,转移的第2步和优化2存储的复杂度显然均为,即得证

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 300000 4 #define M 1000100 5 #define ll long long 6 #define pii pair<int,int> 7 #define mp make_pair 8 #define fi first 9 #define se second 10 int n,a[N];ll sum,ans;pii f0[N]; 11 vector<int>v[M];vector<pii>g,f; 12 void add(pii k){ 13 f0[k.fi]=f0[k.se]=k; 14 sum+=(ll)(k.se-k.fi)*(k.se-k.fi+1)/2; 15 } 16 void dec(pii k){ 17 f0[k.fi]=f0[k.se]=mp(0,0); 18 sum-=(ll)(k.se-k.fi)*(k.se-k.fi+1)/2; 19 } 20 int main(){ 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++){ 23 scanf("%d",&a[i]); 24 v[a[i]].push_back(i); 25 } 26 for(int i=1;i<M;i++){ 27 g.clear(),ans+=(ll)n*(n+1)/2-sum; 28 for(int x=0;x<f.size();x++){ 29 int s=min(f[x].se,(x+1<f.size() ? f[x+1].fi-1 : n)); 30 ans-=(ll)((f[x].se-s)+(f[x].se-f[x].fi))*(s-f[x].fi+1)/2; 31 } 32 for(int x=0,y=0;x<f.size();x++){ 33 while ((y+1<f.size())&&(f[y+1].fi<=f[x].se))y++; 34 if ((g.empty())||(g.back().se<f[y].se))g.push_back(mp(f[x].fi,f[y].se)); 35 } 36 f.clear(); 37 for(int x=0,y=0;x<=g.size();x++){ 38 int s=(x<g.size() ? g[x].fi : n+1); 39 while ((y<v[i].size())&&(v[i][y]<s)){ 40 int k=v[i][y]; 41 if (f0[k].fi)f.push_back(f0[k]),dec(f0[k]); 42 f.push_back(mp(k,k+1)); 43 if (f0[k+1].fi)f.push_back(f0[k+1]),dec(f0[k+1]); 44 y++; 45 } 46 if (x<g.size()){ 47 bool flag=0; 48 if ((g[x].fi>1)&&(a[g[x].fi-1]<=i))flag=1; 49 if ((g[x].se<=n)&&(a[g[x].se]<=i))flag=1; 50 if (!flag)add(g[x]); 51 else f.push_back(g[x]); 52 } 53 } 54 } 55 printf("%lld\n",ans); 56 return 0; 57 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2021-04-16 [loj3501]图函数
2021-04-16 [loj3503]滚榜
2021-04-16 [loj3500]矩阵游戏