%%%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,p−1,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[p−1]划到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[p−1]一定要满足单调递增(这部分只能划到线程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[p−1]),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[p−1]接起来)

用笛卡尔树实现。时间复杂度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;
}

[XSY3383]多线程(笛卡尔树,DP)相关推荐

  1. bzoj2616 SPOJ PERIODNI 笛卡尔树+DP

    题目分析 建立出小根堆性质的笛卡尔树,于是每个节点可以代表一个矩形,其宽度为子树大小,高度为该节点记录的那一列高度-父节点那一列高度. 设f(x,i)f(x,i)f(x,i)表示以xxx为跟的子树中放 ...

  2. 【IOI2018】会议【笛卡尔树】【dp】【线段树】

    题意:长度为nnn的序列,qqq次询问,每次给定一个区间,钦定区间中的一个位置xxx,使得区间所有点 与xxx之间的最大值(含端点) 之和 最小,输出最小值. n,q≤7.5×105n,q\leq7. ...

  3. CF1580B Mathematics Curriculum(笛卡尔树、树形dp)

    解析 比较巧妙的一道题. 难点在于对题意的转化. 关键性质:符合要求的点等价于与笛卡尔树上深度为 mmm 的点. 原因也较为显然,考虑一个特定的点 xxx,当枚举全局最大值时,其会对 xxx 产生贡献 ...

  4. YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】

    正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/4 题目大意 mmm个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci ...

  5. P1377 [TJOI2011]树的序 笛卡尔树优化建树

    传送门 文章目录 题意: 思路: 题意: 给你一棵二叉树的生成序列,让你输出一个字典序最小的序列,使其生成的二叉树与原来的二叉树相同. 思路: 首先想到暴力建树,让后输出先序遍历即可,但是这样如果二叉 ...

  6. 笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

    文章目录 笛卡尔树 介绍 例题 Largest Submatrix of All 1's 应用 「POI2015」洗车 Myjnie [AGC028B] Removing Blocks SPOJ PE ...

  7. [集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

    传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n],设fA(1,n)=pa,fB(1,n)=pbf_A(1,n)=p_a,f_B(1 ...

  8. 1220F - Gardener Alex(笛卡尔树)

    original link - http://codeforces.com/problemset/problem/1220/F 题意: 对出一个序列,你可以对其循环左移,问循环左移几次后,这个序列构造 ...

  9. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

最新文章

  1. MySQL中的索引(唯一索引篇)
  2. windows update失败还原更改,无法开机
  3. 使用Settings Bundle为程序添加设置项
  4. 初始化bean(二)—— 缓存部分
  5. oracle清理告警日志,Oracle 跟踪/告警/监听日志的清理脚本
  6. [转]【NODE】用WS模块创建加密的WS服务(WSS)
  7. vc与三菱PLC编程口通信C语言源代码,三菱PLC通讯与编程实例!
  8. 云电脑与远控软件有什么区别?如何选?
  9. Win虚拟机查询不到自己的IP地址
  10. 表情商店竞争加剧,陌陌和微信的“另一桩”生意
  11. 关卡二:Flex伸缩布局
  12. 华硕 Asus TUF B360M+INTEL i5+Sapphire AMD VEGA56黑苹果EFI引导文件
  13. html求相关系数,相关系数,确定系数(R^2)计算公式与在线计算器_三贝计算网_23bei.com...
  14. 二元线性方程组与二阶行列式
  15. 基于iOS11的HEVC(H.265)硬编码/硬解码功能开发指南
  16. python 将一串数字形式的时间转换为标准时间格式
  17. 维生素C - 坏血症
  18. 征信大数据的盈利模式,怎么赚钱?
  19. 问题解决:使用GitHub时git push需要输入账号和密码Username for... (Use git clone SSH) git remote add 或set-url(推荐)
  20. OPS TPS RPS 吞吐量 查询率 事物数目 每秒查询率 每秒处理事物数目

热门文章

  1. linux多内核调度,linux-kernel – 如何在Linux内核(Samsung Exynos5422)中实现异构多处理(HMP)调度?...
  2. java实用教程——组件及事件处理——布局的一个小实例
  3. 数据结构——从叶子结点到根节点的全部路径
  4. 解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
  5. AcWing 126. 最大的和
  6. Factory Method(工厂方法)--对象创建型模式
  7. number six
  8. 数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现
  9. word List36
  10. 数据结构 旅游规划(Dijkstra+Dfs)