牛客练习赛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 ...
随机推荐
- Flask--Config研究
导入Flask框架后,在项目跟目录下面会有一个Config.py 文件,里面的默认内容为: class Config(object): pass 可以这Config 类里面定义变量和其他对象 如: c ...
- [Tyvj1939] 玉蟾宫(单调栈)
传送门 题目 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写 ...
- 巴蜀4384 -- 【模拟试题】作诗(Poetize)
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
- 通过复制现有的redhat虚拟机的文件,实现在VMWare8.0上重建一个新的redhat虚拟机环境
1.将需要复制的redhat虚拟机的文件都存放在一个新的文件夹redhat下,因为虚拟机很大,所以复制可能花费较长的时间. 2.复制完成后,打开VMWare,选择“Open a Virtual Mac ...
- 51nod 马拉松30 C(构二分图+状压dp)
题意 分析 考虑一个图能被若干简单环覆盖,那么一定是每个点恰好一个出度,恰好一个出度 于是类似最小路径覆盖的处理,我们可以把每个点拆成2个点i和i',如果有一条边(i,j),那么将i和j'连起来 那么 ...
- OO第三单元总结--根据JML写代码
一. JML语言 1. 理论基础 首先,JML不是JAVA的一部分,它是一群研究者为JAVA设计的扩展部分,但还没有得到官方的支持.因此,JAVA编译器并不支持JML,所以要想JML起作用,只能采用类 ...
- ArrayList和LinkedList区别(蚂蚁金服面试题)
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 2. 底层数据结构: Arraylist 底层使用的是Object数组:LinkedLis ...
- Spring Data JPA 入门篇
Spring Data JPA是什么 它是Spring基于ORM框架(如hibernate,Mybatis等).JPA规范(Java Persistence API)封装的一套 JPA应用框架,可使开 ...
- 页面跳转到顶部---bug修改
今天遇到一个很诡异的bug 某元素的html结构是: <div id="aa"> <span>诡异的bug</span> </div> ...
- vue-alioss-组件封装
<template> <div class="vui_alioss_upload"> <div @click="uloadImg()&quo ...