首页 > 其他分享 >CF1806E 题解

CF1806E 题解

时间:2023-08-18 22:11:41浏览次数:40  
标签:int 题解 100005 1ll mp res BFquery CF1806E

题目大意

给你一棵树,然后定义一个函数 $ f(x,y) $,接下来给你 $ q $ 组询问 \(x_{i},y_{i}\),让你求每一次的 $ f(x_{i},y_{i})$。

分析

首先我们尝试根据这个函数的定义暴力求值,代码实现如下。

ll BFquery(int g,int h) {
    if(!g) return 0;
    return 1ll*a[g]*a[h]+BFquery(p[g],p[h]);
}

每次调用这个函数即可。时间复杂度是 $ O(nq) $,不足以通过此题。

于是我们来分析题目中用粗体标注的一个条件:每次给出的 \(x_{i}\) 和 \(y_{i}\),它们深度相同。

这就表明一个点的权值只会和与它处于同一深度的任意一个点相乘,这就减少了相乘点对的组数,也增加了它们出现的次数,会导致我们多次计算同一个 \(f(x,y)\) 的值,增大时间复杂度。

对于这个问题,我们可以尝试用类似记忆化搜索的方法来解决,但是为了不超过空间限制,也不能全部记录,即对于每一组 \(x,y\),我们可以设一个值 \(B\),即在不记录答案的情况下,最多计算 \(B\) 次。对于余下的计算,每次的值都会被存储在一个 map 中,这样时间复杂度可以优化至近似 \(O(Bq)\)。

而另外一种方法,存储深度较大的部分而不存储深度较小的部分,目前没有找到这方面正确的做法,如果以后找到我会补上。

下面是代码。

int n,q,a[100005]={},p[100005]={},d[100005]={},rp[100005]={},f,s,cnt=0,P;
ll res;
vector<int> v[100005],op[100005];
map<ll,ll> mp;
const int M=100005,B=500;

ll BFquery(int g,int h) {
    if(!g) return 0;
    if(g>h) swap(g,h);
    if(mp[1ll*g*M+h]!=0) return mp[1ll*g*M+h];
    else {
        mp[1ll*g*M+h]=1ll*a[g]*a[h]+BFquery(p[g],p[h]);
        return mp[1ll*g*M+h];
    }
}

void wk() {
    read(n),read(q);
    for(int i=1;i<=n;++i) read(a[i]);
    for(int i=2,x;i<=n;++i) {
        read(x);
        v[x].emplace_back(i);
        p[i]=x;
    }
    while(q--) {
        read(f),read(s);
        if(f>s) swap(f,s);
        res=0;
        P=B;
        while(f && s && P>0) {
            res+=1ll*a[f]*a[s];
            f=p[f];
            s=p[s];
            --P; 
        }
        if(f) res+=BFquery(f,s);
        writeln(res);
    }
}

标签:int,题解,100005,1ll,mp,res,BFquery,CF1806E
From: https://www.cnblogs.com/monomial/p/17641723.html

相关文章

  • P4005题解
    闲来无事写篇题解题面传送门简要题意一条线段上有\(n\)个点成对连接,求所连的线最小交点数。思路看到题目中\(n\le44\)自然想到最终复杂度大约在\(O(2^\frac{n}{2})\)左右。经过思考不难发现不论如何两地铁站之间有且只有以下八种方式进行连接:显然可以暴搜解决,......
  • wsl2 下输出重定向至 clip.exe 出现中文乱码问题解决方案
    背景win10系统在wls2下安装neovim后希望与windows剪切板通信。按教程添加如下配置。--系统剪切板ifvim.fn.has('wsl')then vim.g.clipboard={ name='WslClipboard', copy={ ['+']='clip.exe', ['*']='clip.exe'......
  • 搭配买卖题解
    原题题目描述joe觉得云朵很美,决定去山上的商店买一些云朵。商店里有n多云,云朵被编号为1,2,……,n,并且每朵云都有一个价值。但商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这多云有搭配的云都要买。但是Joe的钱有限,所以他希望买的价值越多越好。输入第1行:n、m、w,表示......
  • 「BJWC2012」冻结题解
    「BJWC2012」冻结题解一.题目"我要成为魔法少女!""那么,以灵魂为代价,你希望得到什么?""我要将有关魔法和奇迹的一切,封印于卡片之中"在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符卡)带来的便捷。现在,不需要立下契约也可以使用魔法了!你还不来试一试?比如,我们在......
  • [AGC004D] Teleporter 题解
    简单贪心。思路可以发现一号节点必然连向自己。由于题目中保证了最初每个点都可以到达一号节点。那么我们发现改完一后,原图变成了一棵十分优美的树。考虑在树上进行贪心。我们贪心的从叶子结点往上走。知道第\(k\)个若还没要到\(1\),就直接连向一号节点。这个贪心也比较......
  • 【题解】#119. 最大整数 题解(2023-07-12更新)
    #119.最大整数题解本文章的访问次数为次。Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)本文已同步至学校网站、博客园。Part2背景本来是不想写这篇题解的,但是由于卡了这个蒟蒻\(1\)整天,故此纪念。Par......
  • CF1575G GCD Festival 题解
    题意给定一个长度为\(n\)的正整数数列\(a\),求\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\gcd\left(a_i,a_j\right)\times\gcd\left(i,j\right)\](\(1\len,a_i\le10^5\))。题解根据欧拉函数的性质,可以得出\[n=\sum\limits_{d\midn}\varphi(d)\]该......
  • [AT_ABC106_C]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定一个字符串\(s\)以及一个整数\(k\)。该字符串为纯数字串。其中的数字\(x\)会在\(k\)天后变为\(x^{k-1}\)个\(x\)。求出\(10^{15}\)天后,串\(s\)的第\(k\)位是什么......
  • [AT_ABC106_D]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定正整数\(n,m,q\)。接下来给定\(m\)组\(x_i,y_i\),表示一列列车的起始站和终点站。在接下来给定\(q\)组\(l_i,r_i\)。对于每组询问,回答有多少\(x_i\geql_i\operatorna......
  • [AT_ABC106_B]题解(C++)
    PartIPreface原题目\(\text{(Luogu)}\)原题目\(\text{(AtCoder)}\)PartIISketch给定一个正整数\(N\)。求出\(1\simN\)所有因数个数为\(8\)的数的个数。PartIIIAnalysis先输入\(N\)。遍历\(1\simN\)的每个数,记录每个数的因数个数。若因数个数等于\(8\)......