国家队论文第二题 浅谈数位类统计问题 spoj 1182

刚开始的时候有点想法,但是没有具体,主要是一开始题目看错了,认为给的这一段区间可能包含了正数和负数,该打,题目都可以看错,一直以来的经验教训都没有吸取。

代码中去掉最高位的方法还是相当的不错的,至于以后二进制的变形,应该都可以参考这其中的技巧。

代码:

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 typedef long long LL;
 6 int const N = 40;
 7 int f[N][N],n,m,k;
 8 void pre()
 9 {
10      f[0][0]=1;
11      for(int i=1;i<=31;i++)
12      {
13          f[i][0]=f[i-1][0];
14          for(int j=1;j<=i;j++)
15              f[i][j]=f[i-1][j]+f[i-1][j-1];
16      }
17 }
18 int getsum(int x,int k)
19 {
20     int tot=0,ret=0;
21     for(int i=31;i>0;i--)
22     {
23         if(x&(1<<i))
24         {
25            tot++;
26            if(tot>k)break;
27            x^=(1<<i);
28         }
29         if((1<<i-1)<=x)
30            ret+=f[i-1][k-tot];
31     }
32     if(tot+x==k)ret++;
33     return ret;
34 }
35 int cal(int l,int r,int k)
36 {
37     int i;
38     for(i=1;i<=31;i++)
39     {
40         int co=getsum(r,i)-getsum(l-1,i);
41         if(co>k)break;
42         k-=co;
43     }
44 
45     int lf=l,rt=r,mid;
46     while(lf<rt)
47     {
48           mid=(int)(((LL)lf+(LL)rt)>>1);
49           int co=getsum(mid,i)-getsum(l-1,i);
50           if(co<k)
51              lf=mid+1;
52           else
53              rt=mid;
54     }
55     return lf;
56 }
57 int main()
58 {
59     int T;
60     scanf("%d",&T);
61     pre();
62     while(T--)
63     {
64          scanf("%d %d %d",&m,&n,&k);
65          if(n==0&&m==0)
66          {
67             printf("0\n");
68             continue;
69          }
70          if(m>=0)
71          {
72             if(m==0)
73                k--,m++;
74             if(k==0)
75                printf("0\n");
76             else
77                printf("%d\n",cal(m,n,k));
78          }
79          else
80          {
81             if(n==0)
82                k--,n--;
83             m&=(~(1<<31));
84             n&=(~(1<<31));
85             printf("%d\n",(1<<31)|cal(m,n,k));
86          }
87     }
88     return 0;
89 }

 

转载于:https://www.cnblogs.com/nuoyan2010/archive/2013/04/25/3042820.html

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值