• SDOI2010 地精部落


    SDOI2010 地精部落

    Description


    传说很久以前,大地上居住着一种神秘的生物:地精。 地精喜欢住在连绵不绝的山脉中。具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N 之间的正 整数。 如果一段山脉比所有与它相邻的山脉都高,则这段山脉是一个山峰。位于边 缘的山脉只有一段相邻的山脉,其他都有两段(即左边和右边)。 类似地,如果一段山脉比所有它相邻的山脉都低,则这段山脉是一个山谷。 地精们有一个共同的爱好——饮酒,酒馆可以设立在山谷之中。地精的酒馆 不论白天黑夜总是人声鼎沸,地精美酒的香味可以飘到方圆数里的地方。 地精还是一种非常警觉的生物,他们在每座山峰上都可以设立瞭望台,并轮 流担当瞭望工作,以确保在第一时间得知外敌的入侵。 地精们希望这N 段山脉每段都可以修建瞭望台或酒馆的其中之一,只有满足 这个条件的整座山脉才可能有地精居住。 现在你希望知道,长度为N 的可能有地精居住的山脉有多少种。两座山脉A 和B不同当且仅当存在一个 i,使得 Ai≠Bi。由于这个数目可能很大,你只对它 除以P的余数感兴趣。

    Input


    仅含一行,两个正整数 N, P。

    Output


    仅含一行,一个非负整数,表示你所求的答案对P取余 之后的结果。

    Sample Input


    4 7

    Sample Output


    3

    HINT


    img
    对于 20%的数据,满足 N≤10;
    对于 40%的数据,满足 N≤18;
    对于 70%的数据,满足 N≤550;
    对于 100%的数据,满足 3≤N≤4200,P≤109

    Solution


    我觉得这个挺难想的。。。

    这是让求一个数列,数列呈波浪形(意会一下),然后据dalao讲解:[https://www.luogu.org/blog/user55639/#]:dalaoblog

    这种数列有如下性质

    1.如果i和i-1不相邻,那么可以交换i和i-1,它仍是一个波动数列,方案数不变。
    2.如果将数列中所有数换成N+1-A[i],它仍是一个波动数列,方案数不变。

    这道题空间限制64 MB,所以用滚动数组优化一下空间。

    f[i][j]表示以j作山峰,为序列头,选1~i的所有数字的波动数列的方案数。因为最后波动数列有对称性,ans*2。

    Code


    //Writer : Hsz %WJMZBMR%tourist%hzwer
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #include<stack>
    #include<vector>
    #include<cstdlib>
    #include<algorithm>
    #define LL long long
    using namespace std;
    int n,p,ans;
    int f[2][4205];
    int main() {
    	scanf("%d%d",&n,&p);
    	f[0][2]=1;
    	for(int i=3; i<=n; i++) {//前两个数以2为山峰1种情况
    		for(int j=2; j<=i; j++)
    			f[i&1][j]=f[i&1][j-1]+f[(i-1)&1][i-j+1]%p,f[i&1][j]%=p;//滚动数组优化
    	}
    	LL ans=0;
    	for(int i=2; i<=n; i++) ans+=f[n&1][i],ans%=p;
    	ans*=2;
    	cout<<ans%p;
    	return 0;
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    动态SQL和PL/SQL的EXECUTE选项分析
    PL/SQL开发中动态SQL的使用方法
    windows 快捷调用
    Windows PE 工具
    面向对象(OOP)五大基本原则
    图像几何变换(geometric transformation)
    BP神经网络模型及梯度下降法
    人工神经元模型及常见激活函数
    Python: PS 滤镜--高反差保留 (High pass)
    Python: PS 滤镜--碎片特效
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9134409.html
Copyright © 2020-2023  润新知