正题

题目链接: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. SpringBoot枚举传参

    创建一个接口所有枚举继承 package com.gecko.charging.common; public interface BaseEnum { Integer getCode(); } 具体的 ...

  2. java实现随机字母数字验证码

    生成随街验证码 VerifyCode 工具类 package com.meeno.common.cerifycode; import javax.imageio.ImageIO; import jav ...

  3. 转: SIFT原理解释

    1.SIFT概述 SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的.SIFT特征对旋转.尺度缩放.亮度变 ...

  4. C++ CLI简介(什么是C++ CLI)

    要知道C++/CLI是什么,首先知道什么是CLI. 一.CLI简介 CLI:(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环 ...

  5. Semaphore 类 的使用理解C#

    示例 下面的代码示例创建一个信号量,其最大计数为3,初始计数为零. 该示例启动五个线程,这会阻止等待信号量. 主线程使用 Release(Int32) 方法重载将信号量计数增加到其最大值,从而允许三个 ...

  6. 二:Servlet简介

    一.Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是 ...

  7. WPF 中的 经典的ModelView 通知页面更新 UI

    view model ------------------------------------------------------------------------------ using HPCo ...

  8. MongoDB查询或修改内嵌文档

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...

  9. [题解] P4556 [Vani有约会]雨天的尾巴

    [题解] P4556 [Vani有约会]雨天的尾巴 ·题目大意 给定一棵树,有m次修改操作,每次修改 \(( x\) \(y\) \(z )\) 表示 \((x,y)\) 之间的路径上数值 \(z\) ...

  10. Linkerd 2.10(Step by Step)—配置超时

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...