首页 > 其他分享 >题解 P5597【【XR-4】复读】

题解 P5597【【XR-4】复读】

时间:2023-05-27 17:35:28浏览次数:43  
标签:rt lc int 题解 TU P5597 dfs rc XR

一道好题!挺对我脑回路的,于是秒掉了,来写个题解。

下文称执行一遍指令的过程为一个周期。例如指令是 LRU,那么 LRULRULRULRU 共执行了四个周期。

看到平方的数据范围,不难想到枚举第一个周期的终点。作为一台优秀的复读机,我们知道每个周期在树上发生的相对位移是相同的。

例如,如下的一棵树,如果第一周期从 \(1\) 移动到 \(4\),那么第二周期一定从 \(4\) 移动到 \(16\):

同时,因为在根节点的 U 操作非法,假设一个周期从 \(u\) 开始,那么途中一定一直在 \(u\) 的子树内,不可能到 \(u\) 上面。

依然假设第一周期从 \(1\) 移动到 \(4\),那么根据这一点,我们第一周期中必须把所有在 \(1\) 子树内但不在 \(4\) 子树内的节点访问一遍,也就是 \(1,2,3,5,6\),并最终停在 \(4\)。同理,第二周期必须把 \(4,8,9\) 访问一遍并停在 \(16\),第三周期必须把 \(16\) 访问一遍。

我们把 \((1,2,3,4,5,6),(4,8,9,16),(16)\) 三棵子树取一个并(如下图所示),其中每个周期要从绿色的点出发,经过所有粉色的点,最终到达蓝色的点。

显而易见地,最少需要的指令数为 \(2(n-1)-\Delta d\),其中 \(n\) 为这棵树中的点数,\(\Delta d\) 是起点和终点之间的边数。上图给出了一种构造,即 RLUULRUL

枚举第一个周期的终点,然后求出所有这样的子树的并,最后根据上面公式统计最优解即可。

时间复杂度 \(\mathcal O(n^2)\)。

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do{freopen(s".in","r",stdin);freopen(s".out","w",stdout);}while(false)
using namespace std;
typedef long long ll;

