https://www.luogu.org/problemnew/show/P3672

题目见上面。

参考:https://www.cnblogs.com/candy99/p/6582699.html

讲真我最开始真不知道求方案数有什么用。

f[i][j]表示i个数j个逆序对有多少种方案。

显然我们有f[i][j]=f[i-1][j]+f[i-1][j-1]+……+f[i-1][j-i+1]

(就相当于给一个比序列中所有数都大的数,让你往里插。)

于是令s[i][j]为前缀和,优化成f[i][j]=s[i-1][j]-s[i-1][j-i]。

同时注意f数组可能爆longlong,但是因为k<=1e13所以没必要那么多方案,当f[i][j]>k的时候统一换成INF就行。

然后我们枚举每一位可以放什么数,统计放这个数所造成的贡献c,以及之前可以放的数(但因为达不到k而被放弃)的方案数tmp。

则当f[i-1][x-c]+tmp>=k的时候就可以放这个数了。

#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=305;
inline ll read(){ll X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
int ans[N],vis[N];
ll f[N][N*N/2],s[N][N*N/2];
int main(){int n=read();ll k=read();int x=read();f[0][0]=1;for(int i=0;i<=x;i++)s[0][i]=1;for(int i=1;i<=n;i++){for(int j=0;j<=x;j++){int l=max(0,j-i+1),r=j;ll tmp=(!l)?s[i-1][r]:s[i-1][r]-s[i-1][l-1];f[i][j]=min(tmp,k+1);s[i][j]=f[i][j]+(j?s[i][j-1]:0);}}for(int i=n;i>=1;i--){ll tmp=0;for(int j=1;j<=n;j++){if(!vis[j]){int c=j-1;for(int l=1;l<j;l++)c-=vis[l];if(f[i-1][x-c]+tmp>=k){ans[n-i+1]=j;vis[j]=1;x-=c;k-=tmp;break;}tmp+=f[i-1][x-c];}}}for(int i=1;i<=n;i++)printf("%d ",ans[i]);puts("");return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9103900.html

洛谷3672:小清新签到题——题解相关推荐

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

    题面在这里>>> 解题思路: 开始写了个LCT后来发现是错的QAQ 正解是动态点分治. 对于一个点,其答案就是$\sum_{i=1}^{n}sum_{i}^{2}$ 很神奇地构造出这 ...

  2. [洛谷P3674]小清新人渣的本愿

    题目传送门 这道题是一道莫队题.对于每一种问法,就是查询对应的数是否在当前的区间内. 设$b[i]$表示莫队当前区间中有没有$i$这个数. 对于第一问"是否可以选出两个数它们的差为x&quo ...

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

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

  4. 洛谷 P3674 小清新人渣的本愿 bitset+莫队

    题目: https://www.luogu.org/problemnew/show/P3674 题目大意: 给你一个长度为 N N N的序列,每次询问[l,r]能不能取出两个数,和或差或积等于C&qu ...

  5. 洛谷 P3674 小清新人渣的本愿(莫队 +bitset)

    我们利用一个长度为 1e5 的 bitset,当数值 c 出现时,将 c 位置赋值为 1,对于题目要求的操作可以转变为 求 bitset 中存在两个位置相差为 x 的 1 这个比较难,如下图 bits ...

  6. 2017提高组D1T1 洛谷P3951 小凯的疑惑

    洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...

  7. 洛谷 P2186 小Z的栈函数

    洛谷 P2186 小Z的栈函数 题目 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. I ...

  8. 洛谷P5633 最小度限制生成树 题解

    洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...

  9. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

最新文章

  1. 论文笔记 Medical Entity Linking using Triplet Network
  2. ffmpeg 怎么处理udp音频_STREAM: srs 2.0release,ffmpeg实时转码udp流,出现只有音频没有视频的问题?...
  3. 利用Spring的ApplicationEvent执行自定义方法
  4. c++新特性11 (6) =default
  5. php追加记录到文件行首的办法
  6. extjs 基础部分
  7. python—os模块、时间模块
  8. Oracle取同一类别中某属性最大或者最小值的一条
  9. label里面的文字换行_如何在JLabel中自动换行文本?
  10. html table导出到Excel中,走后台保存文件,js并调用另保存
  11. c语言实验 正弦csdn,实验2 正弦波振荡器(LC振荡器和晶体振荡器)
  12. 2015年度夏季假期学习内容
  13. 嵌入式记录2——Kame四足巡线机器人
  14. 完美解决LION下HD3000的花屏,横线,死机问题
  15. 电容器的 ESR 参数
  16. U盘chk文件该怎样用EasyRecovery恢复
  17. C++计算四则表达式的模板
  18. 复合赋值运算符“+=、-=、*=、/=、%=”详解
  19. 电路课组(一)电路原理 Part 2 求解电路的一般方法(2) 基尔霍夫定律和2b法
  20. STM32单片机(1) 总记 学习资料+参考手册+LED灯

热门文章

  1. 实习小白::(转) cocos2d-x使用cocosStudio编辑的动画文件
  2. DevExpress中XtraGrid控件对GridView每行的颜色设置 zt
  3. 《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
  4. iphone开发我的新浪微博客户端-用户登录账号删除篇(1.6)
  5. js实现treeview 级联修改状态
  6. Docker加入裁员大军,关键时期Docker将何去何从?
  7. 2018-03-28 Linux学习
  8. 【HDU - 4345 】Permutation(DP)
  9. Kafka+Log4j实现日志集中管理
  10. [C#][控件]列表控件listbox(一)