Codeforces 960D Full Binary Tree Queries ( 思维 && 模拟 )
题意 : 给出一颗无限层的满二叉树,然后每个值为 X (根的 X 等于 1 ) 左孩子的值是 2*X,右孩子的值是 2*X+1 ,现在有两种操作,(1, x,k) 表示将 x 所在层的所有节点整体向右循环地移动 k 个单位、(2,x,k)表示将 x 所在的层的所有节点及其子树向右循环地移动 k 个单位、(3,x)输出从 x 到根的路径
分析 :
第一个操作不难进行模拟
只要给每个层记录其偏移量,最后查询的时候依据偏移量来输出具体的值即可
关键是第二个操作
仔细一想,会发现一个规律
如果第一层移动 k 个单位
那么对于第二种操作,其孩子分别移动了 k*2^1、k*2^2、k*2^3……
所以其本质就是进行第一种操作,偏移量不一样了而已
查看了题目数据量之后发现每一次只进行到第 60 层
所以模拟到第 60 层就是回答所有问询了
#include<bits/stdc++.h>
#define LL long long
using namespace std;
;
LL Move1[maxn];///正移动偏移量,方便知道原节点去了哪个位置
LL Move2[maxn];///反移动偏移量,方便知道原节点现在是什么值
inline void op1(int Lay, LL move, LL x, LL times)
{
) Lay = log2(x) + ;///获取 x 在第几层
LL Base = 1LL<<(Lay-);///这一层有多少个节点
) move %= Base;///如果非第二种操作
else move = ( (move % Base) * (times % Base) ) % Base;///第二种操作
Move1[Lay] = (( Move1[Lay] + move) + Base ) % Base;///正偏移量直接移动即可
Move2[Lay] = (( Move2[Lay] - move) + Base ) % Base;///反偏移量要反向移动
}
inline void op2(LL move, LL x)
{
;
; i<; i++,j++)///最多到60层
op1(i, move, , 1LL<<j);
}
inline void op3(LL x)
{
if(x == 1LL){
puts(");
return;
}
printf("%I64d", x);
;
LL Base = 1LL<<(Lay-);
LL pos = (( (x - Base) + Move1[Lay] ) + Base) % Base + Base;
while(!(pos == 3LL || pos == 2LL)){
) pos = (pos - )>>;///找到当前节点的父亲节点
;
Lay = log2(pos) + ;
Base = 1LL<<(Lay-);
printf(" %I64d", ( (pos - Base + Move2[Lay]) + Base ) % Base + Base);///通过反向偏移量来获取在这个节点位置的值
}puts(");
}
int main(void)
{
int Q;
scanf("%d", &Q);
while(Q--){
int command;
LL X, K;
scanf("%d", &command);
){
scanf("%I64d %I64d", &X, &K);
op1(-, K, X, -);
}){
scanf("%I64d %I64d", &X, &K);
op2(K, X);
}else{
scanf("%I64d", &X);
op3(X);
}
}
;
}
Codeforces 960D Full Binary Tree Queries ( 思维 && 模拟 )的更多相关文章
- Codeforces 960D - Full Binary Tree Queries
960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一 ...
- hdu 6161--Big binary tree(思维--压缩空间)
题目链接 Problem Description You are given a complete binary tree with n nodes. The root node is numbere ...
- Codeforces 758C:Unfair Poll(思维+模拟)
http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点 ...
- codeforces C. Vasya And The Mushrooms (思维+模拟)
题意:给定一个2*n的矩形方格,每个格子有一个权值,从(0,0)开始出发,要求遍历完整个网格(不能重复走一个格子),求最大权值和,(权值和是按照step*w累加,step步数从0开始). 转载: 题解 ...
- codeforce 1311E. Construct the Binary Tree (构造,就是个模拟)
ACM思维题训练集合 You are given two integers n and d. You need to construct a rooted binary tree consisting ...
- Binary Tree(二叉树+思维)
Binary Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
- Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]
CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...
- Binary Tree HDU - 5573 (思维)
题目链接: B - Binary Tree HDU - 5573 题目大意: 给定一颗二叉树,根结点权值为1,左孩子权值是父节点的两倍,右孩子是两倍+1: 给定 n 和 k,让你找一条从根结点走到第 ...
- 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记
前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...
随机推荐
- CodeSmith 找不到请求的 .Net Framework Data Provider
连接数据库时候报标题的错误解决方案 安装mysql-connector-net-6.8.7.msi,下载地址:http://dev.mysql.com/downloads/connector/net/ ...
- docker mysql 容器报too many connections 引发的liunx磁盘扩容操作
症状每次删除mysql容器重启没两分钟又报标题错 df -h 命令查看各个挂载空间应用情况发现root home var 三个文件目录挂载的空间满了 网上百度了一下liunx磁盘扩容操作,fdisk ...
- Java 并发编程:volatile的使用及其原理(二)
一.volatile的作用 在<Java并发编程:核心理论>一文中,我们已经提到过可见性.有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果 ...
- C语言I博客作业12
一.我学到的内容 二.我的收获 作业链接 收获 博客第一次作业:https://www.cnblogs.com/gm12/p/11584148.html 第一次作业收获:第一次作业是我初步接触C语言的 ...
- CDH日常运维
1/ 作业有问题: 查log,没log再跑一次查log. 如果没有log的情况,比如hiveserver2挂了,查strr. 2/ 查集群名字 #看hdfs集群的名字,在cdh的hdfs配置中查:na ...
- Java第三周总结报告
本周做了什么? 本周利用Java语言重新回顾了条件结构与循环结构和字符串的处理等问题,认识到了Java与C/C++的在这两个方面的不同. 下周准备做什么? 学习Java面向对象的有关知识,包括对象与类 ...
- CF1142B Lynyrd Skynyrd
题目 有两种做法: 第一种是\(O(nlog\ n)\)的. 我们预处理两个数组: \(pre_i\)表示\(p\)中\(i\)前面的那个数是\(pre_i\). \(lst_i\)表示\(a\)中\ ...
- C++中类模板的概念和意义
1,在 C++ 中是否能够将泛型的思想应用于类? 1,函数模板是将泛型编程的思想应用于函数,就有了函数模板: 2,可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将 ...
- Ubantu问题记录
2019.4.21Ubantu问题:常用命令:sudo是一种权限管理机制,依赖于/etc/sudoers,定义了授权给哪个用户可以以管理员的身份执行管理命令格式:sudo -u USERNAME CO ...
- java 字符串锁
package com.example.demo.controller; public class StringLock { public void method(String p) { // new ...