[loj502]ZQC的截图
给每一个人一个随机数$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的截图的更多相关文章
- 【LOJ502】[LibreOJ β Round] ZQC 的截图 (随机化)
真的是神仙题目啊-- 题目 LOJ502 官方题解 我认为官方题解比我讲得好. 分析 这是一道蒙特卡洛算法的好题 上面那个奇奇怪怪的词是从官方题解里看到的,意思大概就是随机化算法 -- ? 一句话题意 ...
- 通过adb方式给安卓手机截图的cmd批处理文件
@echo off rem 通过adb方式截图rem 需要安装adb ,一般安装了android sdk 默认带了adb ,路径为sdk目录的android-sdk\platform-toolsr ...
- canvas与html5实现视频截图功能
这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...
- 记:MySQL 5.7.3.0 安装 全程截图
前言: 下一个班快讲MySQL数据库了,正好把服务器里面的MySQL卸了重装了一下. 截个图,作为笔记.也正好留给需要的朋友们. 目录: 下载软件 运行安装程序 安装程序欢迎界面 许可协议 查找更新 ...
- Atitit onvif 协议截图 getSnapshotUri 使用java
Atitit onvif 协议截图 getSnapshotUri 使用java 1.1. ONVIF Device Test Tool1 1.2. 源码2 1.3. 直接浏览器访问http://192 ...
- 在Ubuntu|CentOS上安装Shutter截图工具及快捷键设置
简介 Shutter前身叫GScrot,它是一款相当棒的截图软件. 通过Shutter,你可以截取包括选定区域.全屏幕.窗口.窗口内的控件甚至网页的图像.通过内置的强大插件机制,你可以在截图后,对图像 ...
- 使用PhantomJS实现网页截图服务
这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片.研究了不少工具,效果都不理想,不是显示太差了(Canvas.Html2Image.Cobra),就是性能不怎么样(如SWT的Brower). ...
- 获取View的截图-将View转换为Bitmap对象
开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...
- 跨应用使用Spoon框架截图的方法
spoon框架是一个很棒的用例驱动跟测试结果生成加工的框架.但在使用spoon-client时,传入参数需要被测应用的activity实例,跨应用测试会很受限(当然也可能是因为我对android不熟导 ...
随机推荐
- 华为Awareness kit,您旅途路上的超智能管家
前言 前段时间看了一部纪录片<中国游客在巴黎>,讲述了外国人眼中"中国式旅游":热衷景点打卡,沉迷拍照留念,无暇仔细欣赏:留足时间,买买买,不能枉此行.网友总结中国式旅 ...
- Redis缓存穿透、缓存击穿、缓存雪崩的介绍及其解决方案
首先,来画一张图了解下缓存处理的流程 一.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求查询该数据,导致数据库压力过大. 解决方案: 1.接口校验 如鉴权校验.数据合法性 ...
- java设计模式_工厂模式
关于设计模式 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结,是一种设计思维,使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证 ...
- Python中is与==区别
1.在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的, ...
- c语言中一条竖线是什么符号?
"|"在C语言中表示按位或,是双目运算符.其功能是参与运算的两数各对应的二进位(也就是最后一位)相或.只要对应的二个二进位有一个为1时,结果位就为1.参与运算的两个数均以补码出现. ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- django-admin和django-admin.py的区别
问题 django初学者在使用django-admin创建项目时容易出现无法创建的错误,这是因为网上很多教程用的都是django-admin.py创建的项目,不出意外的话,你输入相同的命令会发现项目没 ...
- [对对子队]会议记录5.22(Scrum Meeting9)
今天已完成的工作 梁河览 工作内容:修改第一到九关新手引导,修复关卡选择bug 相关issue:优化初步导出版本 相关签入:fix:修改第一关到第九关的新手引导和地图场景的bug 马嘉 ...
- 【二食堂】Alpha - Scrum Meeting 5
Scrum Meeting 5 例会时间:4.15 12:30 - 13:00 进度情况 组员 昨日进度 今日任务 李健 1. 主页搭建结束issue2. 与后端协商确定接口的设计3. 查找文本区域功 ...
- mysql分表之后怎么平滑上线?
分表的目的 项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询数据变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑 ...