题目描述

题目还是简单一点好。

给定自然数n、k、x,你要求出第k小的长度为n的逆序对对数为x的1~n的排列a1,a2...an,然后用仙人图上在线分支定界启发式带花树上下界最小费用流解决问题,保证存在。

输入格式

一行三个自然数n、k、x。

输出格式

输出满足条件的排列,一行n个数,用空格分隔。

题目都说了:用仙人图上在线分支定界启发式带花树上下界最小费用流解决问题就可以了

看数据范围猜是DP......

我们可以用$f[i][j]$表示序列长度为i,其中有j对逆序对时的可能组数,转移也很显然:

$$f[i][j]=\sum_{k=max(0,i-j+1)}^j f[i-1][k]$$

大意就是累加i-1时有k对逆序对,放第i+1个数时因为放的地方不一样,新产生的逆序对个数也不一样,全部加起来即可

不过有几个问题

①虽然上面这个转移看起来是$O(n^3)$的,但是因为逆序对个数可以达到$\frac{n*(n-1)}{2}$个,所以其实是$O(n^4)$的

解决方案:观察转移方程我们可以发现$f[i][j]$必定是$f[i-1][j]$中的一段连续和,所以可以用前缀和优化

②显然这样做会爆$int$

解决方案:所以我们需要开$long long$

③显然这样做会爆$long long$

解决方案:我们设定一个$inf$值如果$f[i][j]$已经比$inf$大了继续累加就没有意义了,所以直接把$f[i][j]$设为$inf$即可

④显然开了两个大数组($f[i][j]$和$g[i][j]$)会被毒瘤出题人卡空间

解决方案:观察到$f[i][j]$和$g[i][j]$都之和前一个状态有关,那就把第一维压掉,但是$f[i][j]$在后面输出序列的时候是要用到的,所以压掉$g[i][j]$数组即可

DP结束了之后直接乱搞就好了,枚举每一位的大小$i$,比较$f[now][x-i+1]$和$k$的大小,如果$k>f[now][x-i+1]$就直接减掉,最后刚好凑齐的f[i][j]肯定就是最后答案了

 #include<bits/stdc++.h>
#define int long long
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = 3e2+,inf=1e13+;
int f[M][M*M>>],a[M],n,x,k,ans[M],vis[M],cnt,g[][M*M>>];
void Solve(int now){
if(!now)return;
for(int i=;i<=now;i++)
if(f[now-][x-i+]<k)k-=f[now-][x-i+];
else{ans[now]=a[i],x=x-i+,vis[a[i]]=;
for(int j=,cnt=;j<=n;j++)if(!vis[j])a[++cnt]=j;
return (void)(Solve(now-));
}
}signed main(){
n=read(),k=read(),x=read();
for(int i=;i<=n;i++)a[i]=i,f[i][]=;
for(int i=;i<=n;i++){
for(int j=;j<=(i*i-i)/;j++)f[i][j]=min(inf,g[i&^][j+]-g[i&^][max(j-i+,0ll)]);
for(int j=;j<=(n*n-n)/;j++)g[i&][j+]=g[i&][j]+f[i][j];
}Solve(n);
for(int i=n;i>=;i--)writep(ans[i]);
return ;
}

