博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spoj1182Sorted bit squence
阅读量:5788 次
发布时间:2019-06-18

本文共 1721 字,大约阅读时间需要 5 分钟。

数位DP + 二分

 

1 #include 
2 #include
3 #include
4 using namespace std; 5 int n,m,k,f[33][33]; 6 void init() 7 { 8 f[0][0]=1; 9 for(int i=1;i<=32;i++)10 {11 f[i][0]=f[i-1][0];12 for(int j=1;j<=i;j++) f[i][j]=f[i-1][j-1]+f[i-1][j];13 }14 }15 int cal(int x,int k)16 {17 int sum=0,tot=0,pos=0;18 int bit[33];19 memset(bit,0,sizeof(bit));20 while(x)21 {22 bit[++pos]=x%2;23 x/=2;24 }25 for(int i=pos;i>=1;i--)26 {27 if(!bit[i]) continue;28 sum+=f[i-1][k-tot];29 tot++;30 if(tot>=k) break;31 }32 if(tot==k) sum++;33 return sum;34 }35 int fnd(int l,int r,int k)36 {37 int i,num;38 for(i=1;i<=31;i++)39 {40 num=cal(r,i)-cal(l-1,i);41 if(num>=k) break;42 else k-=num;43 }44 int tmp=l;45 while(l<=r)46 {47 int mid=l+(r-l)/2;48 num=cal(mid,i)-cal(tmp-1,i);49 if(num>=k) r=mid-1;50 else l=mid+1;51 }52 return l;53 }54 int main()55 {56 // freopen("cin.txt","r",stdin);57 int t;58 init();59 scanf("%d",&t);60 while(t--)61 {62 scanf("%d%d%d",&m,&n,&k);63 if(m<0)64 {65 m&=~(1<<31);66 if(n==0)67 {68 n--;69 k--;70 }71 n&=~(1<<31);72 // printf("m=%d n=%d\n",m,n);73 printf("%d\n",(1<<31)|fnd(m,n,k));74 }75 else76 {77 if(m==0) k--,m++;78 printf("%d\n",fnd(m,n,k));79 }80 }81 return 0;82 }

 

转载于:https://www.cnblogs.com/third2333/p/7617860.html

你可能感兴趣的文章
MVC模式利用xib文件定制collectionCell
查看>>
(六)Oracle学习笔记—— 约束
查看>>
【SQL】查询数据库中某个字段有重复值出现的信息
查看>>
mysql 行转列 列转行
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Open Graph Protocol(开放内容协议)
查看>>
模块化(1):基本思路
查看>>
Ubuntu18.04中配置QT5.11开发环境
查看>>
Exception的妙用
查看>>
基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!
查看>>
JavaScript(五):变量的作用域
查看>>
知识图谱在互联网金融中的应用
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
wpf 自定义窗口,最大化时覆盖任务栏解决方案
查看>>
【docker】关于docker 中 镜像、容器的关系理解
查看>>
information_schema系列五(表,触发器,视图,存储过程和函数)
查看>>
瓜子二手车的谎言!
查看>>
[转]使用Git Submodule管理子模块
查看>>