mt19937 rnd(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
int randint(int L, int R) {
    uniform_int_distribution<int> dist(L, R);
    return dist(rnd);
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

const int N = 2048;

struct BinaryTree {
    int lc[N], rc[N], sz, rt;
    BinaryTree() {
        memset(lc, 0, sizeof(lc));
        memset(rc, 0, sizeof(rc));
        sz = rt = 0;
    }
    int read() {
        int c = getchar() ^ 48, u = ++sz;
        if(c & 1) lc[u] = read();
        if(c & 2) rc[u] = read();
        return u;
    }
}T, TU; // original tree; the union of trees

void dfs_union(int u, int v, int root, int key) { // calculate the union
    if(u == root || v == key) {
        if(!key) key = v;
        v = TU.rt;
    }
    if(T.lc[u]) {
        if(!TU.lc[v]) TU.lc[v] = ++TU.sz;
        dfs_union(T.lc[u], TU.lc[v], root, key);
    }
    if(T.rc[u]) {
        if(!TU.rc[v]) TU.rc[v] = ++TU.sz;
        dfs_union(T.rc[u], TU.rc[v], root, key);
    }
}

int dfs_enum(int u, int d) { // enumerate the destination of round #1 moving
    TU = BinaryTree();
    TU.sz = TU.rt = 1;
    dfs_union(T.rt, TU.rt, u, 0);
    int ans = (TU.sz - 1) * 2 - d;
    if(T.lc[u]) chkmin(ans, dfs_enum(T.lc[u], d+1));
    if(T.rc[u]) chkmin(ans, dfs_enum(T.rc[u], d+1));
    return ans;
}

int main() {
    T.rt = T.read();
    printf("%d\n", dfs_enum(T.rt, 0));
    return 0;
}

标签:rt,lc,int,题解,TU,P5597,dfs,rc,XR
From: https://www.cnblogs.com/ruierqwq/p/LG-P5597.html

相关文章

  • 使用SpringMVC 拦截器导致出现@CrossOrigin失效问题解决办法
    非简单请求会发起一个OPTIONS方法的预检请求,这个请求会被拦截器拦截,但是服务器没有给浏览器返回必要的跨域指示信息(比如:“Access-Control-Allow-Origin”----允许哪些请求访问),浏览器没收到指示信息,就认为服务器不允许跨域请求,就会报错。所以需要在拦截器拦截OPTIONS方法的预......
  • Python_手动下载Chrome驱动找不到对应版本,尝试pip自动下载对应版本的驱动,问题解决
    pipinstallwebdriver-manager 验证是否成功代码如下:fromseleniumimportwebdriverdriver=webdriver.Chrome()url='https://www.csdn.net/'driver.get(url)driver.maximize_window()验证成功......
  • JOISC 2017 题解
    JOISC2017Day1开荒者Cultivation首先进行转化,转化为对于每个点\(x,y\),将其扩成一个左上角为\((x-a,y-c)\)右下角为\((x+b,y+d)\)的矩形后覆盖整个\(R\timesC\)的大举行。首先考虑枚举\(a,b\),那么我们可以得到平面上的几条垂直线段,那么我们可以得到一些关于\(c,d\)......
  • 校门外歪脖树上的鸽子 题解
    题面(图是偷来的)。\(1\len,m\le2*10^5,1\led_i\le10^8\)。样例输入:564536128711512232151253224235样例输出:0539广义二叉树有这样一种普遍的处理方法:定义\(is_a\)表示\(a\)是否是它父亲的左儿子。(根的值为\(-1\))定义\(f......
  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT
    深度学习领域常用的基于CPU/GPU的推理方式有OpenCVDNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下:结论:GPU加速首选Tens......
  • 2023年5月26日 问题解答
    为了解决问题一,我们可以使用调度算法来规划自动导引车的行动,以确保所有待加工任务能够顺利完成。首先,我们需要确定任务的处理顺序。根据表1中给出的加工时间,我们可以按照加工时间从小到大的顺序对任务进行排序。然后,我们可以使用一个列表来表示每台自动导引车的状态。初始时,所有......
  • 河北工业大学 ACM 集训队 2023 年夏季选拔 题解 12/12
    https://ac.nowcoder.com/acm/contest/59007A假设数字n有len位则小len的长度,每个都有九个方案。长度和len一样的,至少有n[0]-1种方案n[0]n[0]n[0]...的这个方案暴力地跑一遍看看是不是小于等于n即可#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;in......
  • ABC268G 题解
    前言题目传送门!更好的阅读体验?很牛逼的题目,这题是要从定义出发,而非DP,但是想到这一点不简单(我太菜了)。思路考虑两个名字\(s\)与\(t\)。如果\(s\)是\(t\)的前缀,根据字典序的规则,\(t\)必然比\(s\)靠前。即\(0\)。如果\(t\)是\(s\)的前缀,同理,\(s\)比\(t\)......
  • ABC261F 题解
    前言题目传送门!更好的阅读体验?非常好的数据结构优化题。思路对于第\(x\)次询问,答案为\(\dfrac{\sum\limits_{i=1}^x\sum\limits_{j=1}^x\max(a_i,a_j)}{x^2}\)。分母显然可以用逆元求,所以看上面那一坨。看上面这幅图就比较显然了,我们只需要在线维护数据结构,支持:求出......
  • Educational Codeforces Round 149 (Rated for Div. 2) 题解
    https://codeforces.com/contest/1837https://codeforces.com/contest/1837/problems利益相关:上紫祭。真的不要以为这道题放在F就不敢做。压线过题的感觉真好。ABC题都过水,就不写了。代码丢在这里:A:https://codeforces.com/contest/1837/submission/207156920B:https:......