讲题前先讲故事

miaom:你快来做这道题啊啊==我已经A掉了我教你 啊

YYMHL:吼啊

10 min later

miaom:你听懂了嘛?

YYMHL:不对啊

10 min later

YYMHL:我把你hack掉了啊

miaom:!!!那  你帮我改一下就当你自己做的好了

以下内容转自http://blog.csdn.net/Miao_zc/article/details/73656324

给每个数一个随机权值,如果两个序列的数的随机权值异或和相等可以认为这两个序列排序后相同。考虑主席树,对于两个区间l~r的数,二分一个将那对不同的数分开的数值,然后用区间最大(小)查询就能得到那两个不同的数,再判断一下即可。

复杂度由于在线段树上二分,复杂度O(nlogn)。

至于那个随机为什么对,只要考虑如果两个序列相等,异或和必定相等,否则最后的异或和是随机的,有2^-64相同,(1-2^-64)^(nlogn)的概率正确。//大概算出来是这个东西:

YYMHL:你这样异或分不清[1,1,1,2]和[1,2,2,2]啊,您会输出Y啊

miaom:mmp

#include<bits/stdc++.h>
#define ll long long
#define N 100005
#define M 100000
#define mod 2333333333333341
using namespace std;
int T,n,q,a[N],Rt[N];
int ls[2000005],rs[2000005],cnt,sz[2000005];
ll v[2000005],b[N];
ll rd()
{return ((ll)rand()<<31LL)|rand();
}
void add(int p,int &q,int l,int r,int x)
{q=++cnt;v[q]=(v[p]+b[x])%mod;sz[q]=sz[p]+1;ls[q]=rs[q]=0;if (l==r)return;int mid=l+r>>1;if (x<=mid) rs[q]=rs[p],add(ls[p],ls[q],l,mid,x);else ls[q]=ls[p],add(rs[p],rs[q],mid+1,r,x);
}
int qMx(int x,int y,int l,int r)
{if (l==r) return l;int mid=l+r>>1;if (sz[rs[x]]!=sz[rs[y]]) return qMx(rs[x],rs[y],mid+1,r);return qMx(ls[x],ls[y],l,mid);
}
int qMn(int x,int y,int l,int r)
{if (l==r) return l;int mid=l+r>>1;if (sz[ls[x]]!=sz[ls[y]]) return qMn(ls[x],ls[y],l,mid);return qMn(rs[x],rs[y],mid+1,r);
}
bool check(int l1,int r1,int l2,int r2)
{int l=1,r=M,mid;l1=Rt[l1-1];r1=Rt[r1];l2=Rt[l2-1];r2=Rt[r2];if ((v[r1]-v[l1]+mod)%mod==(v[r2]-v[l2]+mod)%mod&&sz[r1]-sz[l1]==sz[r2]-sz[l2]) return 1;while(l<r){mid=l+r>>1;if ((v[ls[r1]]-v[ls[l1]]+mod)%mod==(v[ls[r2]]-v[ls[l2]]+mod)%mod&&sz[ls[r1]]-sz[ls[l1]]==sz[ls[r2]]-sz[ls[l2]])r1=rs[r1],l1=rs[l1],r2=rs[r2],l2=rs[l2],l=mid+1;else if ((v[rs[r1]]-v[rs[l1]]+mod)%mod==(v[rs[r2]]-v[rs[l2]]+mod)%mod&&sz[rs[r1]]-sz[rs[l1]]==sz[rs[r2]]-sz[rs[l2]])r1=ls[r1],l1=ls[l1],r2=ls[r2],l2=ls[l2],r=mid;else{if ((sz[ls[r1]]-sz[ls[l1]])-(sz[ls[r2]]-sz[ls[l2]])==-1)swap(l1,l2),swap(r1,r2);if ((sz[ls[r1]]-sz[ls[l1]])-(sz[ls[r2]]-sz[ls[l2]])==1)if ((v[r1]-v[l1]-b[qMx(ls[l1],ls[r1],l,mid)]+mod*2)%mod==(v[r2]-v[l2]-b[qMn(rs[l2],rs[r2],mid+1,r)]+mod*2)%mod)return 1;return 0;}}return 1;
}
void work()
{cnt=0;scanf("%d%d",&n,&q);for (int i=1;i<=n;i++){scanf("%d",&a[i]);add(Rt[i-1],Rt[i],1,M,a[i]);}for (int i=1;i<=q;i++){int l1,l2,r1,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);puts(check(l1,r1,l2,r2)?"YES":"NO");}
}
int main()
{freopen("1.in","r",stdin);freopen("1.out","w",stdout);srand(time(0));for (int i=1;i<=M;i++)b[i]=(rd()%mod+mod)%mod;sort(b+1,b+M+1);for (int i=1;i<=M;i++)b[i]=(b[i]+i)%mod;random_shuffle(b+1,b+M+1);scanf("%d",&T);while(T--) work();//system("pause");
}

