luoguP3255 [JLOI2013]地形生成 动态规划

出题人语文真好...

各不相同的标号和高度 = 各不相同的标号 + 单独的高度...

第一问比较简单,考虑从大到小插入,在相同情况下,按关键值从小到大插入

这样子,关键大的元素一定会影响到关键小的元素,不会漏统计

插入$i$号元素时,不妨设比它大的数为$S$个,限制为$lim$,和它相同的且已经插入的数有$j$种

那么有$min(S, lim) + j$种插入的方案

第二问也比较简单

考虑$dp$,令$f(i, j)$表示在相同的数中,插入到了$i$,并且$i$插入在第$j$段

由于插入的顺序是不影响答案的,因此,我们可以限制关键值小的必须插在关键值后面

转移时用前缀和转移就行

我们去掉$O(p)$的势能需要$O(p^2)$的时间

而序列的势能只有$O(n)$,因此我们的复杂度不会超过$O(n^2)$

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
namespace remoon {
    #define re register
    #define de double
    #define le long double
    #define ri register int
    #define ll long long
    #define sh short
    #define pii pair<int, int>
    #define mp make_pair
    #define pb push_back
    #define tpr template <typename ra>
    #define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)
    #define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --)
    extern inline char gc() {
        static char RR[23456], *S = RR + 23333, *T = RR + 23333;
        if(S == T) fread(RR, 1, 23333, stdin), S = RR;
        return *S ++;
    }
    inline int read() {
        int p = 0, w = 1; char c = gc();
        while(c > ‘9‘ || c < ‘0‘) { if(c == ‘-‘) w = -1; c = gc(); }
        while(c >= ‘0‘ && c <= ‘9‘) p = p * 10 + c - ‘0‘, c = gc();

        return p * w;
    }
    int wr[50], rw;
    #define pc(iw) putchar(iw)
    tpr inline void write(ra o, char c = ‘\n‘) {
        if(!o) pc(‘0‘);
        if(o < 0) o = -o, pc(‘-‘);
        while(o) wr[++ rw] = o % 10, o /= 10;
        while(rw) pc(wr[rw --] + ‘0‘);
        pc(c);
    }
    tpr inline void cmin(ra &a, ra b) { if(a > b) a = b; }
    tpr inline void cmax(ra &a, ra b) { if(a < b) a = b; }
    tpr inline bool ckmin(ra &a, ra b) { return (a > b) ? a = b, 1 : 0; }
    tpr inline bool ckmax(ra &a, ra b) { return (a < b) ? a = b, 1 : 0; }
}
using namespace std;
using namespace remoon;

#define sid 1050
#define mod 2011

inline void inc(int &a, int b) { a += b; if(a >= mod) a -= mod; }
inline int mul(int a, int b) { return 1ll * a * b % mod; }

int n;
struct mountain {
    int h, k;
    friend bool operator < (mountain a, mountain b)
    { return a.h > b.h && (a.h == b.h && a.k < b.k); }
} mt[sid];

int f[1050][1050];
inline void Solve() {
    int ans = 1;
    for(ri i = 1, j = 1; i <= n; i = j + 1) {
        j = i; while(mt[j].h == mt[j + 1].h) j ++;
        rep(ip, i, j) cmin(mt[ip].k, i);
        rep(ip, 1, mt[i].k) f[i][ip] = 1;
        rep(ip, i, j) {
            if(ip < j) rep(jp, 1, mt[ip + 1].k) inc(f[ip][jp], f[ip][jp - 1]);
            else rep(jp, 1, mt[ip].k) inc(f[ip][jp], f[ip][jp - 1]);
            if(ip < j) rep(jp, 1, mt[ip + 1].k) f[ip + 1][jp] = f[ip][jp];
        }
        ans = mul(ans, f[j][mt[j].k]);
    }
    write(ans);
}

int main() {

    n = read();
    rep(i, 1, n) mt[i].h = read(), mt[i].k = read();
    sort(mt + 1, mt + n + 1);

    int ans = 1, num, pre;
    rep(i, 1, n) {
        if(mt[i].h != mt[i - 1].h) pre = i, num = 0;
        else num ++;
        ans = mul(ans, min(pre, mt[i].k) + num);
    }
    write(ans, ‘ ‘);

    Solve();
    return 0;
}

原文地址:https://www.cnblogs.com/reverymoon/p/9781056.html

时间: 2024-08-11 06:57:38

luoguP3255 [JLOI2013]地形生成 动态规划的相关文章

[JLOI2013]地形生成

