正题

题目链接:https://www.luogu.com.cn/problem/P7717


题目大意

求有多少个长度为\(n\)的序列\(a\)满足,都在\([0,k]\)的范围内且满足\(m\)个限制刑如:\(a_x\ xor\ a_y=z\)

\(0\leq n,m\leq 5\times 10^5,0\leq k<2^{30}\)


解题思路

首先假设有合法方案,那么对于一个位置\(a_x\)确定之后与它直接或间接限制的\(a_y\)都将被确定。

我们可以设限制为一条边,然后先\(dfs\)判断一次是否限制之间没有冲突。

然后考虑对于每个联通块我们随意找到一个位置\(x\),那么其他的点都将被表达为\(a_x\ xor\ w\)的形式。

然后我们要求找到有多少个\(a_x\)满足对于所有的\(w\)都有\(a_x\ xor\ w\leq k\)。

这个可以用\(Trie\)数来做,每次封闭的是一个子树,直接处理就好了。

时间复杂度\(O(n\log k)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=5e5+10,P=1e9+7;
struct node{
ll to,next,w;
}a[N<<1];
ll n,m,k,tot,ls[N],z[N];
ll cnt,t[N][2],res,ans=1;
bool v[N];stack<ll > s;
void addl(ll x,ll y,ll w){
a[++tot].to=y;
a[tot].next=ls[x];
ls[x]=tot;a[tot].w=w;
return;
}
bool dfs(ll x){
v[x]=1;s.push(z[x]);
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(v[y]){
if((z[x]^a[i].w)!=z[y])
return 1;
}
else{
z[y]=z[x]^a[i].w;
if(dfs(y))return 1;
}
}
return 0;
}
void Limit(ll &x,ll w,ll p){
if(x==-1||p<0)return;
if(!x){x=++cnt;t[x][0]=t[x][1]=0;}
if((k>>p)&1)Limit(t[x][(w>>p)&1^1],w,p-1);
else{
t[x][(w>>p)&1^1]=-1;
Limit(t[x][(w>>p)&1],w,p-1);
}
return;
}
void Count(ll x,ll L,ll R){
if(L>k)return;
if(x==-1)res-=min(R,k)-L+1;
if(x<=0)return;
ll mid=(L+R)>>1;
Count(t[x][0],L,mid);
Count(t[x][1],mid+1,R);
return;
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=1;i<=m;i++){
ll x,y,w;
scanf("%lld%lld%lld",&x,&y,&w);
addl(x,y,w);addl(y,x,w);
}
res=0;
for(ll i=1;i<=n;i++){
if(v[i])continue;cnt=t[0][0]=0;
if(dfs(i))return puts("0")&0;
while(!s.empty())Limit(t[0][0],s.top(),29),s.pop();
res=k+1;Count(1,0,(1<<30)-1);
ans=ans*res%P;
}
printf("%lld\n",ans);
return 0;
}

P7717-「EZEC-10」序列【Trie】的更多相关文章

  1. 「HNOI 2016」 序列

    \(Description\) 给你一个序列,每次询问一个区间,求其所有子区间的最小值之和 \(Solution\) 这里要用莫队算法 首先令\(val\)数组为原序列 我们考虑怎么由一个区间\([l ...

  2. 【LOJ】#2056. 「TJOI / HEOI2016」序列

    题解 这个我们处理出来每一位能变化到的最大值和最小值,包括自身 然后我们发现 \(f[i] = max(f[i],f[j] + 1) (mx[j] <= a[i] && a[j] ...

  3. 「HEOI2016/TJOI2016」序列

    题目链接 戳这 Solution 首先考虑最暴力的dp 我们设: \(f[i]\)表示选择\(i\)以后所能形成的满足条件的子序列的最大值 \(minx[i]\)表示\(i\)能转换为的最小值 \(m ...

  4. loj2056 「TJOI / HEOI2016」序列

    当年我还没学cdq的时候在luogu上写过树套树的代码orzzz ref #include <algorithm> #include <iostream> #include & ...

  5. 洛谷比赛 「EZEC」 Round 4

    洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...

  6. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  7. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  8. loj #2051. 「HNOI2016」序列

    #2051. 「HNOI2016」序列 题目描述 给定长度为 n nn 的序列:a1,a2,⋯,an a_1, a_2, \cdots , a_na​1​​,a​2​​,⋯,a​n​​,记为 a[1: ...

  9. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  10. 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie

    #10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...

随机推荐

  1. js清空input file的值

    原文:js清空input file的值 在做选择本地图片上传的功能时遇到一个问题,第一次点file按钮选择图片完成会触发onchange事件,获取文件后动态在界面上创建img标签展示,但把创建的img ...

  2. jenkins部署web项目

    Dockerfile FROM nginx:latest #MAINTAINER 维护者信息 MAINTAINER GosingWu 1649346712@qq.com ADD admin_test. ...

  3. QT5学习:分割窗口类的使用

    分割窗口在应用程序中经常用到,它可以灵活分布窗口布局,经常用于类似文件资源管理器的窗口设计中,然后抱着这样的想法简单的实现了下 [cpp]  view plain copy   //main.cpp ...

  4. Java学习之 多态 Polymorphism

    转自:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html 多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一 ...

  5. Shell中的运算

    1.运算方式及运算符号 2.SHELL 中常用的运算命令 3.相关操作演示 1.用脚本写一个10秒倒计时 脚本的执行: 2.编写脚本,1分10秒的倒计时 执行脚本: 3.编写脚本,制作一个计算器 脚本 ...

  6. docker-harbor私有仓库使用笔记

    1. 登录harbor管理页面,创建项目,比如yuqx_test 2. admin登录,此处免密登录,正常情况下会输入账号密码 [root@k8s-rancher2 ~]# docker login ...

  7. Excel 快速跳转到工作表

    新建 vba 模块 Sub GotoSheet() tname = InputBox("input table name") If StrPtr(tname) = 0 Then E ...

  8. Redis的配置文件

  9. 【SpringCloud技术专题】「Eureka源码分析」从源码层面让你认识Eureka工作流程和运作机制(上)

    前言介绍 了解到了SpringCloud,大家都应该知道注册中心,而对于我们从过去到现在,SpringCloud中用的最多的注册中心就是Eureka了,所以深入Eureka的原理和源码,接下来我们要进 ...

  10. openwrt开发笔记三:uci移植及API调用

    1.uci编译安装.移植 安装依赖 libubox #安装cmake sudo apt-get install cmake #下载依赖库libubox git clone http://git.nbd ...