给每一个人一个随机数$R_{i}$,将一个消息中所有人的的$R_{i}$在三进制下相加(多次出现需要多个$R_{i}$),最终之和若为0,即判定答案为-1,若为某个$R_{i}$或$R_{i}+R_{i}$(三进制下),则为$i$,否则为-2

显然这一做法是随机的,但其每一次失败都意味者结果为0,但存在若干个$R_{i}$出现次数不为3的倍数,且其之和恰为0(关于结果是$R_{i}$或$R_{i}+R_{i}$可以看作减去$R_{i}$或$R_{i}+R_{i}$)

注意到$R_{i}$是随机的,因此若干个$R_{i}$之和也是随机的,为0的概率恰为$\frac{1}{V}$(其中$V$为值域,应为3的幂次)

但事实上,这里还有两个问题:

1.如何快速判定是否为$R_{i}$或$R_{i}+R_{i}$,由于有$o(n)$个值,且空间仅有128MB,哈希范围仅能为$10^{7}$,因此需要在哈希的基础上,每一个位置再开一个vector(此时哈希范围仅能为$10^{6}$)

2.三进制下暴力计算是$\log_{3}V$的,选择$V=3^{35}$,并预处理出$3^{7}$以内任意两数加法,那么单次加法的复杂度降为$o(5)$(这些都只是常数优化,实际理论复杂度还是$o(\log_{3}V)$)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define K 2187
5 #define mod 1000003
6 #define ll long long
7 vector<int>mat[mod];
8 int n,m,x,y,ans,init[K][K];
9 ll R[N],dep[N<<1];
10 int read(){
11 int x=0,flag=0;
12 char c=getchar();
13 while ((c<'0')||(c>'9')){
14 if (c=='-')flag=1;
15 c=getchar();
16 }
17 while ((c>='0')&&(c<='9')){
18 x=x*10+c-'0';
19 c=getchar();
20 }
21 if (flag)x=-x;
22 return x;
23 }
24 void write(int x){
25 if (x<0){
26 putchar('-');
27 x=-x;
28 }
29 int num[11];
30 num[0]=0;
31 while (x){
32 num[++num[0]]=x%10;
33 x/=10;
34 }
35 if (!num[0])putchar('0');
36 for(int i=num[0];i;i--)putchar(num[i]+'0');
37 putchar('\n');
38 }
39 int add_low(int x,int y){
40 int s=1,ans=0;
41 for(int i=0;i<7;i++){
42 ans=ans+(x+y)%3*s;
43 s*=3,x/=3,y/=3;
44 }
45 return ans;
46 }
47 ll add_high(ll x,ll y){
48 ll s=1,ans=0;
49 for(int i=0;i<5;i++){
50 ans=ans+init[x%K][y%K]*s;
51 s*=K,x/=K,y/=K;
52 }
53 return ans;
54 }
55 int main(){
56 srand(time(0));
57 for(int i=0;i<K;i++)
58 for(int j=0;j<K;j++)init[i][j]=add_low(i,j);
59 n=read(),m=read();
60 for(int i=1;i<=n;i++){
61 for(int j=0;j<35;j++)R[i]=R[i]*3+rand()%3;
62 mat[R[i]%mod].push_back(i);
63 mat[add_high(R[i],R[i])%mod].push_back(i);
64 }
65 for(int i=1;i<=m;i++){
66 x=read(),y=read();
67 x^=ans,y^=ans;
68 dep[i]=add_high(dep[y],R[x]);
69 if (!dep[i])ans=-1;
70 else{
71 ans=-2;
72 for(int j=0;j<mat[dep[i]%mod].size();j++){
73 ll x=R[mat[dep[i]%mod][j]];
74 if ((x==dep[i])||(add_high(x,x)==dep[i])){
75 ans=mat[dep[i]%mod][j];
76 break;
77 }
78 }
79 }
80 write(ans);
81 }
82 return 0;
83 }

