【LOJ】#3109. 「TJOI2019」甲苯先生的线段树
LOJ#3109. 「TJOI2019」甲苯先生的线段树
发现如果枚举路径两边的长度的话,如果根节点的值是\(x\),左边走了\(l\),右边走了\(r\)
肯定答案会是\((2^{l + 1} + 2^{r + 1} - 3)x + t\),可以发现\(t < (2^{l + 1} + 2^{r + 1} - 3)\),于是考虑计算对于\(t\),左边走了\(l\),右边走了深度\(r\),几种走法使得总和为\(t\)
容易发现右边最小一定是走了\(2^{r} - 1\)于是可以扣掉
再发现我们其实是对于左边和右边串选择长度为\([1,l - 1]\)和\([1,r - 1]\)的11111111......
但是这种\(i\)个1的形式不太好dp,于是就转化成\(2^{i + 1} - 1\)的形式,每次强制选择的个数,只要考虑\(2^{i+ 1}\)去dp就好了,\(t\)加上强制选的个数再进行数位dp就可以了
复杂度是\(d^{5}\)的,有点慢,但是可以过,因为上界很远。。。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 200005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int d,c;int64 a,b,s;
int getpos(int64 x) {
int res = 0;
while(x) {
++res;
x >>= 1;
}
return res;
}
int64 GetSum(int64 a,int64 b) {
int ta = getpos(a),tb = getpos(b);
if(ta > tb) {swap(a,b);swap(ta,tb);}
int64 res = 0;
for(int i = 1 ; i <= tb - ta ; ++i) {res += b;b >>= 1;}
while(a != b) {
res += a;res += b;
a >>= 1;b >>= 1;
}
res += a;
return res;
}
map<int64,int64> zz;
int La,Lb;
int64 dp[55][105][2];
int64 Process(int64 s,int num) {
memset(dp,0,sizeof(dp));
dp[0][0][0] = 1;
if(s & 1) return 0;
for(int i = 1 ; i <= 50 ; ++i) {
int to = (s >> i) & 1;
for(int j = 0 ; j <= num ; ++j) {
for(int t = 0 ; t <= 1 ; ++t) {
int up = (i <= La) + (i <= Lb);
for(int h = 0 ; h <= up ; ++h) {
if(((t + h) & 1) == to) {
int64 f = 1;
if(h == 1 && up == 2) f = 2;
dp[i][j + h][(t + h - to) / 2] += f * dp[i - 1][j][t];
}
}
}
}
}
return dp[50][num][0];
}
int64 Calc() {
int64 res = 0;
for(int i = 0 ; i <= d ; ++i) {
for(int j = 0 ; j <= d ; ++j) {
int64 k = (1LL << i + 1) + (1LL << j + 1) - 3;
int64 tmp = s;
if(tmp < k) continue;
if(getpos(tmp / k) + max(i,j) > d) continue;
tmp = tmp % k;
if(tmp < (1LL << j) - 1) continue;
tmp -= (1LL << j) - 1;
if(tmp == 0) {++res;continue;}
La = i - 1,Lb = j - 1;
for(int h = 0 ; h <= max(i - 1,0) + max(j - 1,0) ; ++h) {
res += Process(tmp + h,h);
}
}
}
return res;
}
void Solve() {
read(d);read(a);read(b);read(c);
s = GetSum(a,b);
if(c == 1) {out(s);enter;}
else {out(Calc() - 1);enter;}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
int T;
read(T);
for(int i = 1 ; i <= T ; ++i) {
Solve();
}
return 0;
}
(权游文化还行。。。最近刚开始追权游23333感觉题面非常有趣)
【LOJ】#3109. 「TJOI2019」甲苯先生的线段树的更多相关文章
- LOJ 2302 「NOI2017」整数——压位线段树
题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...
- LG5337/BZOJ5508 「TJOI2019」甲苯先生的字符串 线性动态规划+矩阵加速
问题描述 LG5337 BZOJ5508 题解 设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法. 设\(exist_ ...
- LG5338/BZOJ5509/LOJ3105 「TJOI2019」甲苯先生的滚榜 Treap
问题描述 LG5338 LOJ3105 BZOJ5509 题解 建立一棵\(\mathrm{Treap}\),把原来的\(val\)换成两个值\(ac,tim\) 原来的比较\(val_a<va ...
- 「TJOI2019」甲苯先生的滚榜
题目链接 问题分析 参照数据范围,我们需要一个能够在\(O(n\log n)\)复杂度内维护有序数列的数据结构.那么平衡树是很好的选择.参考程序中使用带旋Treap. 参考程序 #pragma GCC ...
- LOJ 3055 「HNOI2019」JOJO—— kmp自动机+主席树
题目:https://loj.ac/problem/3055 先写了暴力.本来想的是 n<=300 的那个在树上暴力维护好整个字符串, x=1 的那个用主席树维护好字符串和 nxt 数组.但 x ...
- LOJ 2339 「WC2018」通道——边分治+虚树
题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...
- 2018.06.26「TJOI2018」数学计算(线段树)
描述 小豆现在有一个数 xxx ,初始值为 111 . 小豆有 QQQ 次操作,操作有两种类型: 111 $ m$ : x=x×mx=x×mx=x×m ,输出 xxx modmodmod MMM : ...
随机推荐
- 51 Nod 1110距离之和最小V3
1110 距离之和最小 V3 1 秒 131,072 KB 40 分 4 级题 X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 * ...
- Eclise快捷键(最全)
Eclipse常用快捷键 Eclipse常用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/) 快速修正:Ctrl+1 单词补全:Alt+/ 打开外部Java ...
- 事件处理机制与Handler消息传递机制
一.基于监听的事件处理机制 基于监听的时间处理机制模型: 事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程如下: Step 1:为某个事件源(组件)设置一个监听器,用于监听用户操作 St ...
- Java中基本数据类型
在数据类型中,最常用也是最基础的数据类型,被称作基本数据类型.可以使用这些类型的值来代表一些简单的状态. Java 语言的基本数据类型总共有以下8 种,下面是按照用途划分出的4 个类别: 定点类型: ...
- 使用Pillow(PIL)库实现中文字符画
上班摸鱼写的,不多说了,直接上脚本 #coding=utf-8 from PIL import Image from PIL import ImageDraw from PIL import Imag ...
- Linux设备驱动程序 之 装载和卸载模块
前置说明 本文例子中涉及两个模块hello.ko和world.ko,其中hello导出符号供world使用: insmod 该命令将模块的代码和数据装入内核,然后使用内核的符号表继续模块中任何未解析的 ...
- laravel-5.3(1) 路由配置
第一步: 按照上一篇搭建好工程后可以看到框架默认的 welcome 默认视图: 一般的web 开发框架是MVC设计模式,那么我们现在创建自己的控制器和视图,CMD 进入到工程根目录执行 php art ...
- k8s-helm01-----helm基本使用
什么是helm Helm 是 Kubernetes 生态系统中的一个软件包管理工具. 基础概念: Helm:客户端,主要负责管理本地的 Charts.repositories 以及与tiller服务器 ...
- Android通讯-webSocket
概述 上一篇简单的认识了Socket以及他的使用,在学习过程中看到了WebSocket的身影,于是乎百度了一把,这货也可以做全双工的网络通讯,而且是html5提出来的新东西!程序员嘛!就是要对新的东西 ...
- 1.4 Go语言基础之流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...