首页 > 其他分享 >P5999 [CEOI2016] kangaroo的TJ

P5999 [CEOI2016] kangaroo的TJ

时间:2024-07-17 17:09:05浏览次数:8  
标签:ch int 要么 kangaroo P5999 long CEOI2016 TJ

[CEOI2016] kangaroo

其实就是给你一个\(p_1,p_n\)确定,其余未知的排列,求有多少个合法的排列,满足一个数要么比他相邻的两边都大,要么比他相邻的两边都小。

我们若是依次考虑每\(p_{1,2,\cdots ,n}\),由于他的取值还和后面有关,我们不好考虑,考虑依次将\(i=1,2,\cdots,n\)填入当前的序列。

设\(dp_{i,j}\)表示现在填到了第\(i\)个数,填出来了\(j\)个块的方案数。(每一块相当于是在排列上连续的一段,但需要注意的是,我们并不关心这一段的具体位置)。

先考虑\(i=s/t\)的情况:

很明显,他们要么是会加入最左边/最右边的块,要么是单独在最左边/最右边作为一个块,所以:

\[f_{i,j}=f_{i-1,j}+f_{i-1,j-1} \]

其他情况下,我们分情况考虑:

  1. 若他把两个块合并起来,由于之前块的每一个数都比他小,所以明显可以,则\(f_{i,j}\leftarrow f_{i-1,j+1}\times j\)(之前的\(j+1\)个块中有\(j\)个空隙,可以填入任意一个)。
  2. 他加入一个块,那么此时他旁边的那个肯定小于它,但未来加入的肯定大于他,不合法。
  3. 若他单独开一个块,很明显接下来插入他两边的都比他大,则有\(j-1+1=j\)个位置,但是需要注意的是,若他比\(s\)大,则不能放到最左边(同\(s\)靠一起),比\(t\)大同理,则\(f_{i,j}\leftarrow f_{i-1,j-1}\times (j-[i>s]-[i>t])\)

注意到这样子我们构造出来的每一段都是如:小->大->小->大->小 这样的形式的,所以保证了dp式子的正确性(主要是第一个情况)。

初始状态为\(f_{1,1}=1\),最终答案为\(f_{n,1}\)

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
inline int rd(){
	int x=0,f=1; char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if (ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	return x*f;
}
const int N=2e3+5,INF=0x3f3f3f3f3f3f3f3f,mod=1e9+7;
int n,s,t;
int f[N][N];
signed main(){
	n=rd(),s=rd(),t=rd();
	f[1][1]=1;
	for(int i=2;i<=n;i++){
		for(int j=1;j<=i;j++){
			if(i==s||i==t) f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;
			else{
				f[i][j]+=f[i-1][j+1]*j%mod;
				f[i][j]+=f[i-1][j-1]*(j-(i>s)-(i>t))%mod;
				f[i][j]%=mod;
			}
		}
	}
	printf("%lld\n",f[n][1]);
	return 0;	
}

标签:ch,int,要么,kangaroo,P5999,long,CEOI2016,TJ
From: https://www.cnblogs.com/123456xwd/p/18307839

相关文章

  • FastJson详解
    文章目录一、FastJson介绍二、FastJson序列化API1、序列化Java对象2、序列化List集合3、序列化Map集合三、FashJson反序列化API1、反序列化Java对象2、反序列化List集合3、反序列化Map集合(带泛型)四、SerializerFeature枚举1、默认字段为null的不显示2、格式化五、@JSo......
  • Fastjson的payload收集
    What无第三方依赖收集了网络上的多种payload,方便进行fuzz测试提供了自动替换payload的功能,一次性为所有payload插入rmi地址/dnslogHelp--list:以清单的形式打印,方便作为字典进行fuzz--address:服务器地址(无需rmi://前缀),如11.22.33.44/exp、eval.com/rce--dns:dnslog的地址,不同......
  • Retrofit2 使用FastJson作为Converter.m
    首先创建一个FastJsonRequestBodyConverter类packagecom.rrc.core.net.converter;importcom.alibaba.fastjson.JSON;importjava.io.IOException;importokhttp3.MediaType;importokhttp3.RequestBody;importretrofit2.Converter;/***=========================......
  • nuxtjs2.x项目PC移动互相跳转
    1、在plugins目录下新建terminalToggle.js,写入以下代码(function(){letsUserAgent=navigator.userAgent.toLowerCase();letisIpad=sUserAgent.match(/ipad/i)=="ipad";letisIphoneOs=sUserAgent.match(/iphoneos/i)=="iphoneos";letis......
  • 求助!!![TJOI2009] 开关样例过不了,如何解决?(语言-c++)
    题目链接:https://www.luogu.com.cn/problem/P9869我的输出:1  12#include<bits/stdc++.h>usingnamespacestd;constintN=100300;intn,m,c,a,b;structnode{intf=0;intsum,l,r;//sum为开灯总数}tr[N<<2];voidup(intk){tr[k].sum+=tr[k......
  • ExtJs开发教程_001_Ext.data.Store使用方法详解
    本系列教程基本可以看做是ExtJSAPI中文版+实例演示更多内容请参看:http://www.cnblogs.com/mryeExt.data.Store用法介绍这个组件继承自Ext.data.AbstractStore 本篇讲解了如何构造并且做一些基本使用,如果有什么疑问可以联系我QQ1330771552下面是他的属性列表?aut......
  • ExtJs常用布局--layout详解(含实例)
    序言:笔者用的ExtJs版本:ext-3.2.0ExtJs常见的布局方式有:border、form、absolute、column、accordion、table、fit、card、anchor另外,不常见的布局有:tab、vbox、hbox本文所有实例代码已提供下载,下载链接:ExtJs常用布局--layout详解实例代码 简介:最常用的边框布局——BorderLa......
  • ExtJS中layout的12种布局风格
    extjs的容器组件都可以设置它的显示风格,它的有效值有absolute,accordion,anchor,border,card,column,fit,formandtable. 一共9种。另外几种见: http://www.sencha.com/deploy/dev/examples/layout-browser/layout-browser.html 里面有详细的例子。 ·  absol......
  • 一文入门【NestJs】Controllers
    Nest学习系列✈️一文带你入门【NestJS】✈️前言流程图Controllers控制器主要负责处理传入请求,并向客户端返回响应,控制器可以通过路由机制来控制接收那些请求,通常一个Controllers种会有多个匹配路由,不同的路由可以知情不同操作,我们可以通过装饰器将类与所需要的元数据关......
  • extjs中treepanel例子
    :TreePanel继承自Panel,在ExtJS中使用树控件含有丰富的属性和方法实现复杂的功能。其中Ext.tree.TreeNode代表一个树节点,比较常用的属性包括text、id、icon、checked等、异步树Ext.tree.AsyncTreeNode、树加载器Ext.tree.TreeLoader。下面介绍几个extjs中treepanel例子一、TreePan......