牛客练习赛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 ...
随机推荐
- ORACLE备份、恢复、常用查询
--第一,启动服务,(如果数据库处于启动状态,那么略过这一步) 打开命令行执行以下语句 net start OracleServiceORCL net start OracleOraDb10g_ ...
- Speculative store buffer
A speculative store buffer is speculatively updated in response to speculative store memory operatio ...
- poj1376 bfs,机器人
开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的BFS即可,但是由于队列没有重判,一直爆队列(MLE!)下次一定要注意! (bfs第一次到达便最优?) #include&l ...
- oc温习五:字符串
/** substringFromIndex: --从第from位数 开始截取字符串 */ NSString *str = @"asdfghjkzxcbnm"; NSString ...
- BZOJ4555求和(cdq分治+NTT)
题意: 输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果.1 ≤ n ≤ 100000 其中S(i,j)是第二类Stirling数,即有i个球,丢到j个盒子中,要求盒子不 ...
- powerDigner使用
PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...
- flash update
https://get.adobe.com/cn/flashplayer/otherversions/
- OSX: 第三方部署Profile的方法和比較
眼下至少有三个第三方部署Profile的方法. 一个Profile Handler, 是利用Launchd对制定文件夹改变而激活的机制,把须要的profiles文件斗存放在制定目标机器的文件夹内,系统 ...
- C#中list比数组效率低多少
对于List,即长度不确定的数组而言,十万笔数据*12倍,就是120万笔数据,只需要93ms左右 换成了二维数组,效果也是差不多,78ms,可见list的效率只比double差一点点
- coco2d-js demo程序之滚动的小球
近期有一个游戏叫围住神经猫,报道说是使用html5技术来做的. html5的跨平台的优良特性非常不错.对于人手不足,技术不足,选用html5技术实现跨平台的梦想真是不错. 近期在看coco2d-js这 ...