另外一个故事:
YYMHL:为毛我A不掉啊
miaom:是不是随机种子的锅啊
YYMHL:这都可以
YYMHL:***Linux里面rand()可以到int啊QAQ你的种子会炸longlong的啊
miaom:可我过了啊
YYMHL:异或管你符号位啊
YYMHL:要是就这么A了就把你A了吧
wlc1121&wzf2000&caili413:吼啊吼啊
YYMHL:过了
miaom:-------

loj#6169. 相似序列相关推荐

  1. loj#6169. 相似序列 hash+主席树

    因为他的相似是在排完序下的 那我就在排序的情况下hash啊 这怎么hash啊 主席树啊! 没了 1 #include <bits/stdc++.h> 2 #define MAXNODE 5 ...

  2. Loj 2534 异或序列

    Loj 2534 异或序列 考虑莫队离线处理.每加一个数,直接询问 \(a[x]\oplus k\) 的前/后缀数目即可,减同理. 利用异或的优秀性质,可以维护异或前缀和,容易做到每次 \(O(1)\ ...

  3. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  4. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  5. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

  6. DNA序列 LOJ NOIP模拟赛 D1T1 字符串哈希

    字符串哈希 上代码 #include<cstdio> #include<cstring> #include<string> #include<iostream ...

  7. 【LOJ】#2534. 「CQOI2018」异或序列

    题解 每个数都处理成前缀和,就相当于问\([l - 1,r]\)有几个数对\(x,y\),\(sum[x] ^ sum[y] = k\) 直接莫队即可 代码 #include <bits/std ...

  8. LOJ #2878. 「JOISC 2014 Day2」邮戳拉力赛 动态规划+括号序列

    神题呀,我们观察到行走的方式一定是一条链+若干条环. 然后环可以看成是一对括号,所以来一个基于括号序的 DP. code: #include <bits/stdc++.h> #define ...

  9. loj6169 相似序列(可持久化线段树)

    题目: https://loj.ac/problem/6169 分析: 如果是要求两段序列全等的话,有一个套路: 对于{a1,a2,a3} {a4,a5,a6} 设一个素数p,那么如果p^a1+p^a ...

最新文章

  1. c 将图片存入到mysql数据库中_如何将图片转换存入到数据库中,并从数据库中取出转换成图片...
  2. 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...
  3. php项目自动布署mysql_如何自动化一键部署PHP项目
  4. 简单说说你对Java内存模型的原子性的了解吧?
  5. 从 FFmpeg 性能加速到端云一体媒体系统优化
  6. 使用 Ajax 实现本地化后的客户端消息验证
  7. mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...
  8. java小程序显示多种按钮_微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能...
  9. cocos2d-x将背景色改为白色
  10. SpringMCV结构
  11. Xshell连接不上行Linux系统
  12. SPSS统计术语与思维【SPSS 002期】
  13. 读Zepto源码之Touch模块
  14. Unity 官方标准资源下载(standard assets)2种方式
  15. linux系统分区表修复
  16. AI 金融行业案例清单
  17. openwrt默认mac地址配置(MT7620a)
  18. FreeRTOS学习笔记【一】——初识FreeRTOS
  19. L5W2作业1 Emojify!
  20. 店宝宝:拼多多的成名史

热门文章

  1. crakeme ----- figue3b writeup
  2. 服务器如何查看c盘隐藏文件,c盘怎么查看隐藏文件,华为手机如何隐藏应用?...
  3. html5onclick跳转,html中onclick事件属性定义与用法
  4. 第十一课:正则表达式,包装类
  5. 将网页分享至QQ或QQ空间
  6. 线性代数实践及MATLAB入门
  7. Win7截图快捷键是什么?
  8. 爬取智联招聘信息并且存入数据库
  9. Android多媒体之LAME MP3录音转换
  10. 【Office知识】日常常用Excel操作记录