hdu6044
题意:给出每个点是某段区间的最大值,问构造一个1到n的排列,有多少种符合要求的。
做法:用笛卡尔树,如果对于一个序列,最大值可以把序列分成两段,左边一段和右边一段,然后在对这两段进行分割,,,最大值连接左右子段的最大值,就可以得到一颗树,这棵树有两个性质,左边的点比根的下标小,有点的点比跟的下标大。跟的值是子树中最大的,这就刚好符合笛卡尔树的性质,然后就可以利用题目中给出的信息构造笛卡尔树,如果没有合法的树,那么答案就是0,否者1:可以用排列的方法求出答案,对于一个子树,跟部肯定要选择最大的树,然后把剩下的点选出一点放到左边,选出一些放到右边,方案树就是comb(区间长度-1,左区间长度),然后乘以左右子树的构造方案树,就是这个子树的方案了,递归o(n)的。
2:如果题目中的数据可以构造出一颗笛卡尔树,那么答案就是n!/(每个节点的儿子个数),n个数可以构造n!个不同序列,那么对于某个子树来说,合法的方案概率是这个子树的节点数的倒数,那么每个节点都符合的概率就是所有节点它儿子个数的乘积的倒数。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
int l[N],r[N];
int ls[N],rs[N],root;
int n;
int f[N],inv[N],invf[N];
int que[N];
const int mod = 1e9+7;
bool judge(int x,int y){return r[y]-l[y]-r[x]+l[x] > 0;
}namespace IO {const int MX = 4e7; //1e7 占用内存 11000kbchar buf[MX]; int c, sz;void begin() {c = 0;sz = fread(buf, 1, MX, stdin);//一次性全部读入/*int tot = 1;char now;while((now = getchar()) != EOF){buf[tot++] = now;}sz = tot;*/}inline bool read(int &t) {while (c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;if (c >= sz) return false;//若读完整个缓冲块则退出bool flag = 0; if(buf[c] == '-') flag = 1, c++;for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';if(flag) t = -t;return true;}
}void build(){int tp = 0;root =0;for(int i = 1;i <= n;i ++){ls[i] = rs[i] = 0;while(tp && judge(que[tp],i)) tp --;if(tp == 0){ls[i] = root;root = i;}else{ls[i] = rs[que[tp]];rs[que[tp]] = i;rs[i] =0;}que[++tp] = i;}
}
void init(){inv[1] = 1;for(int i= 2;i < N;i ++){inv[i] = (mod-mod/i)*1LL*inv[mod%i]%mod;}f[0] = invf[0] = 1;for(int i= 1;i < N;i ++){f[i] = f[i-1]*1LL*i%mod;invf[i] = invf[i-1]*1LL*inv[i]%mod;}
}
int comb(int x,int y){return 1LL*f[x]*invf[y]%mod*invf[x-y]%mod;
}long long dfs(int x,int nl,int nr){if(x == 0){return 1;}if(l[x] != nl ||r[x] != nr) return 0;long long op = comb(nr-nl+1,r[x]-l[x]+1);op = op*comb(nr-nl,x-nl)%mod;op = op*dfs(ls[x],nl,x-1)%mod;op = op*dfs(rs[x],x+1,nr)%mod;//cout << x<< ' '<<nl << ' '<<nr << ' '<<op << endl;return op;
}void print(int x){if(x == 0) return ;printf("%d %d %d\n",x,ls[x],rs[x]);print(ls[x]);print(rs[x]);
}int main(){init();IO::begin();int kase = 1;//cout <<comb(3,3)<<endl;while(IO::read(n)){for(int i = 1;i <= n;i ++) IO::read(l[i]);for(int i = 1;i <= n;i ++) IO::read(r[i]);build();//print(root);//cout<<"!!!!!" << endl;long long ans = dfs(root,1,n);printf("Case #%d: %lld\n",kase++,ans);}return 0;
}

