zoukankan      html  css  js  c++  java
  • P2612 [ZJOI2012]波浪 [dp]

    不会(dp)……

    我们发现绝对值的问题不太好搞,所以我们按顺序插入就可以了。
    我们设一个状态 (dp_{i,j,k,l}) 为 插入前 (i) 个数,已经构成 (j) 个连通块,(k) 的贡献,(l) 表示(1)(n)的边界问题 的方案数。

    那么答案显而易见是 (frac{sum_{k=m}^{limit} dp_{n,1,k,2}}{n!})
    由于你放到一些位置,贡献是负数,所以就直接在 (k) 那一维整体(+4500)就好了。

    然后就是喜闻乐见的分类讨论环节了。

    • 两边都不和连通块相连,产生 (-2 imes i) 的贡献,方案数为 (j - l + 1)
    • 一边和连通块,另一边不和连通块相连,那么产生 (0) 的贡献,方案数 (j - 1),条件 (j geq 2)
    • 两边都和连通块相连,产生 (2 imes i) 的贡献,方案数是 (j - 1),条件 (j geq 2)
    • 一边不和连通块相连,一边和边界相连,会产生 (-i) 的贡献,方案数是 (2-l),条件是 (l geq 2)
    • 一边和连通块相连,一边和边界相连,产生 (i) 的贡献,方案数是 (2-l),条件还是 (l geq 2)

    滚动一下就好了。

    // powered by c++11
    // by Isaunoya
    #include <bits/stdc++.h>
    
    #define rep(i, x, y) for (register int i = (x); i <= (y); ++i)
    #define Rep(i, x, y) for (register int i = (x); i >= (y); --i)
    
    using namespace std;
    using db = double;
    using ll = long long;
    using uint = unsigned int;
    using ull = unsigned long long;
    
    using pii = pair<int, int>;
    
    #define fir first
    #define sec second
    
    template <class T>
    
    void cmax(T& x, const T& y) {
      if (x < y) x = y;
    }
    
    template <class T>
    
    void cmin(T& x, const T& y) {
      if (x > y) x = y;
    }
    
    #define all(v) v.begin(), v.end()
    #define sz(v) ((int)v.size())
    #define pb emplace_back
    
    template <class T>
    
    void sort(vector<T>& v) {
      sort(all(v));
    }
    
    template <class T>
    
    void reverse(vector<T>& v) {
      reverse(all(v));
    }
    
    template <class T>
    
    void unique(vector<T>& v) {
      sort(all(v)), v.erase(unique(all(v)), v.end());
    }
    
    void reverse(string& s) { reverse(s.begin(), s.end()); }
    
    const int io_size = 1 << 23 | 233;
    const int io_limit = 1 << 22;
    struct io_in {
      char ch;
    #ifndef __WIN64
      char getchar() {
        static char buf[io_size], *p1 = buf, *p2 = buf;
    
        return (p1 == p2) && (p2 = (p1 = buf) + fread(buf, 1, io_size, stdin), p1 == p2) ? EOF : *p1++;
      }
    #endif
      io_in& operator>>(char& c) {
        for (c = getchar(); isspace(c); c = getchar());
    
        return *this;
      }
      io_in& operator>>(string& s) {
        for (s.clear(); isspace(ch = getchar());)
          ;
    
        if (!~ch) return *this;
    
        for (s = ch; !isspace(ch = getchar()) && ~ch; s += ch)
          ;
    
        return *this;
      }
    
      io_in& operator>>(char* str) {
        char* cur = str;
        while (*cur) *cur++ = 0;
    
        for (cur = str; isspace(ch = getchar());)
          ;
        if (!~ch) return *this;
    
        for (*cur = ch; !isspace(ch = getchar()) && ~ch; *++cur = ch)
          ;
    
        return *++cur = 0, *this;
      }
    
      template <class T>
    
      void read(T& x) {
        bool f = 0;
        while ((ch = getchar()) < 48 && ~ch) f ^= (ch == 45);
    
        x = ~ch ? (ch ^ 48) : 0;
        while ((ch = getchar()) > 47) x = x * 10 + (ch ^ 48);
        x = f ? -x : x;
      }
    
      io_in& operator>>(int& x) { return read(x), *this; }
    
      io_in& operator>>(ll& x) { return read(x), *this; }
    
      io_in& operator>>(uint& x) { return read(x), *this; }
    
      io_in& operator>>(ull& x) { return read(x), *this; }
    
      io_in& operator>>(db& x) {
        read(x);
        bool f = x < 0;
        x = f ? -x : x;
        if (ch ^ '.') return *this;
    
        double d = 0.1;
        while ((ch = getchar()) > 47) x += d * (ch ^ 48), d *= .1;
        return x = f ? -x : x, *this;
      }
    } in;
    
    struct io_out {
      char buf[io_size], *s = buf;
      int pw[233], st[233];
    
      io_out() {
        set(7);
        rep(i, pw[0] = 1, 9) pw[i] = pw[i - 1] * 10;
      }
    
      ~io_out() { flush(); }
    
      void io_chk() {
        if (s - buf > io_limit) flush();
      }
    
      void flush() { fwrite(buf, 1, s - buf, stdout), fflush(stdout), s = buf; }
    
      io_out& operator<<(char c) { return *s++ = c, *this; }
    
      io_out& operator<<(string str) {
        for (char c : str) *s++ = c;
        return io_chk(), *this;
      }
    
      io_out& operator<<(char* str) {
        char* cur = str;
        while (*cur) *s++ = *cur++;
        return io_chk(), *this;
      }
    
      template <class T>
    
      void write(T x) {
        if (x < 0) *s++ = '-', x = -x;
    
        do {
          st[++st[0]] = x % 10, x /= 10;
        } while (x);
    
        while (st[0]) *s++ = st[st[0]--] ^ 48;
      }
    
      io_out& operator<<(int x) { return write(x), io_chk(), *this; }
    
      io_out& operator<<(ll x) { return write(x), io_chk(), *this; }
    
      io_out& operator<<(uint x) { return write(x), io_chk(), *this; }
    
      io_out& operator<<(ull x) { return write(x), io_chk(), *this; }
    
      int len, lft, rig;
    
      void set(int _length) { len = _length; }
    
      io_out& operator<<(db x) {
        bool f = x < 0;
        x = f ? -x : x, lft = x, rig = 1. * (x - lft) * pw[len];
        return write(f ? -lft : lft), *s++ = '.', write(rig), io_chk(), *this;
      }
    } out;
    
    template <int sz, int mod>
    
    struct math_t {
    	math_t() {
        fac.resize(sz + 1), ifac.resize(sz + 1);
        rep(i, fac[0] = 1, sz) fac[i] = fac[i - 1] * i % mod;
    
        ifac[sz] = inv(fac[sz]);
        Rep(i, sz - 1, 0) ifac[i] = ifac[i + 1] * (i + 1) % mod;
      }
    
      vector<int> fac, ifac;
    
      int qpow(int x, int y) {
        int ans = 1;
        for (; y; y >>= 1, x = x * x % mod)
          if (y & 1) ans = ans * x % mod;
        return ans;
      }
    
      int inv(int x) { return qpow(x, mod - 2); }
    
      int C(int n, int m) {
        if (n < 0 || m < 0 || n < m) return 0;
        return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
      }
    };
    
    int gcd(int x, int y) { return !y ? x : gcd(y, x % y); }
    int lcm(int x, int y) { return x * y / gcd(x, y); }
    
    int n , m , k;
    
    namespace A {
    	double f[2][101][9001][3];
    }
    
    namespace B {
    	__float128 f[2][101][9001][3];
    }
    
    template < class T > 
    
    void print(T x) {
    	out << "0." ;
    	x *= 10;
    	rep(i , 1 , k - 1) {
    		out << (int)x ;
    		x = (x - (int)x) * 10;
    	}
    	out << (int)(x + 0.5) << '
    ';
    }
    
    template < class T > 
    
    void solve(T f[][101][9001][3]) {
    	f[0][0][0 + 4500][0] = 1;
    	
    	rep(i , 1 , n) {
    		int p = i & 1, o = p ^ 1;
    		memset(f[p], 0, sizeof(f[p]));
    		rep(j , 0 , min(i - 1 , m)) {
    			rep(k , 0 , 9000) {
    				rep(l , 0 , 2) {
    					T t = f[o][j][k][l];
    					if(! t) continue;
    					if(k >= 2 * i) {
    						f[p][j + 1][k - 2 * i][l] += t * (j - l + 1);
    					}
    					if(j > 0) {
    						f[p][j][k][l] += t * (j * 2 - l);
    					}
    					if(j >= 2 && k + 2 * i <= 9000) {
    						f[p][j - 1][k + 2 * i][l] += t * (j - 1);
    					}
    					if(l ^ 2 && k >= i) {
    						f[p][j + 1][k - i][l + 1] += t * (2 - l);
    					}
    					if(l ^ 2 && j && k + i <= 9000) {
    						f[p][j][k + i][l + 1] += t * (2 - l);
    					}
    				}
    			}
    		}
    	}
    	
    	T ans = 0;
    	rep(i , m + 4500 , 9000)
    		ans += f[n & 1][1][i][2];
    	rep(i , 1 , n) ans /= i;
    	
    	print(ans);
    }
    
    signed main() {
      // code begin.
    	in >> n >> m >> k;
    	if(k <= 8)
    		solve(A :: f);
    	else 
    		solve(B :: f);
      return 0;
      // code end.
    }
    
  • 相关阅读:
    Selenium简单测试页面加载速度的性能(Page loading performance)
    Selenium Page object Pattern usage
    Selenium如何支持测试Windows application
    UI Automation的两个成熟的框架(QTP 和Selenium)
    分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
    敏捷开发中的测试金字塔(转)
    Selenium 的基础框架类
    selenium2 run in Jenkins GUI testing not visible or browser not open but run in background浏览器后台运行不可见
    eclipse与SVN 结合(删除SVN中已经上传的问题)
    配置Jenkins的slave节点的详细步骤适合windows等其他平台
  • 原文地址:https://www.cnblogs.com/Isaunoya/p/12591305.html
Copyright © 2011-2022 走看看