首页 > 其他分享 >笛卡尔树

笛卡尔树

时间:2023-07-30 09:01:33浏览次数:34  
标签:笛卡尔 int dfs li leq ri dp

模板

bool flag=0;
while(h[i]<h[sta[top]])
	top--,flag=1;
cr[sta[top]]=i;
if(flag)
	cl[i]=sta[top+1];
sta[++top]=i;

受限制的排列

对于一个  111  到  nnn  的排列  p1, p2, , pnp_1, p_2, \cdots, p_np1​, p2​, ⋯, pn​  ,我们可以轻松地对于任意的  1  i  n1 \leq i \leq n1 ≤ i ≤ n  计算出  (li, ri)(l_i, r_i)(li​, ri​)  ,使得对于任意的  1  L  R  n1 \leq L \leq R \leq n1 ≤ L ≤ R ≤ n  来说  min(pL, pL + 1, , pR) = pi\min(p_L, p_{L + 1}, \cdots, p_R) = p_imin(pL​, pL + 1​, ⋯, pR​) = pi​  当且仅当  li  L  i  R  ril_i \leq L \leq i \leq R \leq r_ili​ ≤ L ≤ i ≤ R ≤ ri​  。

给定整数  nnn  和  (li, ri)(l_i, r_i)(li​, ri​)    (1  i  n)(1 \leq i \leq n)(1 ≤ i ≤ n)  ,你需要计算有多少种可能的  111  到  nnn  的排列  p1, p2, , pnp_1, p_2, \cdots, p_np1​, p2​, ⋯, pn​  满足上述条件。

由于答案可能很大,你只需要给出答案对  109 + 710^9 + 7109 + 7  取模的值。

题解

实际上它就是一个笛卡尔树,先找到一段区间的最值点,然后一分为二分别处理两边,此时最值定下来了,左右互不影响,因此有\(C_{len}^{l}\)种情况。用map记录很巧妙。

代码

#include<iostream>
#include<cstring>
using namespace std;
int t,n;
string s;
int dp[2005][2005];
int dfs(int l,int r){
	if(dp[l][r]!=-1)
		return dp[l][r];
	if(l>r)
		return dp[l][r]=1;
	dp[l+2][r]=dfs(l+2,r);
	dp[l][r-2]=dfs(l,r-2);
	dp[l+1][r-1]=dfs(l+1,r-1);
	if((s[l]==s[r]&&dp[l+1][r-1]==1)||(s[l]==s[l+1]&&dp[l+2][r]==1&&s[r]==s[r-1]&&dp[l][r-2]))
		return dp[l][r]=1;
	return dp[l][r]=0;
}
int main(){
	scanf("%d\n",&t);
	while(t--){
		memset(dp,-1,sizeof(dp));
		cin>>s;
		n=s.size();
		s=" "+s;
		dfs(1,n);
		if(dp[1][n]==1)
			printf("Draw\n");
		else
			printf("Alice\n");
	}
}

标签:笛卡尔,int,dfs,li,leq,ri,dp
From: https://www.cnblogs.com/whz-lld/p/17590966.html

相关文章

  • pytest + yaml 框架 -47.parameters参数化支持笛卡尔积
    前言v1.3.8版本对parameters参数化格式重新做了定义,支持笛卡尔积了。当然以前旧版本的格式还是继续兼容。parameters参数化新版本对parameters参数化重新做了定义,简化了步骤,更加清晰简洁.1.只有一个变量需要参数化的情况test_p1.ymlconfig:parameters:x:["a"......
  • [数据结构]笛卡尔树、ST表、带权并查集
    Cartesiantree(笛卡尔树)1.概念比如拿最小的当根建树,中序遍历是原数组2.性质区间最小值(RMQ),LCA的值,比如上图4和6的LCA是2,表示我们4,6,2这个区间里面的最小值是2找y左边第一个<=y的数就是y往上看第一个向左拐的数3.构造(增量法)对每个前缀考虑我们发现只有右链是......
  • 数据库关联查询--笛卡尔积
    概念笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesianproduct),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员.设A和B是两个集合,存在一个集合,他的元素是用A中元素为第一元素,B中元素为第二元素构成的有序二元组。称它为A和B的笛卡......
  • 笛卡尔树
    笛卡尔树下文的资料多摘自OIWiki性质笛卡尔树是一种二叉树,每一个节点都由一个键值二元组\((k,w)\)构成。要求\(k\)满足二叉搜索树的性质,而\(w\)满足堆的性质。如果笛卡尔树的\(k\),\(w\)键值确定的话,且\(k\)互不相同,\(w\)互不相同,那么这个笛卡尔树的结构是唯一的。......
  • 笛卡尔树Kattis-Scaffolding
    笛卡尔树Kattis-Scaffolding注释已经写在代码里了,注意下建树就行#include<bits/stdc++.h>/*先对题意进行分析,每次带m根柱子,进行x轮,每次往左/右/上搭建,问x的最小值?一开始在想,怎么就会有最小值呢?后来发现题目说不能往下走我们还是把图看成一棵树就是说你可以向两个子节点去走,......
  • 笛卡尔树
    性质其节点具有\(2\)个权值,分别是\((key,val)\),以\(key\)看,其为一颗二叉搜索树,以\(val\)看,其为一个堆(定义)。二叉搜索树:左子树如果不空,则其权值一定小于根节点;右子树如果不空,则其权值一定大于根节点。堆:完全二叉树,每个节点的值大于等于(或小于等于)其子树中的每个节......
  • @黎耀天 发扬 笛卡尔, @物空必能 发扬 牛顿, 无敌了 。
    @黎耀天发扬笛卡尔, @物空必能发扬牛顿,  @joywee2007 发扬爱因斯坦和老子,  无敌了 。 这篇文章的灵感来自 昨前天 看到 @物空必能在牛顿吧发的 《物质的弹性与屈服强度——力学就应当探究力的问题》    https://tieba.baidu.com/p/83932......
  • C++ 树进阶系列之笛卡尔树的两面性
    1.前言笛卡尔树是一种特殊的二叉树数据结构,融合了二叉堆和二叉搜索树两大特性。笛卡尔树可以把数列(组)对象映射成二叉树,便于使用笛卡尔树结构的逻辑求解数列的区间最值或......
  • 笛卡尔树~cartesian-tree
    笛卡尔树简介笛卡尔树是一种平衡树,它的结构和treap相同,但是由于它能在O(n)时间构造,同时具有一些很有意思的性质。构造笛卡尔树的节点由键值对\((k,w)\)组成。其中键......
  • 笛卡尔树
    笛卡尔树总述笛卡尔树是一种二叉树,每一个结点由一个键值二元组\((k,w)\)构成。要求\(k\)满足二叉搜索树的性质,而\(w\)满足堆的性质,如果笛卡尔树的\(k,w\)键值确......