首页 > 其他分享 >【题解】P5169 xtq的异或和

【题解】P5169 xtq的异或和

时间:2023-01-31 20:33:55浏览次数:60  
标签:原图 const int 题解 vis 异或 maxn P5169 dis

再强没有 xtq!!!1

思路

多项式的正确用法。

首先根据 P4151 [WC2011]最大XOR和路径 的神秘结论,这里只需要任意求出原图的一棵生成树,以及所有只包含一条非树边的简单环就可以维护原图的所有路径了。

对于两点 \(u, v\),令 \(\operatorname{dis}(u)\) 为生成树上点 \(u\) 到根的路径异或和,\(x\) 为原图中任意一个合法简单环的权值,则原图中 \(u, v\) 之间所有路径的贡献等价于 \(\operatorname{dis}(u) \oplus \operatorname{dis}(v) \oplus x\) 的贡献。

于是想到用线性基一类的东西去维护每一个合法环的权值,但是这里有更简单的做法。

考虑令 \(G[i]\) 表示是否存在异或和为 \(i\) 的合法环。每次插入一个权值为 \(x\) 的合法环时,\(\forall i\),如果 \(G[x] = 0\),则 \(G[i \oplus x]\) 也一定等于 \(0\),不然可以反推出 \(G[x] = 1\).

每次暴力插入完之后 \(\sum\limits_{i} G[i]\) 至少翻倍,所以时间复杂度是 \(O(V \log V)\).

令 \(F[i] = \sum\limits_{j = 1}^n [\operatorname{dis}(j) = i]\),那么询问 \(x\) 时答案为 \(\sum\limits_{i \oplus j = x} F[i] \cdot F[i] \cdot G[j]\).

发现实际上是一个位运算卷积的形式,考虑上 FWT 就可以 \(O(n \log n)\) 做了。

代码

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

typedef long long ll;

const int maxn = 1e5 + 5;
const int maxm = 3e5 + 5;
const int lim = 262144;
const int mod = 998244353;

struct node
{
    int u, v, w;
    bool vis;
} edge[maxm];

int n, m, q;
int dis[maxn];
ll F[lim], G[lim];
bool vis[maxn];
vector<int> g[maxn], w[maxn], idx[maxn];

void dfs(int u)
{
    vis[u] = true;
    F[dis[u]]++;
    for (int i = 0; i < g[u].size(); i++)
    {
        int v = g[u][i], d = w[u][i], id = idx[u][i];
        if (vis[v]) continue;
        dis[v] = dis[u] ^ d;
        edge[id].vis = true;
        dfs(v);
    }
}

void FWT(ll *F, int n)
{
    for (int len = 2, m = 1; len <= n; m = len, len <<= 1)
    {
        for (int l = 0, r = len - 1; r <= n; l += len, r += len)
        {
            for (int p = l; p < l + m; p++)
            {
                ll val = F[p];
                F[p] = F[p] + F[p + m];
                F[p + m] = val - F[p + m];
            }
        }
    }
}

void IFWT(ll *F, int n)
{
    for (int len = 2, m = 1; len <= n; m = len, len <<= 1)
    {
        for (int l = 0, r = len - 1; r <= n; l += len, r += len)
        {
            for (int p = l; p < l + m; p++)
            {
                ll val = F[p];
                F[p] = (F[p] + F[p + m]) / 2;
                F[p + m] = (val - F[p + m]) / 2;
            }
        }
    }
}

int main()
{
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1, u, v, d; i <= m; i++)
    {
        scanf("%d%d%d", &u, &v, &d);
        edge[i] = (node){u, v, d};
        g[u].push_back(v), w[u].push_back(d), idx[u].push_back(i);
        g[v].push_back(u), w[v].push_back(d), idx[v].push_back(i);
    }
    dfs(1);
    G[0] = 1;
    for (int i = 1; i <= m; i++)
    {
        if (!edge[i].vis)
        {
            int res = edge[i].w ^ dis[edge[i].u] ^ dis[edge[i].v];
            if (!G[res])
                for (int j = 0; j < lim; j++)
                    if (G[j]) G[j ^ res] = 1;
        }
    }
    FWT(F, lim), FWT(G, lim);
    for (int i = 0; i < lim; i++) F[i] = F[i] * F[i] * G[i];
    IFWT(F, lim);
    while (q--)
    {
        int x;
        scanf("%d", &x);
        printf("%lld\n", F[x] % mod);
    }
    return 0;
}

标签:原图,const,int,题解,vis,异或,maxn,P5169,dis
From: https://www.cnblogs.com/lingspace/p/p5169.html

相关文章

  • 调用后台接口实现Excel导出功能以及导出乱码问题解决
    实现效果在导出表格数据的时候,通常分为两种情况页面列表数据导出接口返回数据导出这里主要介绍接口返回数据导出,关于页面的列表数据导出,请看另一篇:vue3+element表格......
  • CF1400E Clear the Multiset 题解 贪心+分治
    题目链接:http://codeforces.com/problemset/problem/1400/E题目大意:给定一个长度为\(n\)数列\(\{a_n\}\),你可以进行如下操作:操作1:任意选择一个区间\([l,r]\),使区间内......
  • P6327 区间加区间sin和 题解
    P6327区间加区间sin和题解第一道Ynoi(捂脸题目描述给出一个长度为\(n\)的整数序列\(a_1,a_2,\ldots,a_n\),进行\(m\)次操作,操作分为两类。操作\(1\):给出\(l,r,v......
  • [SDOI2008] 仪仗队【题解】
    题目描述作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的\(N\timesN\)的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所......
  • Luogu P4145 上帝造题的七分钟 2 / 花神游历各国 题解
    Luogu链接:上帝造题的七分钟2/花神游历各国${\scr\color{Orchid}{\text{Solution}}}$题目大意支持两种操作:区间开方(向下取整)区间求和分析发现线段树容易实......
  • AT dp 26 题 题解
    题单:https://www.luogu.com.cn/training/100578#problems嘛虽然是26题,但是简单的题就不想写了...就写绿题及以上的吧目录EIJMOPQRSTUVE对重量dp,设\(dp[i][v]\)表......
  • uniapp webview中动态设置公众号文章标题不显示问题解决
    设置在onLoad中可能会引起偶发性无效。解决方案:1、改写在onReady生命周期中。2、用setTimeout设置延迟。 onReady(){this.timers=setTimeout(()=>{......
  • USACO2023 Bronze 题解
    Problem1.Leaders\(\mathcal{Farmer\John}\)共有\(n\)头奶牛,品种用字符\(\mathsf{G}\)或\(\mathsf{H}\)表示。每一头牛有一个管辖区间\([i,E_i]\)称一头......
  • 算法:线段树&&Luogu p3372题解
    前言不愧是线段树,竟然卡我这么久,还是那句话:十年OI一场空,不开longlong见祖宗#1什么是线段树?线段树长什么样?通俗一点,线段树就是线段,树。实际上,线段树是一棵完全......
  • CF1067E 题解
    题意传送门给定一棵\(n\)个节点的树,每条边有\(\frac{1}{2}\)的概率出现,可以得到一个森林,求这个森林邻接矩阵的秩的期望。\(1\len\le5\times10^5\)。题解此题关键......