正题

题目链接: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. vue路由history模式,nginx配置

    nginx配置内容 # For more information on configuration, see: # * Official English Documentation: http://n ...

  2. 基于taro封装底下浮动弹窗组件

    先看效果图: jsx: import Taro, { Component } from '@tarojs/taro' import { View, Image } from '@tarojs/comp ...

  3. wpf 绘图

  4. 使用GZIP压缩网页内容(一)

    在JDK中提供了GZIP压缩,来压缩网页的内容,降低网络传输时候的字节数,到达浏览器端的时候,再解压,GZIP压缩之后传输耗费的流量大大降低,但是同时也不会降低用户体验. package day04; ...

  5. C# - 习题03_分析代码写出结果A.X、B.Y

    时间:2017-08-23 整理:byzqy 题目:分析代码,写出程序的输出结果: 文件:Program.cs 1 using System; 2 3 namespace Interview2 4 { ...

  6. 谷歌api 二维码生成 实例

    谷歌提供的二维码生成器接口,非常实用!分享给大家 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  7. djangoProject default codes

    1 === 2 settings.py 3 === 4 """ 5 Django settings for djangoProject project. 6 7 Gene ...

  8. CentOS 安装制定版本docker

    # 1) 配置镜像仓库 curl -o /etc/yum.repos.d/Docker-ce-Ali.repo https://mirrors.aliyun.com/docker-ce/linux/c ...

  9. javassist 使用笔记

    javassist Javassist 是一个开源的分析.编辑和创建Java字节码的类库.其主要的优点,在于简单,而且快速.直接使用 java 编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构 ...

  10. 妙用 background 实现花式文字效果

    本文将讲解如何利用 background 系列属性,巧妙的实现一些花式的文字效果.通过本文,你将可以学到: 通过 background-size 与 background-position 实现酷炫的 ...