首页 > 其他分享 >杭州电子科技大学2023新生赛 E 树 题解

杭州电子科技大学2023新生赛 E 树 题解

时间:2023-12-30 22:44:34浏览次数:64  
标签:ch xordist int 题解 sum 电子科技 vector 2023 Bit

Question

杭州电子科技大学2023新生赛 E 树

给定一颗包含 \(n\) 个节点的带边权的树,定义 \(xordist(u,v)\) 为节点 \(u\) 到 \(v\) 的简单路径上所有边权值的异或和

有 \(q\) 次询问,每次给出 l r x 求 \(\sum_{i=l}^r xordist(i,x)\) 的值

Solution

考试的时候脑子坏了

image.png

对于一条树上的路径 \(xordist(i,x)\) 可以进行分解

\(xordist(i,x)=xordist(c,i)\oplus xordist(c,x)\) ,其中 \(c\) 为任意常数,这个结论在树上和在数轴上都是成立的

方便起见我们定 \(c=1\), 那么我们可以把 \(\sum_{i=l}^r xordist(i,x)\) 拆开

\[\sum_{i=l}^r xordist(i,x)=\sum_{i=l}^r xordist(1,i)\oplus xordist(1,x) \]

此时枚举 \(l\sim r\) 还是会超时,考虑每一位看,预处理出每一位 \(\sum_1^i xordist(1,i)\) ,那么我们就能通过前缀和快速计算出 \(l\sim r\) 在每一位上有几个 \(0\) 几个 \(1\),然后对应 \(xordist(1,x)\) 来累计 \(ans\)

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
struct Edge{
    int from,to,w;
    Edge(int u,int v,int w):from(u),to(v),w(w){}
};
vector<Edge> edges;
struct Bit{
    int c[32];
    Bit(){memset(c,0,sizeof(c));}
    Bit(int x){
        memset(c,0,sizeof(c));
        for(int i=0;i<=31;i++) c[i]=x>>i&1;
    }
    void Get(int x){
        for(int i=0;i<=31;i++){
            c[i]=x>>i&1;
        }
    }
};

int n,Q;
vector<int> F;
vector<vector<int> > G;
vector<Bit> s;

void dfs(int x,int fa=0){
    for(int i=0;i<G[x].size();i++){
        auto& e=edges[G[x][i]];
        if(e.to==fa) continue;
        F[e.to]=F[x]^e.w;
        dfs(e.to,x);
    }
}

void solve(){
    n=read();

    G.assign(n+1,vector<int>()); s.assign(n+1,Bit());F.assign(n+1,0); edges.clear();
    
    for(int i=1;i<n;i++){
        int u=read(),v=read(),w=read();
        edges.push_back(Edge(u,v,w));
        G[u].push_back(edges.size()-1);
        edges.push_back(Edge(v,u,w));
        G[v].push_back(edges.size()-1);
    }

    dfs(1);

    for(int i=1;i<=n;i++){
        Bit now(F[i]); 
        for(int j=0;j<=31;j++){
            s[i].c[j]=s[i-1].c[j]+now.c[j];
        }
    }

    Q=read();
    while(Q--){
        int l=read(),r=read(),x=read();
        Bit now(F[x]);
        LL ans=0;
        for(int i=0;i<=31;i++){
            if(now.c[i]==0)
                ans+=(LL)(s[r].c[i]-s[l-1].c[i])*(1<<i);
            else
                ans+=(LL)((r-l+1)-(s[r].c[i]-s[l-1].c[i]))*(1<<i);
        }
        printf("%lld\n",ans);
    }
}

int main(){
    int T=read();
    while(T--) solve();
}

标签:ch,xordist,int,题解,sum,电子科技,vector,2023,Bit
From: https://www.cnblogs.com/martian148/p/17936992

相关文章

  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目,由于答......
  • 2023-12-30 量学基础
      1 量柱的三重特征量柱是股市成交量的真实记录,是多空双方搏斗的量价暂时平衡点,具有以下三重特性:1、原生性:量柱是用真金白银堆起来的,要想作假也必须用大量的真金白银才能奏效2、孪生性:量柱和价柱是完全对应的孪生兄弟,量价一体3、衍生性:衍生出“股市温度计”的预报功能......
  • 【省选联考2020】树 题解
    省选题解第一发~【省选联考2020】树我和这道题还挺有缘分的。有一次看大佬的省选游记(不知道是哪一年),然后提到有一道是01trie整体加一,当时我就印象深刻,然后在oiwiki上看了一下,心想这整体加一也只能从低位到高位维护01trie啊,又不能查询最大值,有什么卵用(划掉)。这是两周前的事......
  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目......
  • 娱乐 2023/12/30 《天帝史诗0元享活动》狂欢第二幕自动领高级购物券宝箱
    1.打开活动页面活动直达2.按F12打开浏览器控制台或者Ctrl+Shift+I3.选择console面板4.复制下面代码到控制台再回车functiona(){document.querySelector("#pr2>a").click()letb=setTimeout(()=>{document.querySelector("#commonms......
  • 2023.12 《卓有成效的管理者》-彼得▪德鲁克
    目录主要内容第1章有效是可以学会的第2章认识你的时间第3章我能做出什么贡献第3章主要内容第1章有效是可以学会的第2章认识你的时间第3章我能做出什么贡献第3章......
  • 2023.12.30模拟赛总结
    前言:这次比赛打的不是很好,100pts,rank8T1赛时想到了正解,但是因为一些题面的原因和代码细节没调出来首先可以写出暴力dp:\(f[i][j]\)表示到第i位,选了i且选了j个哨岗的最大范围枚举k为上一个,直接暴力转移是\(O(n^3)\)的,过不去然后,我们发现可以分类讨论,如果\([l_i,r_i]\)和\([l_k......
  • 2023-2024-1 20231406 《计算机基础与程序设计》第十四周学习总结
    2023-2024-120231406《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十四周作业这个作业的目标自学《C语言程序设计》第13章并完成云班课测试......
  • *035共情营邱月帮-第17次课(周六晚上-AB对练-)-20231230
      20221212--20221230期间每周一、四、五上正课,三、六是对答疑、对练课。 打开心灵,改变从自己开始,一起抱团取暖。《相信相信的力量》----------------------------------------------------------------------------------------------------------------(周六)-202312......
  • 2023-12-30
    packagecom.example.backendmanage.controller;importcom.example.backendmanage.common.AjaxResult;importcom.example.backendmanage.info.Role;importcom.example.backendmanage.mapper.RoleMapper;importorg.springframework.beans.factory.annotation.Autowired;imp......