UVA679 - Dropping Balls 题解

这道题显然可以直接模拟前 \(I\) 个小球的掉落,最终即可得解.但是,很明显,这么做会使时间复杂度直接爆炸成 \(O(l\times D\times I)\),已然是力不从心.
仔细观察,可以简单地发现:我们只需模拟第 \(I\) 个小球的运动即可,通过判断当前节点上已经经过了的小球数的奇偶性,可以轻松判断第 \(I\) 个小球的运动路线(这句话是整道题解题方法的精髓,请仔细理解后看下面的代码).

Code:

#include <bits/stdc++.h>
using namespace std;
int l,D,I;
void rd(int&);
void wt(int);
int main() {
    //freopen("1.in","r",stdin);
    //freopen("1.out","w",stdout);
    rd(l);
    while (l--) {
        rd(D),rd(I);
        int node=1,total=(1<<D)-1;
        for (;;) {
            I&1?(node<<=1,I=I+1>>1):(node=node<<1|1,I>>=1);
            if (node>total) {
                wt(node>>1);
                putchar('\n');
                break;
            }
        }
    }
    return 0;
}
void rd(int& x) {
    x=0;
    char ch=getchar();
    while (!isdigit(ch))
        ch=getchar();
    while (isdigit(ch)) {
        x=x*10+ch-48;
        ch=getchar();
    }
}
void wt(int x) {
    if (x>9)
        wt(x/10);
    putchar(x%10+48);
}

原文地址:https://www.cnblogs.com/Xray-luogu/p/12228346.html

时间: 2024-10-15 15:46:58

UVA679 - Dropping Balls 题解的相关文章

UVA679 Dropping Balls【二叉树结点编号】

Dropping Balls A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped first visits a non-terminal node. It then keeps moving down, either follows the path of the left subtree, o

Uva679 Dropping Balls

A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped first visits a non-terminal node. It then keeps moving down, either follows the path of the left subtree, or follows the p

UVa679 Dropping Balls (二叉树)

链接:http://acm.hust.edu.cn/vjudge/problem/19499分析:二叉树的递归定义:二叉树要么为空,要么有根节点.左子树和右子树组成,而左右子树分别是一棵二叉树.本题来说,对于一个根节点,当奇数次小球到达时,小球往左走,k*=2,且当前到达左子树小球个数是到达根节点小球个数的(I+1)/2,当偶数次小球到达此根节点时,小球往右走,k=k*2+1,然后当前往右边走到达右子树根结点的小球总个数为I/=2,就这样递归进行直到到达叶子结点. 1 #include <cst

679 - Dropping Balls

Dropping Balls PS:因为该题排版较麻烦,这里给出OJ网址:UVa679 - Dropping Balls 有一棵二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从上到下从左到右编号为1, 2, 3,-, 2D-1.在结点1处放一个小球,它会往下落.每个内结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变.当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点,如图6-2所示. 一些小球从结点1处依次开始下落,最后一个

UVa679:Dropping Balls

Dropping Balls A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped first visits a non-terminal node. It then keeps moving down, either follows the path of the left subtree, o

[2016-02-08][UVA][679][Dropping Balls]

UVA - 679 Dropping Balls Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped f

Dropping Balls UVA - 679(二叉树的遍历)

题目链接:https://vjudge.net/problem/UVA-679 题目大意:t组样例,每组包括D M   层数是D   问第M个小球落在哪个叶子节点?    每个节点有开关  刚开始全都是关闭的,小球走到节点  节点开关变为与当前相反   每个小球从根节点释放 思路:这题是第一道二叉树遍历的题目,二叉树暴力模拟的确可以求出答案 ,但是很不幸,会超时 然后另一种方法,只需要求第M次小球就行了!  怎么求呢?   试想一下,如果M为奇数 那么从根节点开始看,肯定是往左走(M+1)/2次

UVA - 679 Dropping Balls 规律

题目大意:给出一棵完全二叉树,每个节点上都有一个开关,刚开始开关都是开的,球经过该节点后开关就关上了(根节点除外).如果球经过该节点的兄弟节点,那么该节点的开关就又开了 现在往根节点放球,优先选择左边的节点走,如果左边的节点的开关关了,就选择右边的.球落到叶节点后就继续另一颗球,问第n颗球落到了哪个叶节点上 解题思路:其实这题蛮水的,因为是二叉树,所以可以由球的奇偶行来判断球往哪个分支走,如果n % 2 == 0就表示第n颗往右边走了,反之就是往左边走了,以此类推即可推出最后一颗球落到哪了 #i

Dropping Balls

#include<bits/stdc++.h> using namespace std; int D, N; int main() { while (scanf("%d%d", &D, &N)!=EOF) { int k = 1; for (int i = 0; i < D - 1; i++) { if (N % 2) { k = k * 2; N = (N + 1) / 2; } else { k = k * 2 + 1; N /= 2; } } p