hdu 6305
题意:给出一个数组a,b数组的元素是0到1任意的,问a,b笛卡尔树同构的方案的期望。
根据a数组构造笛卡尔树,可以知道同构的概率是所有节点的儿子树乘积的倒数,可以发现对于任意一种序列,b数组为这个序列的期望是一样的,因为总期望是n/2,所以同构的期望是上面那个概率乘以n/2,注意会爆栈。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
int num[N];
int ls[N],rs[N],root;
int que[N];
int son[N];
int inv[N];
int ss[N];
int fa[N];
int n;
const int mod = 1e9+7;
bool judge(int x,int y){if(num[x] == num[y]) return x > y;return num[x] < num[y];
}void build(){int tp = 0;root = 0;for(int i = 1;i <= n;i ++){ls[i] = rs[i] = 0;while(tp && judge(que[tp],i)) tp --;//cout << que[tp] << ' ' << i << ' '<<root << endl;if(tp == 0){ls[i] = root;root = i;}else{ls[i] = rs[que[tp]];rs[que[tp]] = i;}que[++tp] = i;}
}/*void dfs(int x){//cout <<x << ' ' << ls[x] << ' ' <<rs[x] << endl;son[x] = 0;if(x == 0) return ;son[x] = 1;dfs(ls[x]);dfs(rs[x]);son[x] += son[ls[x]];son[x] += son[rs[x]];
}*/
void init(){inv[1] = 1;for(int i = 2;i < N;i ++){inv[i] = (mod-mod/i)*1LL*inv[mod%i]%mod;}
}int main(){int T;init();cin >> T;while(T--){scanf("%d",&n);for(int i = 1;i <= n;i ++) scanf("%d",&num[i]);//for(int i=  1;i <= n;i ++) num[i] = i;build();//memset(ss,0,sizeof(ss));for(int i = 1;i <= n;i ++){ss[i] = 0;if(ls[i]) ss[i]++,fa[ls[i]] = i;if(rs[i]) ss[i]++,fa[rs[i]] = i;}fa[root] = 0;queue<int> que;for(int i = 1;i <= n;i ++){son[i] =1;if(ss[i] == 0) que.push(i);}while(!que.empty()){int now = que.front();//cout <<now << ' '<<fa[now] << ' '<<son[now] << endl;que.pop();if(fa[now] == 0) continue;ss[fa[now]] --;son[fa[now]] += son[now];if(ss[fa[now]] == 0) que.push(fa[now]);}//cout<<"!!" << endl;long long ret = n;for(int i = 1;i <= n;i ++){//cout <<i << ' '<<son[i] << ' '<< inv[son[i]] << endl;ret= ret*inv[son[i]]%mod;}ret = ret*inv[2]%mod;printf("%lld\n",ret);}return 0;
}

hdu 6044 hdu 6305 笛卡尔树相关推荐

  1. 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 ...

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

    题目链接:RMQ Similar Sequence 题意 首先给定一个长度为 nnn 的整数序列 A={a1,a2,⋯,an}" role="presentation" ...

  3. HDU 4125 Moles 笛卡尔树 + kmp

    题意:有n(1<=n<=600000)个鼹鼠挖洞,每个鼹鼠有给定权值,挖的洞是一颗二叉树(左边的鼹鼠权值都比当前鼹鼠小,右边的鼹鼠权值比当前鼹鼠大), 也要按照鼹鼠的出场顺序挖洞,在形成的 ...

  4. HDU1506(天然的笛卡尔树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意:给定一个统计直方图,n个矩形条,每个矩形条宽1,高0-10^9,求最大矩形面积. 分析:天然的 ...

  5. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  6. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

  7. 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数字串 s[ 0 ],每个位置的赋值初始时为 s[ i ] = i % 10 ( i ∈ [ 0 , n - 1 ] ),现在有一个长度为 n 的排 ...

  8. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  9. POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)

    题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了 ...

最新文章

  1. CSS初识(三):CSS字体文本相关属性
  2. php微服务rpc选择,Dora RPC:PHP 的分布式 RPC,支持微服务、服务发现
  3. 没有Javax的Jakarta EE:这次世界也不会结束
  4. SQLAlchemy create_engine
  5. Android之帮助文档
  6. Vue路由及路由守卫
  7. 【语音播报】基于matlab语音播报【含Matlab源码 507期】
  8. 防抖与节流的原理、实现及优化
  9. hdu 2167 Pebbles 状态压缩dp
  10. uni-app跨平台开发app,用Hbuilderx打包安卓应用程序到上架google play 完成l流程
  11. c语言学生学籍管理修改,C语言课设之学生学籍管理系统.doc
  12. 弘辽科技:淘宝新店扶持是人人享有的权益吗?
  13. 不要小看了互联网智能锁,它正撬动整个多元化居住产品时代!
  14. “建房收租”网络时代人人可做
  15. android 钉钉考勤日历,vue钉钉考勤日历 vue实现钉钉的考勤日历
  16. python爬虫——Request之get请求和post请求
  17. 高德地图坐标转换为具体地址
  18. React SSR - 01 SSR 介绍 和 快速开始
  19. html5制作交互式课件,网易科技频道--Hot Potatoes 教你如何制作交互式Web课件的新工具...
  20. geotools应用-JTS生产四叉树索引和R树索引

热门文章

  1. 应对大厂面试,我是如何学会React Hooks的
  2. 2021 年全国职业院校技能大赛 网络搭建与应用赛项
  3. 测试两路由器间网速软件,网速检测(TCP Monitor Plus)
  4. NVM 安装node.js后没有npm
  5. [OpenWrt] reset按键处理流程(hotplug)
  6. 点云孔洞定位_一种对具有孔洞的三维点云的检测与识别方法与流程
  7. lte接口流程图_LTE信令流程图(端到端平台)[技术学习]
  8. 怎么聊微信才能让她喜欢你
  9. 自己搭建一个局域网(两台电脑)
  10. 190407 逆向-西湖论剑杯