牛客练习赛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 ...
随机推荐
- mapStruct笔记
背景 mapStruct 是一个方便对象转换的工具,类似的工具还有 Dozer, BeanUtils. 实现 mapStruct的核心是在编译期生成基于转换规则的 Impl 文件,运行时直接调用 Im ...
- BOOST asio 例程daytime不使用库编译方法
在不使用lib库编译daytime client程序时,按照<Boost程序库完全开发指南>添加的定义 #define BOOST_REGEX_NO_LIB#define BOOST_DA ...
- ***js常用方法汇总(源自实际中的项目)
Q: 400-819-0717转8888,取后四位分机号 A: 方法一: alert("abcdefg".slice(-4));方法二:var str= "abcdefg ...
- codeforces 1041 d 二分
题意转化:有一些区间,要求选一些连续的区间.两两区间间隔的和要求小于H.要求区间的长度和尽可能长. 二分区间长度的和,check一下就行 #include <bits/stdc++.h> ...
- Maven安装和手动安装jar到仓库
1. 安装Maven 1.下载mvn到本地,解压. 2.新建系统变量MAVEN_HOME,值指向安装目录如D:\apache-maven-3.3.9 3.path变量中增加:%MAVEN_HOME%\ ...
- weblogic负载分发
博客分类: weblogic 负载均衡的实现方式有很多种,这里只介绍三种相对来说成本较低的方案(维护成本以及费用成本)weblogic自带的proxy.apache.nginx 1.weblogic自 ...
- ArcSDE数据库连接(直连、服务连)与GT_Geometry存
http://ziliao1.com/Article/Show/48126AB1A8F563D35E3D0345677C906B 众说周知,ArcSDE空间数据库引擎提供了两种连接数据库的方式.一是服 ...
- FPGA第一篇:SRAM工作原理
一.SRAM概述 SRAM主要用于二级快速缓存(Level2 C ache). 它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在同样面积中SRAM的容量要比其它类型的内存小. 大部分FP ...
- 基于UDP的通讯
XX:那飘过的100~_~{2014/10/03 10:57} UDP是一种面向非连接SOCK_DGRAM,提供无连接服务.数据包以独立包形式发送,不提供无措保证,数据能够丢失或反复. UDP的Ser ...
- python的线程thread笔记
python的线程是用thread和threading来实现的.其中利用threading会更好,因为thread没有线程保护,当主线程退出了之后,子线程也会被强行退出.threading支持守护线程 ...