[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不熟导 ...
随机推荐
- Edit Step Ladders - UVA 10029
题意 题目链接(Virtual Judge):Edit Step Ladders - UVA 10029 题意: 如果单词 \(x\) 能通过添加.删除或修改一个字母变换为单词 \(y\),则称单词 ...
- 密码学系列之:加密货币中的scrypt算法
目录 简介 scrypt算法 scrypt算法详解 scrypt的使用 简介 为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合.但是这些算法逐渐被一些特 ...
- xshell连接VMware中的Linux
[前言]最近想压测一下ITOO的考试系统,所以想在自己电脑上安装一下linux,然后安装一下jmeter进行压测一下. 不过为什么要连接xshell呢,因为在虚拟机上总是会和主机切换鼠标,而且也不能粘 ...
- Rvalue References
Rvalue References
- 2 What is the Domain Driven Design? 什么是领域驱动设计
What is the Domain Driven Design? 什么是领域驱动设计 Domain-driven design (DDD) is an approach to software de ...
- 第二次Scrum Metting
日期:2021年4月25日会议主要内容概述:前后端针对WebAPI进行协调与统一工作,商量接下来两日计划:敲定部分设计细节. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中 ...
- [技术博客] 软工-Ruby on Rails 后端开发总结分享
[技术博客] 软工-Ruby on Rails 后端开发总结分享 在这次软件编写中,我们的后端使用了Ruby on Rails (RoR)框架. Rails框架是用Ruby编写的.这意味着当我们为Ru ...
- 【二食堂】Alpha - Scrum Meeting 10
Scrum Meeting 10 例会时间:4.20 18:00~18:20 进度情况 组员 昨日进度 今日任务 李健 1. 与柴博合作完成登录注册页面issue 继续完成登录注册页面issue 柴博 ...
- 如何洗白xi校长?(初稿)
看看咱们太子殿下,谁还敢黑全世界最好的太子殿下 我们不如来考虑一下如何给校长洗白. 第一当然是买断热搜了.买断热搜可以阻止消息进一步传播.当然这种操作学校再8月18日晚就已经做过了.8月18日该条消息 ...
- 算法:数字推盘游戏--重排九宫(8-puzzle)
一.数字推盘游戏 数字推盘游戏(n-puzzle)是一种最早的滑块类游戏,常见的类型有十五数字推盘游戏和八数字推盘游戏等.也有以图画代替数字的推盘游戏.可能Noyes Palmer Chapman在1 ...