2017 多校训练第一场 HDU 6044 Limited Permutation
来源:互联网 发布:手动安装windows补丁 编辑:程序博客网 时间:2024/04/27 04:24
题意:有n个区间,对于第i个区间[li,ri]有li<=i<=ri,
对于任意1<=L<=i<=R<=n,当前仅当li<=L<=i<=R<=ri时P[i]=min(P[L],P[L+1],...,P[R])
题解:
首先要理解题意:当前仅当li<=L<=i<=R<=ri时P[i]=min(P[L],P[L+1],...,P[R])
因此对于P[i]一定有P[i]>P[li-1]且P[i]>P[ri+1],进一步说区间[li,ri](除了[1,n])一定被某个区间[lj,rj]包含,且j=li-1或j=ri+1
即区间j可分成[lj,j-1]和[j+1,rj]
我们把n个区间按L升序R降序进行排序(这样得到的区间LR正是前序遍历的区间)。得到的第1个区间一定要是[1,n](1比任何数都小),否则不合法,输出0;设这个区间对应的是第i个数,因此区间可再分为[1,i-1]和[i+1,n],看是否有这2个区间,如果没有则不合法,输出0...直到区间不可再分。
现在再来考虑方法数:设f(i)为区间i内的方法数,u,v分别为左右子区间,i内一共有ri-li+1个数,除去中间一个,要从中选i-li个数放入左区间,剩下的放入右区间,因此答案为:f(u)*f(v)*C(ri-li,i-li)
对于任意1<=L<=i<=R<=n,当前仅当li<=L<=i<=R<=ri时P[i]=min(P[L],P[L+1],...,P[R])
题解:
首先要理解题意:当前仅当li<=L<=i<=R<=ri时P[i]=min(P[L],P[L+1],...,P[R])
因此对于P[i]一定有P[i]>P[li-1]且P[i]>P[ri+1],进一步说区间[li,ri](除了[1,n])一定被某个区间[lj,rj]包含,且j=li-1或j=ri+1
即区间j可分成[lj,j-1]和[j+1,rj]
我们把n个区间按L升序R降序进行排序(这样得到的区间LR正是前序遍历的区间)。得到的第1个区间一定要是[1,n](1比任何数都小),否则不合法,输出0;设这个区间对应的是第i个数,因此区间可再分为[1,i-1]和[i+1,n],看是否有这2个区间,如果没有则不合法,输出0...直到区间不可再分。
现在再来考虑方法数:设f(i)为区间i内的方法数,u,v分别为左右子区间,i内一共有ri-li+1个数,除去中间一个,要从中选i-li个数放入左区间,剩下的放入右区间,因此答案为:f(u)*f(v)*C(ri-li,i-li)
#include <bits/stdc++.h>// #define test TEST using namespace std;const int mod=1e9+7;const int maxn=1e6+6;typedef long long ll;namespace IO { const int MX = 4e7; //1e7占用内存11000kb char buf[MX]; int c, sz; void begin() { c = 0; sz = fread(buf, 1, MX, stdin); } 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; } } typedef struct Node{int l,r,id;bool operator < (const Node &a) const{if(l!=a.l) return l<a.l;else return r>a.r;}}node;node seg[maxn];ll fac[maxn],inv[maxn];ll Power_Mod(ll a,ll b){ll ans=1;while(b){if(b&1ll){ans=ans*a%mod;}a=a*a%mod;b>>=1;}return ans;}void init(){fac[0]=1;for(int i=1;i<maxn;i++){fac[i]=fac[i-1]*i%mod;}inv[1]=1;for(int i=2;i<maxn;i++){inv[i]=(mod-mod/i)*inv[mod%i]%mod;}inv[0]=1;for(int i=1;i<maxn;i++){inv[i]=inv[i-1]*inv[i]%mod;}}ll C(ll a,ll b){return fac[a]*inv[b]%mod*inv[a-b]%mod;}// void init() { // fac[0] = 1; // for (int i = 1; i < maxn; i++) fac[i] = fac[i - 1] * i % mod; // inv[maxn - 1] = Power_Mod(fac[maxn - 1], mod - 2); // for (int i = maxn - 2; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod; // } // ll C(ll n, ll m) { // ll ret = 1; // while (n && m) { // ll nn = n % mod, mm = m % mod; // if (nn < mm) return 0; // ret = ((ret * fac[nn] % mod) * inv[mm] % mod) * inv[nn - mm] % mod; // n /= mod, m /= mod; // } // return ret; // } int flag,rear;ll dfs(int l,int r){if(!flag) return 0;if(l>r) return 1;if(seg[rear].l!=l || seg[rear].r!=r){flag=0;return 0;}node now=seg[rear++];ll ret=C(now.r-now.l,now.id-now.l)*dfs(now.l,now.id-1)%mod;ret=(ret*dfs(now.id+1,now.r))%mod;return ret;}int main(int argc, char const *argv[]){#ifdef testfreopen("test.txt","r",stdin);#endif init();IO::begin();int cas=1,n;while(IO::read(n)){for(int i=1;i<=n;i++) {seg[i].id=i;IO::read(seg[i].l);}for(int i=1;i<=n;i++) IO::read(seg[i].r);sort(seg+1,seg+n+1);flag=rear=1;printf("Case #%d: %lld\n",cas++,dfs(1,n));}return 0;}
阅读全文
0 0
- 2017 多校训练第一场 HDU 6044 Limited Permutation
- 2017多校训练赛第一场 HDU 6044 Limited Permutation(虚建笛卡尔树+超级读入挂)
- (2017多校训练第一场)HDU
- (2017多校训练第一场)HDU
- (2017多校训练第一场)HDU
- (2017多校训练第一场)HDU
- 2017多校第一场 HDU 6044 Limited Permutation 思维,计数,DFS
- 2017多校联合第一场 1012题 hdu 6044 Limited Permutation 笛卡尔树 递归
- 2017 多校训练第一场 HDU 6034 Balala Power!
- 2017 多校训练第一场 HDU 6038 Function
- 2017 多校训练第一场 HDU 6035 Colorful Tree
- 2017多校训练第一场
- 2017多校训练第一场
- HDU 6044& 2017年多校训练第一场 1012题
- (2017多校训练第二场)HDU
- (2017多校训练第二场)HDU
- (2017多校训练第二场)HDU
- (2017多校训练第二场)HDU
- 获取微信基础接口凭证Access_token
- 一个简单的WinHttp上传文件的类
- MongoDB之Mongoose的使用
- 面试题:数组有没有length()方法? 字符串有没有length()方法? 集合有没有length()方法?
- PHP指定概率算法
- 2017 多校训练第一场 HDU 6044 Limited Permutation
- JAVA单例模式
- <划重点的Unity2017> UGUI
- ThinkPHP 的页面静态化功能的实现(三)
- Lecture 16
- ThinkPHP 的页面静态化功能的实现(二)
- java 搭建基于springboot的ssh(spring + springmvc + hibernate)的gradle项目(添加多Module篇)
- 有史以来程序员最实用快捷键
- 1064. Complete Binary Search Tree 解析