臭名昭著的巧合:CF750G

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

题解传送门

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

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

参考代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=52; inline LL calcS(LL a,LL b) {
LL lca=a,tmp=b,sum=0;
int la=log2(a),lb=log2(b);
for(int i=la; i<lb; ++i) tmp>>=1;
for(int i=lb; i<la; ++i) lca>>=1;
while(tmp!=lca) tmp>>=1,lca>>=1;
int LLCA=log2(lca);
if(a==lca&&b==lca) return lca;
if(a==lca||b==lca) {
if(b==lca) a^=b^=a^=b,la^=lb^=la^=lb;
sum=lca*((1LL<<(lb-LLCA+1))-1);
for(int i=1; b>lca; ++i,b>>=1) sum+=(b&1)*((1LL<<i)-1);
} else {
if((a>>(la-LLCA-1))&1) a^=b^=a^=b,la^=lb^=la^=lb;
sum=lca*((1LL<<(la-LLCA+1))+(1LL<<(lb-LLCA+1))-3)+(1LL<<(lb-LLCA))-1;
lca=lca<<1|1;
for(int i=1; a>lca; ++i,a>>=1) sum+=(a&1)*((1LL<<i)-1);
for(int i=1; b>lca; ++i,b>>=1) sum+=(b&1)*((1LL<<i)-1);
}
return sum;
}
LL P[N]={1},f[N][N*2][2];
inline LL calcP(LL S,int d) {
LL ans=0;
int L=min((int)log2(S+1),d);
for(int h=1; h<=L; ++h) {
LL x=S/(P[h]-1);
if(h+(int)log2(x)>d) continue;
x=S%(P[h]-1);
for(int i=h; i; --i) if(x>=P[i]-1) x-=P[i]-1;
ans+=(!x);
}
for(int h0=1; h0<L; ++h0)
for(int h1=1; S+1-P[h1]>=P[h0+1]+P[h1+1]-3; ++h1) {
LL x=(S+1-P[h1])/(P[h0+1]+P[h1+1]-3);
LL r=(S+1-P[h1])%(P[h0+1]+P[h1+1]-3);
if(max(h0,h1)+1+(int)log2(x)>d) continue;
if(!r) {ans++; continue;}
if(h0==1&&h1==1) {ans+=(S==x*5+1); continue;}
for(int n=1; n<=h0+h1; ++n) {
LL C=r+n,L=log2(C);
if(C&1) continue;
memset(f[0],0,sizeof f[0]);
f[0][0][0]=1;
for(int i=1; i<=L; ++i) {
int d=(C>>i)&1;
memset(f[i],0,sizeof f[i]);
for(int j=0; j<=i+i-2&&j<=n; ++j)
for(int k=0; k<2; ++k) if(f[i-1][j][k])
for(int x=0; x<2; ++x) if(!x||i<h0)
for(int y=0; y<2; ++y) if(!y||i<h1)
if(((k+x+y)&1)==d) f[i][j+x+y][(k+x+y)>>1]+=f[i-1][j][k];
}
ans+=f[L][n][0];
}
}
return ans;
} int main() {
int T;
scanf("%d",&T);
for(int i=1; i<N; ++i) P[i]=P[i-1]<<1;
for(LL c,a,b,d; T--; ) {
scanf("%lld%lld%lld%lld",&d,&a,&b,&c);
if(c==1) printf("%lld\n",calcS(a,b));
else printf("%lld\n",calcP(calcS(a,b),d)-1);
}
return 0;
}

[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. iview响应式布局

    我想说,我要被逼成前端了. 之前没接触过响应式,这两天和另一位前端程序媛小小的研究了下.做了一个小例子,记录一下,方便以后使用. <template> <div> <Ro ...

  2. QT5线程关闭

    QT5线程关闭 QThread析构函数的说明:请注意,删除一个QThread对象不会停止它管理的线程的执行. 删除正在运行的QThread(即isFinished()返回false)将导致程序崩溃. ...

  3. Nowcoder 练习赛 17 C 操作数 ( k次前缀和、矩阵快速幂打表找规律、组合数 )

    题目链接 题意 :  给定长度为n的数组a,定义一次操作为: 1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007: 2. ...

  4. Android_(传感器)指南针

    Android方向传感器 传感器中的X:如上图所示,规定X正半轴为北,手机头部指向OF方向,此时X的值为0,如果手机头部指向OG方向,此时X值为90,指向OH方向,X值为180,指向OE,X值为270 ...

  5. C++入门经典-例4.11-名称空间的定义和使用

    1:名称空间,也成为名字空间.命名空间,关键字为namespace.我们经常使用这样一条语句: using namespace std: 我们要使用标准输入输出流,除了包含它们所在的头文件外,还必须使 ...

  6. ES6 变量的结构赋值用途(实用技巧)

    1.交换变量的值 let x=1; let y=2; [x,y]=[y,x];//x=2,y=1 2.从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象里返回,有了解构 ...

  7. LeetCode 79. 单词搜索(Word Search)

    题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...

  8. 异步上传&预览图片-压缩图片

    移动端普及的时代,流量是用户最关心的,手机拍出来的照片基本上都在1~2M以上,这样上传会非常耗流量,影响用户体验,此例能在保证清晰度的情况下,将4.5M的图片压缩为30K <!DOCTYPE h ...

  9. DeepFaceLab参数详解之FPS与Image format

    DeepFaceLab参数详解之FPS与Image format , 本文讲解两个非常简单的参数,也是大家玩这个软件最先接触到的.参数虽然非常的简单,但是非常有用,适当调整可以为你节省大量硬盘空间,大 ...

  10. navivate 下载

    https://www.jianshu.com/p/5f693b4c9468?mType=Group