洛谷3672:小清新签到题——题解
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:小清新签到题——题解相关推荐
- 洛谷P3676 小清新数据结构题(动态点分治)
题面在这里>>> 解题思路: 开始写了个LCT后来发现是错的QAQ 正解是动态点分治. 对于一个点,其答案就是$\sum_{i=1}^{n}sum_{i}^{2}$ 很神奇地构造出这 ...
- [洛谷P3674]小清新人渣的本愿
题目传送门 这道题是一道莫队题.对于每一种问法,就是查询对应的数是否在当前的区间内. 设$b[i]$表示莫队当前区间中有没有$i$这个数. 对于第一问"是否可以选出两个数它们的差为x&quo ...
- 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]
传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...
- 洛谷 P3674 小清新人渣的本愿 bitset+莫队
题目: https://www.luogu.org/problemnew/show/P3674 题目大意: 给你一个长度为 N N N的序列,每次询问[l,r]能不能取出两个数,和或差或积等于C&qu ...
- 洛谷 P3674 小清新人渣的本愿(莫队 +bitset)
我们利用一个长度为 1e5 的 bitset,当数值 c 出现时,将 c 位置赋值为 1,对于题目要求的操作可以转变为 求 bitset 中存在两个位置相差为 x 的 1 这个比较难,如下图 bits ...
- 2017提高组D1T1 洛谷P3951 小凯的疑惑
洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...
- 洛谷 P2186 小Z的栈函数
洛谷 P2186 小Z的栈函数 题目 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. I ...
- 洛谷P5633 最小度限制生成树 题解
洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...
- 洛谷P2619 [国家集训队]Tree I 题解
洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...
最新文章
- 论文笔记 Medical Entity Linking using Triplet Network
- ffmpeg 怎么处理udp音频_STREAM: srs 2.0release,ffmpeg实时转码udp流,出现只有音频没有视频的问题?...
- 利用Spring的ApplicationEvent执行自定义方法
- c++新特性11 (6) =default
- php追加记录到文件行首的办法
- extjs 基础部分
- python—os模块、时间模块
- Oracle取同一类别中某属性最大或者最小值的一条
- label里面的文字换行_如何在JLabel中自动换行文本?
- html table导出到Excel中,走后台保存文件,js并调用另保存
- c语言实验 正弦csdn,实验2 正弦波振荡器(LC振荡器和晶体振荡器)
- 2015年度夏季假期学习内容
- 嵌入式记录2——Kame四足巡线机器人
- 完美解决LION下HD3000的花屏,横线,死机问题
- 电容器的 ESR 参数
- U盘chk文件该怎样用EasyRecovery恢复
- C++计算四则表达式的模板
- 复合赋值运算符“+=、-=、*=、/=、%=”详解
- 电路课组(一)电路原理 Part 2 求解电路的一般方法(2) 基尔霍夫定律和2b法
- STM32单片机(1) 总记 学习资料+参考手册+LED灯
热门文章
- 实习小白::(转) cocos2d-x使用cocosStudio编辑的动画文件
- DevExpress中XtraGrid控件对GridView每行的颜色设置 zt
- 《TCP/IP Sockets编程(C语言实现) (第2版)》 代码下载(链接以及文件打包)
- iphone开发我的新浪微博客户端-用户登录账号删除篇(1.6)
- js实现treeview 级联修改状态
- Docker加入裁员大军,关键时期Docker将何去何从?
- 2018-03-28 Linux学习
- 【HDU - 4345 】Permutation(DP)
- Kafka+Log4j实现日志集中管理
- [C#][控件]列表控件listbox(一)