首页 > 其他分享 >【题解】洛谷 P10765 「CROI · R2」在相思树下 I

【题解】洛谷 P10765 「CROI · R2」在相思树下 I

时间:2024-07-13 21:51:33浏览次数:21  
标签:ch 洛谷 数列 R2 题解 ll 元素 完成 操作

I 题意简述

共 \(T\) 组测试数据。

对于每一组测试数据,有初始数列,共 \(n\) 个元素,从 \(1\) 至 \(n\)。给出 \(k\) 次操作。操作一:将数列中下标为奇数的数全部删除;操作二:将数列中下标为偶数的数全部删除。完成操作之后,将剩余的数从下标 \(1\) 开始依次重新编排下标。求问 \(k\) 次操作之后剩下来的最后一个数是什么。

数据满足 \(1 \leq T \leq 10, 1 \leq n \leq 10^{18}\),所有 \(k\) 满足可以在操作 \(k\) 次后使数列仅剩一个元素。

II 解析

思考最后两步可能的情况。容易发现,满足这种情况的话,第 \(k - 1\) 步完成后仅可能剩 \(2\) 或 \(3\) 个元素,其余情况都需要再进行多于 \(1\) 步才能做到仅剩一个数。如果第 \(k - 1\) 步操作完成后剩余 \(3\) 个元素,因为第 \(k\) 步执行完将仅剩一个元素,这第 \(k\) 次操作必为操作 \(1\)。此时剩下的元素就是第 \(k - 1\) 次操作完成后的数列的第二个元素。如果第 \(k - 1\) 步完成后剩 \(2\) 个元素,那么最后剩下的有两种情况:是 \(1\) 操作,剩下第 \(k - 1\) 次操作完成后的数列的第 \(2\) 个元素;是 \(2\) 操作,剩下第 \(k - 1\) 次操作完成后的数列的第一个元素。

综合一下,最后一步的操作如果是操作 \(1\),答案应为第 \(k - 1\) 次操作完成后的数列的第二个元素,如果为操作 \(2\),应为第 \(k - 1\) 次操作完成后的数列的第一个元素。

那么问题来了,如何知道这个关键的“第 \(k - 1\) 次操作完成后的数列的第一或第二个元素”?

观察这个数列的变化规律,我们能够发现,如果执行操作 \(1\),则数列的第一项变成数列的第二项,公差变为原来的二倍;如果执行操作 \(2\),则第一项不变,第二项变为第三项,公差变为原来的二倍。可以设变量 \(a, b, d\) 维护数列的第一项、第二项、公差。维护三个数据的思路在代码注释中,不再赘述。在进行到最后一次操作时,根据操作类型判断答案即可。注意必须给 \(a, b, d\) 赋初始值 \(1, 2, 1\)。

