[XSY3383]多线程(笛卡尔树,DP)

%%%tjytjytjy的笛卡尔树做法:

dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)dp(l,r,Amin,Bmin)为把c[l],c[l+1],...,c[r]c[l],c[l+1],...,c[r]c[l],c[l+1],...,c[r]划到A,BA,BA,B两线程中,且划到AAA线程的数>Amin>Amin>Amin,划到BBB线程的数>Bmin>Bmin>Bmin的方案数。

我们找到ppp,满足c[p]=max{c[l],c[l+1],...,c[r]}c[p]=max\{c[l],c[l+1],...,c[r]\}c[p]=max{c[l],c[l+1],...,c[r]}。发现ppp只可能是单增栈AAA的末尾 或 单减栈BBB的开头。

  • ppp是单增栈AAA的末尾:
    那么c[p+1],c[p+2],...,c[r]c[p+1],c[p+2],...,c[r]c[p+1],c[p+2],...,c[r]一定要满足单调递减(这部分只能划到线程BBB),若满足则有dp(l,r,Amin,Bmin)←dp(l,p−1,Amin,max(Bmin,c[p+1]))dp(l,r,Amin,Bmin)\leftarrow dp(l,p-1,Amin,max(Bmin,c[p+1]))dp(l,r,Amin,Bmin)dp(l,p1,Amin,max(Bmin,c[p+1]))
    c[l],c[l+1],...,c[p−1]c[l],c[l+1],...,c[p-1]c[l],c[l+1],...,c[p1]划到BBB线程的部分,要和划到BBB线程的c[p+1],c[p+2],...,c[r]c[p+1],c[p+2],...,c[r]c[p+1],c[p+2],...,c[r]接起来)

  • ppp是单减栈BBB的开头:
    那么c[l],c[l+1],...,c[p−1]c[l],c[l+1],...,c[p-1]c[l],c[l+1],...,c[p1]一定要满足单调递增(这部分只能划到线程AAA),若满足则有dp(l,r,Amin,Bmin)←dp(p+1,r,max(Amin,c[p−1]),Bmin)dp(l,r,Amin,Bmin)\leftarrow dp(p+1,r,max(Amin,c[p-1]),Bmin)dp(l,r,Amin,Bmin)dp(p+1,r,max(Amin,c[p1]),Bmin)
    c[p+1],c[p+2],...,c[r]c[p+1],c[p+2],...,c[r]c[p+1],c[p+2],...,c[r]划到AAA线程的部分,要和划到AAA线程的c[l],c[l+1],...,c[p−1]c[l],c[l+1],...,c[p-1]c[l],c[l+1],...,c[p1]接起来)

