臭名昭著的巧合:CF750G

题意:在无限深度的一颗线段树中询问编号和为S的简单路径条数。

题解传送门

这道题相当于在原来基础上多了询问两点间简单路径的编号的的问题。

直觉告诉我们只需要求出两点在线段树上的lca,然后套用上个问题中所推得的式子即可。而线段树上两点的lca的二进制表示正好是两点的二进制表示的lcp,这玩意儿瞎写即可。

参考代码

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int N=52;
  5. inline LL calcS(LL a,LL b) {
  6. LL lca=a,tmp=b,sum=0;
  7. int la=log2(a),lb=log2(b);
  8. for(int i=la; i<lb; ++i) tmp>>=1;
  9. for(int i=lb; i<la; ++i) lca>>=1;
  10. while(tmp!=lca) tmp>>=1,lca>>=1;
  11. int LLCA=log2(lca);
  12. if(a==lca&&b==lca) return lca;
  13. if(a==lca||b==lca) {
  14. if(b==lca) a^=b^=a^=b,la^=lb^=la^=lb;
  15. sum=lca*((1LL<<(lb-LLCA+1))-1);
  16. for(int i=1; b>lca; ++i,b>>=1) sum+=(b&1)*((1LL<<i)-1);
  17. } else {
  18. if((a>>(la-LLCA-1))&1) a^=b^=a^=b,la^=lb^=la^=lb;
  19. sum=lca*((1LL<<(la-LLCA+1))+(1LL<<(lb-LLCA+1))-3)+(1LL<<(lb-LLCA))-1;
  20. lca=lca<<1|1;
  21. for(int i=1; a>lca; ++i,a>>=1) sum+=(a&1)*((1LL<<i)-1);
  22. for(int i=1; b>lca; ++i,b>>=1) sum+=(b&1)*((1LL<<i)-1);
  23. }
  24. return sum;
  25. }
  26. LL P[N]={1},f[N][N*2][2];
  27. inline LL calcP(LL S,int d) {
  28. LL ans=0;
  29. int L=min((int)log2(S+1),d);
  30. for(int h=1; h<=L; ++h) {
  31. LL x=S/(P[h]-1);
  32. if(h+(int)log2(x)>d) continue;
  33. x=S%(P[h]-1);
  34. for(int i=h; i; --i) if(x>=P[i]-1) x-=P[i]-1;
  35. ans+=(!x);
  36. }
  37. for(int h0=1; h0<L; ++h0)
  38. for(int h1=1; S+1-P[h1]>=P[h0+1]+P[h1+1]-3; ++h1) {
  39. LL x=(S+1-P[h1])/(P[h0+1]+P[h1+1]-3);
  40. LL r=(S+1-P[h1])%(P[h0+1]+P[h1+1]-3);
  41. if(max(h0,h1)+1+(int)log2(x)>d) continue;
  42. if(!r) {ans++; continue;}
  43. if(h0==1&&h1==1) {ans+=(S==x*5+1); continue;}
  44. for(int n=1; n<=h0+h1; ++n) {
  45. LL C=r+n,L=log2(C);
  46. if(C&1) continue;
  47. memset(f[0],0,sizeof f[0]);
  48. f[0][0][0]=1;
  49. for(int i=1; i<=L; ++i) {
  50. int d=(C>>i)&1;
  51. memset(f[i],0,sizeof f[i]);
  52. for(int j=0; j<=i+i-2&&j<=n; ++j)
  53. for(int k=0; k<2; ++k) if(f[i-1][j][k])
  54. for(int x=0; x<2; ++x) if(!x||i<h0)
  55. for(int y=0; y<2; ++y) if(!y||i<h1)
  56. if(((k+x+y)&1)==d) f[i][j+x+y][(k+x+y)>>1]+=f[i-1][j][k];
  57. }
  58. ans+=f[L][n][0];
  59. }
  60. }
  61. return ans;
  62. }
  63. int main() {
  64. int T;
  65. scanf("%d",&T);
  66. for(int i=1; i<N; ++i) P[i]=P[i-1]<<1;
  67. for(LL c,a,b,d; T--; ) {
  68. scanf("%lld%lld%lld%lld",&d,&a,&b,&c);
  69. if(c==1) printf("%lld\n",calcS(a,b));
  70. else printf("%lld\n",calcP(calcS(a,b),d)-1);
  71. }
  72. return 0;
  73. }

[TJOI2019] 甲苯先生的线段树的更多相关文章

  1. luogu P5342 [TJOI2019]甲苯先生的线段树

    传送门 你个好好的省选怎么可以出CF原题啊,你们这个题害人不浅啊,这样子出题像极了cxk,说到cxk,我又想起了他是NBA形象大使,跟我是西游文化大使一样一样的,今年下半年... 别说了,jinsai ...

  2. 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树

    原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...

  3. [LOJ3109][TJOI2019]甲苯先生的线段树:DP

    分析 首先,请允许我 orz HN队长zsy.链接 我们发现树上的链有两种类,一类是直上直下的,一类不是直上直下的(废话).并且,如果我们确定了左侧和右侧的链的长度和整条链上所有节点的编号之和,那么这 ...

  4. p5342 [TJOI2019]甲苯先生的线段树

    分析  代码 #include<bits/stdc++.h> using namespace std; #define int long long ],yy[],cnt1,cnt2; ][ ...

  5. 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树

    LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...

  6. 洛谷P5338 [TJOI2019]甲苯先生的滚榜

    原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...

  7. 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...

  8. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  9. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

随机推荐

  1. Nowcoder Circulant Matrix ( FWT )

    题目链接 题意 : 给你一个a数组和b数组,构造出A[i][j]矩阵(A[i][j] = a[i xor j]) 给出等式 A * x = b ( mod p ) n等于4的时候有: A[0][0]* ...

  2. hihocoder周赛(树的最长距离)

    题目4 : 道路建设 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 H 国有 n 座城市和 n-1 条无向道路,保证每两座城市都可以通过道路互相到达.现在 H 国要开始 ...

  3. CDOJ 图论专题 A.不是图论 强连通分量+拓扑排序 经典

    题目链接  在其中纠错第一次wa代码 #include <cstdio> #include <cstring> #include <cstdlib> #includ ...

  4. C语言写数据库(一)

    /*** connect.c ***/ #include<stdio.h> #include<stdlib.h> #include"mysql.h" int ...

  5. Postman(二)、调试模式

    postman提供了一个调试模式,很方便我们写脚本以及断言 在脚本中用console.log()打印,到控制台查看 比如写入如下脚本: 点击Send后,在控制台可以看到如下信息

  6. mysql 日期转换sql函数

    mysql提供了两个函数: from_unixtime(time_stamp)   ->  将时间戳转换为日期 unix_timestamp(date)             ->  将 ...

  7. python学习之路(20)

    装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): print('2019.0519') >>> ...

  8. python学习之路(19)

    匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x) ...

  9. Zookeeper(二)数据模型

    Zookeeper数据模型ZNode 问题 ZK的数据模型ZNodes是什么样的: 树形结构,每个叶子节点都存储着数据,且可挂载子节点: 路径作为叶子节点名称,数据作为叶子节点内的数据: Znode可 ...

  10. DP练习题——洛谷P1970花匠

    目录 题目描述: 输入输出格式: 输入格式: 输出格式: 输入输出样例: 输入样例: 输出样例: 题目分析: 解法一: 解法二: 结语: 题目描述: 洛谷\(P1970\) 花匠栋栋种了一排花,每株花 ...