题目连接:hdu_5085_Counting problem

题意:给你一个计算公式,然后给你一个区间,问这个区间内满足条件的数有多少个

题解:由于这个公式比较特殊,具有可加性,我们考虑讲一个数分为两个部分,这样就可以用莫队的思想均摊时间复杂度,将9位数分为一个4位和一个5位,这里我感觉sqr为10000 速度比较快。然后如果b小于sqr,那么直接暴力就行,如果b大于sqr,那么我们要把a和b都分为头部和尾部(注意是闭区间,a需要减1),如果a小于sqr,那么他的头部就为0,然后计算0-a的尾部,并将相应的值插入Hash表,然后计算以a头部开头满足条件的数,记为reta,同理,计算0-b的尾部,记为retb,如果b尾小于a尾,就要先计算b再计算a,然后将0到sqr-1的数对应的值也全部插入Hash表,然后从a的头到b的头,寻找对应的值,这里要用一下容斥定理,retb-reta就是从[a,b]之间满条件的数的个数.

 1 #include<cstdio>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 typedef long long LL;
 4
 5 const LL M=(1<<20)-1,N=1e5+7,sqr=1e4;
 6 LL K,a,b,ahd,bhd,bt,at,reta,retb,T,S,dt[10][16];
 7 inline LL pow(LL x,LL k){
 8     LL an=1;
 9     while(k){
10         if(k&1)an*=x;
11         k>>=1,x*=x;
12     }
13     return an;
14 }
15 //------------Hash table------------------------
16 struct E{LL key;LL cnt;E *nxt;}*g[M+1],pool[N],*cur=pool,*p;LL vis[M+1];
17 void init_Hash(){T++,cur=pool;}
18 inline void ins(LL key){
19     if(key>S)return;
20     LL u=key&M;
21     if(vis[u]<T)vis[u]=T,g[u]=NULL;
22     for(p=g[u];p;p=p->nxt)if(p->key==key){p->cnt++;return;}
23     p=cur++,p->key=key,p->cnt=1,p->nxt=g[u],g[u]=p;
24 }
25
26 inline LL ask(LL key){
27     if(key<0)return 0;
28     LL u=key&M;
29     if(vis[u]<T)return 0;
30     for(p=g[u];p;p=p->nxt)if(p->key==key)return p->cnt;
31     return 0;
32 }
33 //----------------------------------------------
34 inline LL cal(LL x){
35     LL an=0;
36     while(x)an+=dt[x%10][K],x/=10;
37     return an;
38 }
39 void init(){F(i,0,9)F(j,1,15)dt[i][j]=pow(i,j);}
40 int main(){
41     init();
42     while(~scanf("%lld%lld%lld%lld",&a,&b,&K,&S)){
43         init_Hash();
44         ahd=(a-1)/sqr,bhd=b/sqr,at=(a-1)%sqr,bt=b%sqr;
45         if(at<bt){
46         F(i,0,at)ins(cal(i));
47         reta=ask(S-cal(ahd));
48         F(i,at+1,bt)ins(cal(i));
49         retb=ask(S-cal(bhd));
50         F(i,bt+1,sqr-1)ins(cal(i));
51     }else{
52         F(i,0,bt)ins(cal(i));
53         retb=ask(S-cal(bhd));
54         F(i,bt+1,at)ins(cal(i));
55         reta=ask(S-cal(ahd));
56         F(i,at+1,sqr-1)ins(cal(i));
57     }
58     F(i,ahd,bhd-1)retb+=ask(S-cal(i));
59     printf("%lld\n",retb-reta);
60     }
61     return 0;
62 }

View Code

转载于:https://www.cnblogs.com/bin-gege/p/5696092.html

hdu_5085_Counting problem(莫队分块思想)相关推荐

  1. P4137-Rmq Problem/mex【莫队,分块】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4137 题目大意 求区间mex. 解题思路 开始发现aia_iai​ ...

  2. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  3. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  4. bzoj4564: [Haoi2016]地图 仙人掌的圆方树 莫队 分块

    bzoj4564: [Haoi2016]地图 Description 一天rin来到了一个遥远的都市.这个都市有n个建筑,编号从1到n,其中市中心编号为1,这个都市有m条双向通 行的街道,每条街道连接 ...

  5. P3180-[HAOI2016]地图【圆方树,莫队,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 nnn个点mmm条边的一个仙人掌,有点权. QQQ次询问给出op,x,yop,x,yop,x,y ...

  6. P4867-Gty的二逼妹子序列【平衡结合,莫队,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P4867 题目大意 一个序列要求支持询问一个区间[l,r][l,r][l,r]内在[a,b][a,b][a,b]之间 ...

  7. 2021HDU多校第一场 zoto(莫队+分块)

    题意: 给你一个序列,q次询问,每次询问l-r的区间内数字大小为x-y之间内不重复的个,保证数据所有大小为1e5以内. 思路: 比赛的时候通过调整了一下分块的大小和各种优化,用莫队把题目给卡过去了,实 ...

  8. bzoj3920: Yuuna的礼物(莫队+分块套分块)

    思路挺简单的,但是总感觉好难写...码力还是差劲,最后写出来也挺丑的 这题显然是个莫队题,考虑怎么转移和询问... 根据莫队修改多查询少的特点,一般用修改快查询慢的分块来维护.查第$k_1$小的出现次 ...

  9. 牛客挑战赛48E-速度即转发【带修莫队,分块】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列,mmm个操作. 给出l,r,kl,r,kl,r,k,求一个 ...

最新文章

  1. 在ubuntu14.04 64位虚拟机中安装mysql
  2. java图片16帧动画_Java实现帧动画的实例代码
  3. 成人高考计算机考试技巧,备战2015年成人高考:计算机基础考试经验分享
  4. Windows环境下配置php的curl扩展
  5. FastClick使用之trigger触发click失效
  6. WPF 实现ScrollViewer的垂直偏移滚动跳转
  7. java语言 编译原理_【Java学习】深入分析Java的编译原理
  8. gradle构建springboot项目瘦身,外部依赖jar的终极方法
  9. 理解promise、async 和await之间的执行关系
  10. php运行环境出现Undefined index 或variable时解决方法
  11. android 中如何监听按键的长按事件
  12. Android游戏开发
  13. 《算法》第四版官网库及数据文件
  14. 手机上有哪些不错的c语言编程软件?
  15. HTMLParser错误解决
  16. ios frame和bounds区别
  17. Android 返回键监听
  18. cura切片操作学习
  19. java群侠传_梦幻群侠传之天剑如虹(下)
  20. 使用DISM启用或禁用Windows功能

热门文章

  1. php+mysql+pdo连接数据库
  2. Ceph的架构(一)
  3. 存储IOPS参数结合实例详解
  4. setContentView( )方法
  5. modnet是一个无需绿幕,扣人像,笔记本上跑到10-20帧
  6. 什么是formal method的invarient
  7. 作为本科大学生比较适合的水准比较好的,嵌入式软件系统的会议
  8. macos怎么pdf转换成word,妈妈再也不用担心我的mac了
  9. 发现一个骨灰级图形学大神的博客
  10. AnimatorController即动画控制器创建的BUG