[洛谷P3672]小清新签到题的更多相关文章

  1. 洛谷 P3672 小清新签到题 [DP 排列]

    传送门 题意:给定自然数n.k.x,你要求出第k小的长度为n的逆序对对数为x的1~n的排列 $n \le 300, k \le 10^13$ 一下子想到hzc讲过的DP 从小到大插入,后插入不会对前插 ...

  2. 洛谷 P3676 - 小清新数据结构题(动态点分治)

    洛谷题面传送门 题目名称好评(实在是太清新了呢) 首先考虑探究这个"换根操作"有什么性质.我们考虑在换根前后虽然每个点的子树会变,但整棵树的形态不会边,换句话说,割掉每条边后,得到 ...

  3. 洛谷P3676 小清新数据结构题 【树剖 + BIT】

    题目链接 洛谷P3676 题解 我们先维护\(1\)为根的答案,再考虑换根 一开始的答案可以\(O(n)\)计算出来 考虑修改,记\(s[u]\)表示\(u\)为根的子树的权值和 当\(u\)节点产生 ...

  4. 洛谷P3676 小清新数据结构题(动态点分治+树链剖分)

    传送门 感觉这题做下来心态有点崩……$RMQ$求$LCA$没有树剖快我可以理解为是常数太大……然而我明明用了自以为不会退化的点分然而为什么比会退化的点分跑得反而更慢啊啊啊啊~~~ 先膜一波zsy大佬 ...

  5. 洛谷 P3676 小清新数据结构题

    https://www.luogu.org/problemnew/show/P3676 这题被我当成动态dp去做了,码了4k,搞了一个换根的动态dp #include<cstdio> #i ...

  6. 洛谷P3676 小清新数据结构题 [动态点分治]

    传送门 思路 这思路好妙啊! 首先很多人都会想到推式子之后树链剖分+线段树,但这样不够优美,不喜欢. 脑洞大开想到这样一个式子: \[ \sum_{x} sum_x(All-sum_x) \] 其中\ ...

  7. 【刷题】洛谷 P3676 小清新数据结构题

    题目背景 本题时限2s,内存限制256M 题目描述 在很久很久以前,有一棵n个点的树,每个点有一个点权. 现在有q次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方 ...

  8. 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]

    传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...

  9. 洛谷P3674 小清新人渣的本愿

    题意:多次询问,区间内是否存在两个数,使得它们的和为x,差为x,积为x. n,m,V <= 100000 解: 毒瘤bitset...... 假如我们有询问区间的一个桶,那么我们就可以做到O(n ...

随机推荐

  1. NX二次开发-清除信息窗口中的内容,退出信息窗口UF_UI_exit_listing_window

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //打开信息窗口 UF_UI_open_listing_window() ...

  2. (转)Java安全通信:HTTPS与SSL

    转:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html 1. HTTPS概念 1)简介 HTTPS(全称:Hyperte ...

  3. 牛客多校第九场 D Knapsack Cryptosystem 背包

    题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...

  4. java.sql.SQLException: ORA-12704: 字符集不匹配

    INFO:HibernateSimpleDao----queryForListWithSql:SELECT site_id as id ,MAX(case attr_name when 'siteNa ...

  5. Java:关于main方法的10道面试题

    感觉假期过得好快,东西也丢得快. 假期吃喝玩乐之余也来温故一下Java知识,下面给大家整理了10道Java main方法的经典面试题,都来挑战一下自己的Java基础知识吧! 1.main方法是做什么用 ...

  6. MySQL 11章_索引、触发器

    一. 索引: . 为什么要使用索引: 一本书需要目录能快速定位到寻找的内容,同理,数据表中的数据很多时候也可以为他们创建相应的“目录”,称为索引,当创建索引后查询数据也会更加高效 . Mysql中的索 ...

  7. java 对象转Map方法Demo

    /** * 用于对Object进行解析并且转换成Map键值对的形式 * */ public class ObjectUtils { private static final String JAVAP ...

  8. 1分钟k线图能反映什么?(转)

    对于投资者特别是短线操作者来讲,应该重视1分钟K线图,但是并不是所有的股票都能通过1分钟K线图看出名堂来,比如一些小盘股,盘子较轻,很容易上蹿下跳.仅用1分钟K线图分析其上证指数,很难研判大盘当日的高 ...

  9. 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间(转)

    原文:https://blog.csdn.net/sxf_123456/article/details/81582964 from datetime import datetime,timedelta ...

  10. 学习 Apache FileMatchs 规则

    # 凡是匹配到 zip,gz,rar,box,log结尾的文件,进行下面的规则进行匹配 <filesmatch ".(zip|gz|rar|box|log)"> Ord ...