III 代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll t; // 测试数据组数
inline void read(ll& x){ // 快读
    ll s = 0, w = 1; char ch = getchar();
    while(ch < '0' || ch > '9') { w = (ch == '-' ? -1 : w); ch = getchar(); }
    while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
    x = s * w;
}
inline void write(ll x){ // 快写
    if(x < 0) { x = -x; putchar('-'); }
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
inline void write(ll x, char ch) { write(x); putchar(ch); }
int main(){
    read(t);
    while(t--){
        ll n, k, a = 1, b = 2, d = 1; // n, k 表示初始数列长度,操作次数,a, b, d 分别维护数列的第一项、第二项、公差
        read(n), read(k);
        for(int i = 1; i <= k; i++){
            ll x; read(x);
            if(i == k)
                write((x == 1 ? b : a), '\n'); // 依据最后一步的操作种类来判断答案是数列第一项还是第二项
            if(x == 1){ // 若操作 1
                ll tmp = b;
                a = tmp; b = tmp + 2 * d; // 新数列第一项 a 变为原数列第二项 b, 新数列第二项变为原数列第四项
                // 数列第四想应等于数列第二项加二倍公差
                d *= 2; // 更新数列公差
                // 如果先更新公差,b 加一倍的 d 即可
            }else if(x == 2){ // 若操作 2
                b += d; // 新数列第一项不变,新数列第二项等于原数列第三项
                // 原数列第三项等于原数列第二项加一倍公差
                d *= 2; // 更新公差
            }
        }
    }
    return 0;
}

标签:ch,洛谷,数列,R2,题解,ll,元素,完成,操作
From: https://www.cnblogs.com/-Prulystic-/p/18300772

相关文章

  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • 洛谷 P6522 [CEOI2010 day2] tower 题解
    [CEOI2010day2]tower题目背景古巴比伦人决定建造一座塔。题目描述这座塔共有\(n\)层,每层由一个边长为\(a_i\)的立方体石块构成。一个石块\(i\)能够直接放在石块\(j\)上当且仅当\(a_i\leqa_j+D\),其中\(D\)为一个给定的常数。你需要求出如果使用全部的石块,有多......
  • MBR20200FCT-ASEMI无人机专用MBR20200FCT
    编辑:llMBR20200FCT-ASEMI无人机专用MBR20200FCT型号:MBR20200FCT品牌:ASEMI封装:TO-220F批号:最新最大平均正向电流(IF):20A最大循环峰值反向电压(VRRM):200V最大正向电压(VF):0..90V工作温度:-50°C~175°C反向恢复时间:35ns芯片个数:2芯片尺寸:74mil引脚数量:3正向浪涌电流(IFMS):200A......
  • 洛谷 P2478 [SDOI2010] 城市规划 题解
    题意简述仙人掌上求至少间隔两个位置的最大独立集。(仙人掌指,没有一条边在两个或以上的环里的无向图。)题目分析仙人掌就是树套环,即树上每个结点都是一个结点或环。那么将题目拆解成树上DP和环上DP即可。用tarjan缩点即可。树上DP先来看看树上DP。显然每个点有三个状......
  • 【洛谷】P5728 【深基5.例5】旗鼓相当的对手——C++
    本题感想:本题主要是应该避免重复比较,以a,b,c,d为例,我们假设先a不动,依次比较d,c,b或者b,c,d,然后假设b不动,依次比较c,d,最后假设c不动,比较d,这样这道题就差不多解决了#include<iostream>#include<cmath>usingnamespacestd;intmain(){inta[1010][3],s[1010]={0......
  • [ZJOI2006] 三色二叉树 题解
    [ZJOI2006]三色二叉树题解link趣题。首先我们把题目分成两部分:建树和dp求解。建树:观察发现,字符串中的第\(i\)个字符就代表图中的第\(i\)个节点。如果\(S_i=0\),直接跳过;如果\(S_i=1\),那么\(i+1\)是\(i\)唯一的子节点,在两点之间连边,然后继续递归建树即可。......
  • 2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有()种。A.1B.2C.3D.4答案:C第2......
  • Codeforces Round 957 (Div. 3) A-G 题解
    CodeforcesRound957(Div.3)A-G题解A.OnlyPluses枚举思路:枚举\(a\),\(b\),\(c\)增加的次数,维护最值即可。代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#......
  • 初等数论课程测试题解
    初等数论课程测试题解刚想起来传到博客园上面。正在写。Upd.20240222:已写完,欢迎查错!一、请给出整除的概念及性质对于整数\(a,b\)\((b\neq0)\),如果存在整数\(c\),使得\(a=bc\),则称\(b\)整除\(a\),记作\(b\mida\);否则称\(b\)不整除\(a\),记作\(b\nmida\)。性质......
  • [题解] CF19D Points
    [题解]CF19DPointsCF19DPoints在一个笛卡尔坐标系中,定义三种操作:addxy:在坐标系上标记一个点\((x,y)\),保证\((x,y)\)在添加前不在坐标系上。removexy:移除点\((x,y)\),保证\((x,y)\)在移除前已在坐标系上。findxy:找到所有已标记的\((x',y')\),需满......