[TJOI2019] 甲苯先生的线段树
臭名昭著的巧合: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] 甲苯先生的线段树的更多相关文章
- luogu P5342 [TJOI2019]甲苯先生的线段树
传送门 你个好好的省选怎么可以出CF原题啊,你们这个题害人不浅啊,这样子出题像极了cxk,说到cxk,我又想起了他是NBA形象大使,跟我是西游文化大使一样一样的,今年下半年... 别说了,jinsai ...
- 【题解】Luogu P5342 [TJOI2019]甲苯先生的线段树
原题传送门 挺有趣的一道题 \(c=1\),暴力求出点权和n即可 \(c=2\),先像\(c=1\)一样暴力求出点权和n,考虑有多少路径点权和也为n 考虑设x为路径的转折点,\(L\)为\(x\)向左 ...
- [LOJ3109][TJOI2019]甲苯先生的线段树:DP
分析 首先,请允许我 orz HN队长zsy.链接 我们发现树上的链有两种类,一类是直上直下的,一类不是直上直下的(废话).并且,如果我们确定了左侧和右侧的链的长度和整条链上所有节点的编号之和,那么这 ...
- p5342 [TJOI2019]甲苯先生的线段树
分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ],yy[],cnt1,cnt2; ][ ...
- 【LOJ】#3109. 「TJOI2019」甲苯先生的线段树
LOJ#3109. 「TJOI2019」甲苯先生的线段树 发现如果枚举路径两边的长度的话,如果根节点的值是$x$,左边走了$l$,右边走了$r$ 肯定答案会是$(2^{l + 1} + 2^{r + ...
- 洛谷P5338 [TJOI2019]甲苯先生的滚榜
原题链接洛谷P5338 [TJOI2019]甲苯先生的滚榜 题目描述 甲苯先生在制作一个online judge,他发现做比赛的人们很关心自己的排名(显而易见),在acm赛制的比赛中,如果通过题目数量 ...
- 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
随机推荐
- IE8 浏览器文本模式变为杂项(quirks)页面变形的解决方法
IE8 浏览器文本模式(document.documentMode)变为杂项(quirks)页面变形的解决方法. 正常情况下 document.documentMode 输出为8,而变为杂项之后doc ...
- Oracle 表锁定
--锁表查询SQL SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$s ...
- 小程序上传wx.uploadFile - 小程序请假-请求
小程序上传wx.uploadFile UploadTask wx.uploadFile(Object object) 将本地资源上传到服务器.客户端发起一个 HTTPS POST 请求,其中 cont ...
- sklearn可实现的函数或者功能可分为如下几个方面
1.分类算法2.回归算法3.聚类算法4.降维算法5.模型优化6.文本预处理 其中分类算法和回归算法又叫监督学习,聚类算法和降维算法又叫非监督学习 分类算法 1 2 3 4 5 6 7 8 9 10 1 ...
- POJ 1430 Binary Stirling Numbers (第二类斯特林数、组合计数)
题目链接 http://poj.org/problem?id=1430 题解 qaq写了道水题-- 在模\(2\)意义下重写一下第二类Stirling数的递推式: \[S(n,m)=S(n-1,m-1 ...
- JavaWeb_初识过滤器Filter
菜鸟教程 传送门 过滤器Filter::JavaWeb三大组件之一,它与Servlet很相似,过滤器是用来拦截请求的,而不是处理请求的 当用户请求某个Servlet时,会先执行部署在这个请求上的Fil ...
- 解析XML的几种方式:DOM、SAX、PULL
DOM解析 解析器读入整个文档,然后构建一个主流内存的树结构,然后代码就可以使用dom接口来操作这个树结构. 优点: 整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能. 通过树形结构存 ...
- C++入门经典-例2.3-在print函数中使用附加符号
1:代码如下: // 2.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" int main() { ; /*定义长整型变量,为其赋值*/ ...
- go语言实现简易ftp客户端
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xiangxianghehe/article/details/78310249 Go语言实 ...
- leetcode171 Excel列表序列号
/** 可看做26进制到10进制转换问题:v=26*v+s[i]-'A'; **/ class Solution { public: int titleToNumber(string s) { ; f ...