[loj502]ZQC的截图的更多相关文章

  1. 【LOJ502】[LibreOJ β Round] ZQC 的截图 (随机化)

    真的是神仙题目啊-- 题目 LOJ502 官方题解 我认为官方题解比我讲得好. 分析 这是一道蒙特卡洛算法的好题 上面那个奇奇怪怪的词是从官方题解里看到的,意思大概就是随机化算法 -- ? 一句话题意 ...

  2. 通过adb方式给安卓手机截图的cmd批处理文件

    @echo off rem  通过adb方式截图rem  需要安装adb ,一般安装了android sdk 默认带了adb ,路径为sdk目录的android-sdk\platform-toolsr ...

  3. canvas与html5实现视频截图功能

    这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...

  4. 记:MySQL 5.7.3.0 安装 全程截图

    前言: 下一个班快讲MySQL数据库了,正好把服务器里面的MySQL卸了重装了一下. 截个图,作为笔记.也正好留给需要的朋友们. 目录: 下载软件 运行安装程序 安装程序欢迎界面 许可协议 查找更新 ...

  5. Atitit onvif 协议截图 getSnapshotUri 使用java

    Atitit onvif 协议截图 getSnapshotUri 使用java 1.1. ONVIF Device Test Tool1 1.2. 源码2 1.3. 直接浏览器访问http://192 ...

  6. 在Ubuntu|CentOS上安装Shutter截图工具及快捷键设置

    简介 Shutter前身叫GScrot,它是一款相当棒的截图软件. 通过Shutter,你可以截取包括选定区域.全屏幕.窗口.窗口内的控件甚至网页的图像.通过内置的强大插件机制,你可以在截图后,对图像 ...

  7. 使用PhantomJS实现网页截图服务

    这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Canvas.Html2Image.Cobra),就是性能不怎么样(如SWT的Brower). ...

  8. 获取View的截图-将View转换为Bitmap对象

    开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...

  9. 跨应用使用Spoon框架截图的方法

    spoon框架是一个很棒的用例驱动跟测试结果生成加工的框架.但在使用spoon-client时,传入参数需要被测应用的activity实例,跨应用测试会很受限(当然也可能是因为我对android不熟导 ...

随机推荐

  1. 从0到1使用Kubernetes系列——Kubernetes入门

    基本概念 Docker 是什么 Docker 起初是 dotCloud 公司创始人 Solomon Hykes 在法国的时候发起的一项公司内部项目,Docker 是基于 dotCloud 公司多年云服 ...

  2. CF739E Gosha is hunting(费用流/凸优化dp)

    纪念合格考爆炸. 其实这个题之前就写过博客了,qwq但是不小心弄丢了,所以今天来补一下. 首先,一看到球的个数的限制,不难相当用网络流的流量来限制每个球使用的数量. 由于涉及到最大化期望,所以要使用最 ...

  3. 如何在印刷品中使用遵循SIL Open Font License协议的字体

    如何在印刷品中使用遵循SIL Open Font License协议的字体 昨天在知乎看到了一个问题,( 如何在设计中声明字体开源许可证? - 知乎 (zhihu.com),恰好最近在研究一些开源协议 ...

  4. Spark分区器浅析

    分区器作用:决定该数据在哪个分区 概览: 仅仅只有pairRDD才可能持有分区器,普通RDD的分区器为None 在分区器为None时RDD分区一般继承至父RDD分区 初始RDD分区数: 由集合创建,R ...

  5. 初始HTML04

    HTML 列表标签 无序列表 默认用实心圆点标识列表项 1 <ul> 2 <li>list item 列表项</li> 3 <li>list item ...

  6. st表树状数组入门题单

    预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...

  7. 大闸蟹的项目分析——CSDN APP

    大闸蟹的软件案例分析 项目 内容 这个作业属于那个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 学习软件工程的相关知识 这个作业在哪个具体方面帮我实现目标 从多角度分析软件 一 ...

  8. Noip模拟36 2021.8.11

    刚题的习惯还是改不了,怎么办??? T1 Dove打扑克 考场上打的动态开点线段树+并查集,考后发现自己像一个傻子,并查集就行.. 这几天恶补数据结构疯了 用树状数组维护后缀和,$siz_i$表示编号 ...

  9. 2021.6.17考试总结[NOIP模拟8]

    T1 星际旅行 其实就是求两条只走一遍的边的方案数. 考场上第一眼就感觉不可做,后来画了几个图,发现好像只要两个边是相连的就可以只走一遍,居然还真拿了30.. 其实是一道欧拉路的题,把每条非自环的边看 ...

  10. 利用DMA实现采样数据的直接搬运存储

    尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作 ...