用笛卡尔树实现。时间复杂度O(n)O(n)O(n)

 
#include<bits/stdc++.h>
const int N=500010;
const int inf=0x7fffffff;
using namespace std;
int t,n,a[N],minn[N];
int top,sta[N],rt,ls[N],rs[N];
bool up[N],down[N];
void init(int u){if(!u) return;init(ls[u]),init(rs[u]);minn[u]=min(a[u],min(minn[ls[u]],minn[rs[u]]));up[u]=up[ls[u]]&&(!rs[u]);down[u]=down[rs[u]]&&(!ls[u]);
}
int dfs(int u,int Amin,int Bmin){if(!u) return 1;int ans=0;if(up[ls[u]]&&minn[ls[u]]>Amin&&a[u]>Bmin)ans+=dfs(rs[u],ls[u]?a[ls[u]]:Amin,Bmin);if(down[rs[u]]&&minn[rs[u]]>Bmin&&a[u]>Amin)ans+=dfs(ls[u],Amin,rs[u]?a[rs[u]]:Bmin);return ans;
}
int main(){minn[0]=inf;up[0]=down[0]=1;scanf("%d",&t);while(t--){scanf("%d",&n);int maxn=-inf;for(int i=1;i<=n;i++) {scanf("%d",&a[i]);if(a[i]>maxn) maxn=a[i],rt=i;ls[i]=rs[i]=0;}top=0;for(int i=1;i<=n;i++){while(top&&a[sta[top]]<a[i]){ls[i]=sta[top];top--;}if(top) rs[sta[top]]=i;sta[++top]=i;}init(rt);printf("%d\n",dfs(rt,-inf,-inf));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 2.0使用Autofac实现IOC依赖注入竟然能如此的优雅简便

初识ASP.NET Core的小伙伴一定会发现&#xff0c;其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的。这是因为其使用了依赖注入 (DI) 的软件设计模式&#xff0c;代码的设计是遵循着“高内聚、低耦合”的原则&#xff0c;使得各个类与类之间的关系依赖于接口&#xff0…

POJ1236 Network of Schools

POJ1236 Network of Schools 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools t…

【模拟】签订协议(nowcoder 217601)

签订协议 nowcoder 217601 题目大意 给出n个数&#xff0c;现在有一个协议书&#xff0c;让你从1传到n&#xff0c;然后传回1&#xff0c;继续传下去 对于第i个数&#xff0c;如果前面i-1个数已经匹配过了&#xff0c;那么当协议书传过来时即可匹配&#xff0c;否则无法匹配…

P4196-[CQOI2006]凸多边形/[模板]半平面交【计算几何】

正题 题目链接:https://www.luogu.com.cn/problem/P4196 题目大意 给出nnn个凸多边形&#xff0c;求它们交的面积。 解题思路 就是把凸多边形上每条边作为一个半平面限制然后求一遍半平面交就好了。 具体做法是我们先将点按照级角排序&#xff0c;然后以此把半平面加入双端…

连续段问题小结

一个好用的工具——析合树 oi-wiki 例题 CF526F 题意&#xff1a; 给出一个1~nnn的排列&#xff0c;问有多少个区间的值域是连续的。 题解&#xff1a; 线段树单调栈做法 分治做法 析合树做法 图论做法 CF997E 题意&#xff1a; 给出一个1~nnn的排列&#xff0c;有qqq次…

实战中的asp.net core结合Consul集群Docker实现服务治理

一、前言在写这篇文章之前&#xff0c;我看了很多关于consul的服务治理&#xff0c;但发现基本上都是直接在powershell或者以命令工具的方式在服务器上面直接输入consul agent .... 来搭建启动consul集群&#xff0c;一旦把命令工具关掉&#xff0c;则consul无法再后台启动&…

POJ3177 Redundant Paths

POJ3177 Redundant Paths 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21945 Accepted: 9056Description In order to get from one of the F (1 < F < 5,000) grazing fields (…

【最小生成树】路线规划(nowcoder 217603)

路线规划 nowcoder 217603 题目大意 给一个无向连通图&#xff0c;问你在经过的边最少的前提下&#xff0c;从1走过所有点&#xff0c;再走回1的最短距离 样例#1 输入样例#1 5 5 5 4 3 4 3 5 2 3 7 1 2 4 2 4 1输出样例#1 26样例解释#1 最少时间的路径: 1 →2 →…

计算几何学习小记

文章目录前言正题平面运算加减乘积常见问题直线/线段规范交点求垂线/点问题判断点在多边形的内/外求两个圆的交点前言 因为懒得画图理解计算几何所以要来这里鼓励一下自己 以后新学的应该也会写在这里。就当我是水博客 应该都是二维的计算几何&#xff0c;三维的有生之年再学 …

[XSY3343] 程序锁(DP)

XSY3343 先考虑如何判定一个填好的序列会不会gg&#xff1a; 若∃p,q,使s′[p1]t′[q1]−1\exist p,q,使s[p1]t[q1]-1∃p,q,使s′[p1]t′[q1]−1且∑i1ps′[i]∑j1qt′[j]≤0\sum_{i1}^{p}s[i]\sum_{j1}^{q}t[j]\leq 0∑i1p​s′[i]∑j1q​t′[j]≤0&#xff0c;则这个序列必g…

Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参

继续学习最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记&#xff0c;在使用过程中稍微看了下它的源码,不得不说微软现在真的强大,很多事情都帮你考虑到了,比如使用Redis,使用Redis后,你的websocket就支持横向扩…

Network POJ-3694

Network POJ-3694 文章目录Description题意&#xff1a;样例分析&#xff1a;题解&#xff1a;代码&#xff1a;Description A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of com…

【树状数组】递增子序列(金牌导航 数据结构优化DP-1)

递增子序列 金牌导航 数据结构优化DP-1 题目大意 给出一个序列&#xff0c;让你求长度为m的单调递增子序列的个数 输入样例 3 2 1 1 2 7 3 1 7 3 5 9 4 8输出样例 2 12数据范围 1⩽n⩽104,1⩽m⩽100,0⩽ai⩽9876543211\leqslant n \leqslant 10^4,1\leqslant m \leqslant…

使用.NET Core 2.1的Azure WebJobs

WebJobs不是Azure和.NET中的新事物。 Visual Studio 2017中甚至还有一个默认的Azure WebJob模板&#xff0c;用于完整的.NET Framework。 但是&#xff0c;Visual Studio中以某种方式遗漏了.NET Core中WebJobs的类似模板。 在这篇文章中&#xff0c;我使用的是.NET Core 2.1来创…

P3265-[JLOI2015]装备购买【线性基,拟阵贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P3265 题目大意 给出nnn个有权值的mmm元组。求最大独立集&#xff0c;即一个最大的集合且内部元素线性无关。且在集合最大的情况下权值和最小 通俗的说就是没有任何一个元素内被其他元素的倍数和表示。 解题思路 我们考虑线…

【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)

玩具装箱 金牌导航 决策单调性优化DP-1 题目大意 给出若干个物品&#xff0c;把iii到jjj个物品装在一起的长度lj−i∑kijaklj-i\sum_{ki}^{j}a_klj−i∑kij​ak​&#xff08;物品必须是连续的&#xff09;&#xff0c;其代价为(lL)2(l L)^2(lL)2&#xff08;L为给出的常数…

HDU4612 Warm up

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 11184 Accepted Submission(s): 2573HDU4612 Warm up 文章目录Problem Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Problem Description N …

[NOIP2016 提高组] 天天爱跑步(树上差分)

如果没有时间的限制&#xff0c;这题就是对每个点iii&#xff0c;求经过iii的路径数&#xff0c;用树上差分解决即可&#xff1a; 枚举路径x→y{x\to y\{x→y{ a[x]1;a[y]1;a[x]1;a[y]1;a[x]1;a[y]1; a[lca(x,y)]−1;a[fa[lca(x,y)]]−2;a[lca(x,y)]-1;a[fa[lca(x,y)]]-2;a[lc…

.NET Core中的CSV解析库

感谢本篇首先特别感谢从此启程兄的《.NetCore外国一些高质量博客分享》, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下。.NET Core中的CSV解析库本篇博客来源于.NET Core Totorials的《CSV Parsing In .NET Core》。背景介绍对于初级…

【manacher】双倍回文(金牌导航 manacher-2/luogu 4287)

双倍回文 金牌导航 manacher-2 luogu 4287 题目大意 设串为x&#xff0c;将其取反为x’&#xff0c;定义双倍回文为形如xx’xx’的串 现在给你一个字符串&#xff0c;让你求最大双倍回文子串 输入样例 16 ggabaabaabaaball输出样例 12数据范围 N⩽105N\leqslant 10^5N⩽…