离线+dp 51Nod1020 逆序排列

来源:互联网 发布:443端口入侵教程 编辑:程序博客网 时间:2024/06/08 02:02

传送门:点击打开链接

题意:求长度为n的排列的逆序对等于k的排列总数,取模1e9+7

思路:刚开始想找规律,但是发现根本没法搞。。

但是我们如果从dp的角度去思考,就能找到一个dp是这样的

dp[n][k]=dp[n-1][i],max(k-n+1,0)<=i<=k

其中边界dp[0][0]=1

那么就能用离线+前缀和去搞答案了

要注意的就是ans等于0的情况,离线的时候要注意p是否能取到所有的,不然可能后面的答案会全错

#include<map>#include<set>#include<cmath>#include<ctime>#include<stack>#include<queue>#include<cstdio>#include<cctype>#include<string>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<functional>#define fuck(x) cout<<"["<<x<<"]"#define FIN freopen("input.txt","r",stdin)#define FOUT freopen("output.txt","w+",stdout)using namespace std;typedef long long LL;typedef pair<int, int>PII;const int MX = 2e4 + 5;const int mod = 1e9 + 7;const int INF = 0x3f3f3f3f;struct Data {    int id, n, k;    bool operator<(const Data &P) const {        if(n == P.n) return k < P.k;        return n < P.n;    }} A[MX];int n, ans[MX];LL dp[2][MX];int main() {    //FIN;    while(~scanf("%d", &n)) {        memset(ans, 0, sizeof(ans));        int mn = 0, mk = 0;        for(int i = 1; i <= n; i++) {            A[i].id = i;            scanf("%d%d", &A[i].n, &A[i].k);            mn = max(mn, A[i].n);            mk = max(mk, A[i].k);        }        sort(A + 1, A + 1 + n);        int cur = 0, nxt = 1, p = 1;        for(int i = 0; i <= mk; i++) dp[cur][i] = 1;        for(int i = 1; i <= mn; i++) {            int bound = i * (i - 1) / 2;            for(int j = 0; j <= min(mk, bound); j++) {                int l = max(j - i + 1, 0), r = j;                LL sl = l == 0 ? 0 : dp[cur][l - 1];                dp[nxt][j] = (dp[cur][r] - sl + mod) % mod;                while(p <= n && i == A[p].n && j == A[p].k) {                    ans[A[p++].id] = dp[nxt][j];                }                dp[nxt][j] = (dp[nxt][j] + dp[nxt][j - 1]) % mod;            }            for(int j = min(mk, bound) + + 1; j <= mk; j++) {                dp[nxt][j] = dp[nxt][j - 1];                while(p <= n && i == A[p].n && j == A[p].k) {                    ans[A[p++].id] = 0;                }            }            swap(cur, nxt);        }        for(int i = 1; i <= n; i++) {            printf("%d\n", ans[i]);        }    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工程专业排名 黑工程专业 质量工程专业 工程学习网 魔兽世界怀旧服工程学攻略 魔兽世界怀旧服工程学 北京大学化学与分子工程学院 大连理工大学建设工程学部 北大化学与分子工程学院 工程宝 西安轩宝清洗工程有限公司 工程宝使用方法图解 工程宝的使用方法 工程宝app 中铁北京工程局 中铁广州工程局 广西水电工程局 中铁北京工程局集团有限公司 山东省水利工程局有限公司 中铁上海工程局集团有限公司 中铁上海工程局本科生待遇2018 中交机电工程局有限公司 中铁北京工程局应届生待遇 工程局郑建林被停职 中国建筑第八工程局 中国建筑第五工程局有限公司 中国建筑第五工程局 中国建筑第八工程局有限公司 中国建筑第二工程局 中国建筑第四工程局有限公司 中国建筑第二工程局有限公司 中国建筑第七工程局 中国建筑第四工程局 中国建筑第七工程局有限公司 中国建筑第三工程局有限公司 中国建筑第六工程局有限公司 中铁有多少个工程局 中国水利水电第三工程局 中国水利水电第七工程局 中国水利水电第十一工程局 中国水利水电第六工程局