题目描述 最近IK正在做关于地形建模的工作.其中一个工作阶段就是把一些山排列成一行.每座山都有各不相同的标号和高度.为了遵从一些设计上的要求,每座山都设置了一个关键数字,要求对于每座山,比它高且排列在它前面的其它山的数目必须少于它的关键数字. 显然满足要求的排列会有很多个. 对于每一个可能的排列,IK生成一个对应的标号序列和等高线序列.标号序列就是按顺序写下每座山的标号. 等高线序列就是按顺序写下它们的高度.例如有两座山,这两座山的一个合法排列的第一座山的标号和高度为1和3,而第二座山的标号和高

BZOJ 3193 JLOI2013 地形生成 组合数学

题目大意:给定一些山,每座山有一个高度和一个关键值,现在要将这些山排成一个序列,要求每座山之前高度高于它的山的数量不能超过它的关键值,求合法的标号序列数和高度序列数 = = 首先我们考虑第一问 我们发现高度较小的山对高度较大的山是没有影响的 那么我们可以将山按照高度从大到小排序 每座山插入时都有一些备选位置 将备选位置数相乘即是答案 现在考虑第二问 嘲讽:谁能告诉我O(n^3)到底怎么做= = 我们按照之前的思路将山按照高度从大到小排序 将高度相同的山拎出来 每一座山都有一些位置可选 那么我们不

Day3:关于地形生成

---恢复内容开始--- 今天桃子好像还是没什么动静,不过媳妇倒是有一点见红~ 希望这是马上要出来的前兆了~ 桃子都已经晃点我俩好多回了~ 已经都快习惯来她这个狼来了的征兆了~ -------------------------------任性的分割线--------------------------------- 因为想做一个类似<Minecraft>的游戏,所以各种找关于地形生成的算法~ 虽然之前弄得那个柏林噪音的算法可以,但是欠缺太多东西了~ 不知道是不是我太钻牛角尖了~ 对应该如何制

三维地形生成

三维地形生成的相关代码matlab 1 function terrain() 2 n=9;%递归次数 3 H=2;%设置初始正方形四顶点值 4 t=0.2;%控制地貌形态 5 delta=0.01;%初始随机位移偏移量,控制地貌形态 6 size=2^n+1; 7 S=zeros(size,size);%设置size*size的初始方阵 8 S(1,1)=H+sqrt(1-2^(2*t-2))*normrnd(0,1)*delta;%赋初始高度值 9 S(1,size)=H+sqrt(1-2^(

BZOJ 3193 地形生成

这种dp好烦啊. 懒得写题解. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1050 #define mod 2011 using namespace std; int n,x,y,f[maxn],ans1=1,ans2=1,l[maxn],r[maxn],cnt=0; struct status { int h,f; frien

关于生成三维地形

本以为<OpenGL游戏编程>中的地形生成算法很高大上,但最近几天因为在看<3D地形编程>,整本书介绍的都是跟地形相关的内容,而<OpenGL游戏编程>中所述地形算法正是最简单的那种,仅仅是<3D地形编程>入门级的算法(硬渲染算法),由LOD.CLOD算法生成的地形是为了渲染大型室外场景的.<OpenGL游戏编程>这本书如今称得上是看明白了,介绍的更多的是OpenGL API和OpenGL程序机制,比较基础,纯粹是堆积木式的开发.总的来说,算法层

unity3d 随机生成地形之随机山脉

利用Fractal Noise生成地形,再加上山体shader,外加雪shader Noise生成结果 noise 生成主要参考这篇文章,就不再赘述 Value3D: Perlin2D: Fractal Noise: 地形生成结果 生成地形网格方法主要参考这篇文章,就不再赘述 noise 频率:22,分辨率:256 Value3D: Perlin2D: Fractal Noise: noise 有很多用处,比如地形,水体,流体,特殊物体的纹理,或使贴图不重复等等 山体shader Shader方

《聚焦3D地形编程》学习点

痞子龙的译本虽然称不上好,但却保留了原汁原味,看这本书时最好结合原文与痞子龙的译文.另外,如果有过地形生成的经验再看这本书时有些帮助,这本书介绍的专业的室外地形开发,很全面的介绍. 仅是个人总结,可能不适合网友阅读. 使用fault formation和midpoint displacement产生不规则地形(程序式生成高度图) burte force(硬渲染)是最慢的地形渲染算法,如果是5*5的高度图,那么将产生5*5个顶点, fault formation+burte force算法=>地形

unity3D绘画手册-----地形及术语解释

Unity3D教程:设置地形(Terrain) Posted on 2013年04月18日 by U3d / Unity3D 基础教程 /被围观 1,901 次 新建地形: 在菜单中新建一个地形. Unity3D教程:设置地形(Terrain) 会看到Terrain对象.如果要修改地形参数,可以在Terrain菜单下的SetResolution中设置. Unity3D教程:设置地形(Terrain) 如上图所示.地形的参数设置: TerrainWidth:全局地形总宽度.其单位为Unity统一单