牛客练习赛13D:幸运数字Ⅳ(康托展开) F:关键字排序
链接:https://www.nowcoder.com/acm/contest/70/D
比如说,47、744、4都是幸运数字而5、17、467都不是。
现在想知道在1...n的第k小的排列中,有多少个幸运数字所在的位置的序号也是幸运数字。
输入描述:
第一行两个整数n,k。
1 <= n,k <= 1000,000,000
输出描述:
一个数字表示答案。
如果n没有k个排列,输出-1。
输入例子:
7 4
输出例子:
1
-->
输入
7 4
输出
1
说明
1 2 3 4 6 7 5
输入
4 7
输出
1
说明
2 1 3 4
思路:13以内暴力,13以后的可以保证前面N-13为的排列是1,2....N-13,然后暴力后面13位。
(应该可以统一起来)。
当时由于一些细节问题,wa了很多次。导致最后面那个水题没有搞定。
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int inf=;
ll p[];int num[],ans;
int vis[],t1,t2,cnt,tot=,N,K;
ll a[],cnt2;
void dfs(ll sum)
{
a[++cnt2]=sum;
if(sum>inf) return ;
dfs(sum*+);
dfs(sum*+);
}
void Work(int n,int m)
{
t2=m-;t1=;
memset(vis,,sizeof(vis));
int k=;
for(int i=;i<=n;i++){
t1=t2/p[n-i];
t2=t2%p[n-i];
cnt=;
for(int j=k;j<=n;j++)
if(!vis[j]){
cnt++;
if(cnt==t1+){
vis[j]=;
num[++tot]=j;
break;
}
}
}
for(int i=;i<=n;i++){
bool Flag1=false,Flag2=false;int pos;
pos=lower_bound(a+,a+cnt2+,num[i])-a;
if(num[i]==a[pos]) Flag1=true;
pos=lower_bound(a+,a+cnt2+,i)-a;
if(i==a[pos]) Flag2=true;
if(Flag1&&Flag2) ans++;
}
}
void Work2(int n,int m)
{
t2=m-;t1=;
memset(vis,,sizeof(vis));
int k=;
for(int i=;i<=n;i++){
t1=t2/p[n-i];
t2=t2%p[n-i];
cnt=;
for(int j=k;j<=n;j++)
if(!vis[j]){
cnt++;
if(cnt==t1+){
vis[j]=;
num[++tot]=j;
break;
}
}
}
//for(int i=1;i<=13;i++) num[i]+=N-13;
//for(int i=1;i<=n;i++) cout<<N-13+i<<" "<<num[i]+N-13<<endl;
for(int i=;i<=;i++){
bool Flag1=false,Flag2=false;int pos;
pos=lower_bound(a+,a+cnt2+,num[i]+N-)-a;
if(num[i]+N-==a[pos]) Flag1=true;
pos=lower_bound(a+,a+cnt2+,i+N-)-a;
if(i+N-==a[pos]) Flag2=true;
if(Flag1&&Flag2) ans++;
}
}
int main()
{
dfs();
sort(a+,a+cnt2+);
p[]=; p[]=; for(int i=;i<=;i++) p[i]=p[i-]*i;
scanf("%d%d",&N,&K);
if(N<=){
if(K>p[N]) printf("-1\n");
else{
Work(N,K);
printf("%d\n",ans);
}
}
else {
for(int i=;i<=cnt2;i++) if(a[i]<=N-) ans++;
Work2(,K);
printf("%d\n",ans);
}
return ;
}
F题:8个方向分别排序即可,一共10种情况,比赛的时候写到8就没时间了,可能也就两三分钟的事情,GG。
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int ans[maxn+],num[],cnt,M,N;
struct in
{
int x; int y; int op; int id;
in(){}
in(int xx,int yy,int oo,int ii):x(xx),y(yy),op(oo),id(ii){}
};
in xx[maxn+];
vector<in>s[maxn+];
bool cmp1(in a,in b){
return a.op>b.op;
}
bool cmp2(in a,in b){
return a.op<b.op;
}
void solve1()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].y,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve2()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].y,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve3()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve4()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve5()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y+xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve6()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
s[xx[i].y+xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve7()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
if(xx[i].y>=xx[i].x) s[xx[i].y-xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve8()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
if(xx[i].y>=xx[i].x) s[xx[i].y-xx[i].x].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve9()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
if(xx[i].y<xx[i].x) s[xx[i].x-xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp1);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
void solve10()
{
for(int i=;i<=M;i++) s[i].clear();
for(int i=;i<=N;i++) {
if(xx[i].y<xx[i].x) s[xx[i].x-xx[i].y].push_back(in(xx[i].x,xx[i].y,xx[i].x,xx[i].id));
}
for(int i=;i<=M;i++) {
sort(s[i].begin(),s[i].end(),cmp2);
for(int j=;j<s[i].size();j++){
ans[s[i][j].id]++;
}
}
}
int main()
{
scanf("%d%d",&M,&N);
M=M*+;
for(int i=;i<=N;i++){
xx[i].id=i;
scanf("%d%d",&xx[i].x,&xx[i].y);
}
solve1();
solve2();
solve3();
solve4();
solve5();
solve6();
solve7();
solve8();
solve9();
solve10();
for(int i=;i<=N;i++) num[ans[i]]++;
for(int i=;i<;i++) cout<<num[i]<<" ";
cout<<num[]<<endl;
return ;
}
牛客练习赛13D:幸运数字Ⅳ(康托展开) F:关键字排序的更多相关文章
- 牛客练习赛13D 幸运数字4
		
题目链接:https://ac.nowcoder.com/acm/contest/70/D 题目大意: 略 分析: 注意到12! < 10^9 < 13!,于是当n > 13时,第k ...
 - 牛客练习赛13B 幸运数字2
		
题目链接:https://ac.nowcoder.com/acm/contest/70/B 题目大意: 略 分析: 先DFS求出所有幸运数,然后暴力即可 代码如下: #pragma GCC optim ...
 - 牛客练习赛13D
		
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7.比如说,47.744.4都是幸运数字而5.17.467都不是.现在想知道在1...n的第k小的排列(permutation,https://en ...
 - 牛客提高D2t2 幸运数字考试
		
分析 预处理出所有合法数字 然后直接lower_bound查询即可 代码 #include<iostream> #include<cstdio> #include<cst ...
 - 牛客练习赛48 C  小w的糖果 (数学,多项式,差分)
		
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
 - 牛客练习赛48 A· 小w的a+b问题  (贪心,构造,二进制)
		
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
 - 牛客练习赛53  D 德育分博弈政治课 (思维建图,最大流)
		
牛客练习赛53 D德育分博弈政治课 链接:https://ac.nowcoder.com/acm/contest/1114/D来源:牛客网 题目描述 德育分学长最近玩起了骰子.他玩的骰子不同,他的骰子 ...
 - 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
		
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
 - 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
		
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
 
随机推荐
- 最小生成树求法  Prim + Kruskal
			
prim算法的思路 和dijkstra是一样的 每次选取一个最近的点 然后去向新的节点扩张 注意这里的扩张 不再是 以前求最短路时候的到新的节点的最短距离 而是因为要生成一棵树 所以是要连一根最短的连 ...
 - 创建SSH keys
			
1.检查是否已经有SSH Key存在 windows: type "%userprofile%\.ssh\id_rsa.pub" Linux: cat ~/.ssh/id_rsa. ...
 - Lca 之倍增算法
			
引入: 比如说要找树上任意两个点的路上的最大值.如果是一般的做法 会 接近o(n)的搜,从一个点搜到另一个点,但是如果询问多了复杂度就很高了. 然后我们会预处理.预处理是o(n²)的,询问是o(1)的 ...
 - BZOJ4555求和(cdq分治+NTT)
			
题意: 输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果.1 ≤ n ≤ 100000 其中S(i,j)是第二类Stirling数,即有i个球,丢到j个盒子中,要求盒子不 ...
 - freeswitch三方通话配置
			
此种方法能实现,其中默认转移后按0,可进入三方通话. 用transfer只能实现代接转移. Misc. Dialplan Tools att xfer From FreeSWITCH Wiki Jum ...
 - Spring @Value用法
			
Spring 通过注解获取*.porperties文件的内容,除了xml配置外,还可以通过@value方式来获取. 使用方式必须在当前类使用@Component,xml文件内配置的是通过pakage扫 ...
 - redis connetced refused remote
			
239down vote I've been stuck with the same issue, and the preceding answer did not help me (albeit w ...
 - Android双列滑动表格(双表头不动)
			
※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...
 - 火狐浏览器Firefox 如何下载网页的SWF视频,硅谷动力的网站视频怎么下载
			
1 使用火狐浏览器查看到底视频在哪里,我随便开了一段视频,发现这个SWF(外框套了一个Control.swf,内层才是真实的09-class.swf) 2 我们从下面这一段代码中进行分析 < ...
 - Office WORD WPS如何设置PPT播放全屏
			
1 在设计-页面设置中,幻灯片大小改成自定义,高度和宽度如下图所示.(我个人的笔记本是15.6存的宽屏笔记本,你可以根据自己笔记本的比例修改宽度和高度的数据来或者不同的比例值),注意在HDMI的输出方 ...