【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2
Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 367  Solved: 159
[Submit][Status][Discuss]
Description
GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增加实验信息点数(不会增加是针对这一群人的,不是对这群人中的每个人,即1,2,3做了实验,1,2再做实验还会增加2点实验点数)
Input
第一行两个整数n,m,q(n,m,q<=10^5)表示人数,房间数和操作数
接下来q行每行一个操作 "C i j"表示让第i个人去房间j "W l r" 表示让区间[l,r]的房间做实验
Output
对于每一个W操作,输出一个数,表示此次操作所获得的实验点数
Sample Input
C 1 2
C 2 2
W 1 2
C 3 2
W 1 2
C 3 3
W 1 3
Sample Output
3
0
HINT
善用STL
Source
Solution
这道题是亲学长zky出的,学长本人有多种做法:传送门
这里采用的是DavidLee1999课件中的方法,利用STL乱搞
首先,我们用set去维护可以计入答案的房间,
所以同时会涉及如何对集合Hash,一个神奇的方法:对每个数rand出来一个longlong,对于集合Hash值,就是对于集合中每个数计算异或和
(这里之所以rand出longlong,考虑生日悖论所导致的冲突)
那么这里还需要记录几个量:每个房间的人数,每个人所在的房间号,再利用map去记录每个集合是否用过
那么对于一次移动,我们删去两个房间,并且最多加入两个新房间,所以其本质上有用的房间数是O(Q)级的
那么每次询问,我们把set中的房间取出统计答案,再标记为已用,并删掉就好了
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<set>
#include<map>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int N,M,Q;
#define MAXN 100010
#define MAXM 100010
long long id[MAXN],room[MAXM];
int num[MAXM],pos[MAXN];
map<long long,bool>mp;
set<int>st;
set<int>::iterator ist;
long long GetHash() {return (((long long)rand()<<) | rand());}
void Change(int x,int y)
{
if (pos[x]==y) return;
st.erase(pos[x]); st.erase(y);
room[pos[x]]^=id[x]; num[pos[x]]--;
if (!mp[room[pos[x]]]) st.insert(pos[x]);
pos[x]=y; room[y]^=id[x]; num[y]++;
if (!mp[room[y]]) st.insert(y);
}
void Solve(int x,int y)
{
int ans=;
for (ist=st.lower_bound(x); ist!=st.end() && *ist<=y; ist=st.lower_bound(x))
mp[room[*ist]]=,ans+=num[*ist],st.erase(ist);
printf("%d\n",ans);
}
int main()
{
srand(++);
N=read(),M=read(),Q=read();
for (int i=; i<=N; i++) id[i]=GetHash(),room[]^=id[i],num[]++,pos[i]=;
st.insert();
while (Q--)
{
char opt[]; scanf("%s",opt);
int x=read(),y=read();
switch (opt[])
{
case 'C' : Change(x,y); break;
case 'W' : Solve(x,y); break;
}
}
return ;
}
随机的话,比较稳妥的是srand(time(0)),但是BZOJ上会RE,那么据说采取妹子的生日会有特殊加成哦(我不会告诉你我用的妹子生日的)
【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞的更多相关文章
- BZOJ3578:GTY的人类基因组计划2(集合hash,STL)
		
Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信 ...
 - BZOJ3578 : GTY的人类基因组计划2
		
关于如何判断一个集合是否出现过: 给每个元素随机一个hash权值,然后xor起来即可 插入删除都只需xor 线段树维护区间有效人数和,以及打标记表示这个区间的集合要全部标记为出现过,并把区间内sum值 ...
 - 【分块】【哈希】bzoj3578 GTY的人类基因组计划2
		
每个房间用一个集合来维护,具体来说,就是给1-n的数每个数一个long long的hash值,往集合S里insert(i),就是S^=HASH[i]:erase(i),也是S^=HASH[i]. 用m ...
 - [BZOJ 3731] Gty的超级妹子树 (树分块)
		
[BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...
 - bzoj 3744: Gty的妹子序列 主席树+分块
		
3744: Gty的妹子序列 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 101 Solved: 34[Submit][Status] Descr ...
 - BZOJ 3744 Gty的妹子序列
		
Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...
 - BZOJ 3744 Gty的妹子序列 (分块 + BIT)
		
3744: Gty的妹子序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1931 Solved: 570[Submit][Status][Dis ...
 - BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】
		
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec Memory ...
 - bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块
		
题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...
 
随机推荐
- 040医疗项目-模块四:采购单模块—采购单创建好之后跳转到采购单修改页面(editcgd.action)
			
我们上一篇文章写到了要从editcgd.action为入口讲.我们要做的事根据edicgd.acion进入到Action层的一个函数,在这个函数里面要做的就是从数据库中把采购单表里面的数据都查出来显示 ...
 - codevs 2606 约数和问题
			
题目描述 Description Smart最近沉迷于对约数的研究中. 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X) ...
 - usb驱动开发22之驱动生命线
			
我们总是很喜欢高潮,不是吗?那就好好对待她哦.我们来看一下linux中的高潮部分设备是怎么从Address进入Configured的. usb_set_configuration函数的代码就不贴了,可 ...
 - Power of Two
			
Given an integer, write a function to determine if it is a power of two. bool isPowerOfTwo(int n) { ...
 - scala 学习笔记(07) 一等公民的函数
			
在scala中一切皆对象,一切皆函数,函数跟Int,String.Class等其它类型是处于同等的地位,换句话说,使用函数跟使用普通的类型一样,没什么区别,因此: 1.函数可以赋值给变量,可以当参数传 ...
 - python数字图像处理(17):边缘与轮廓
			
在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...
 - c++基础 使用智能指针
			
三个智能指针模板(auto_ptr.unique_ptr和shard_ptr)都定义了类似指针的对象(c++11已将auto_ptr摒弃),可以将new获得(直接或间接) 的地址赋给这种对象.当智能指 ...
 - JS事件详解
			
hello,我是沐晴,最近呢,来总结一下 JS中的常用的事件,希望我们都能一起查漏补缺. 焦点事件 焦点事件在表单中经常用到,那什么是焦点呢?比如我们文本框里面的有光标的时候,就是获得了焦点,我们就可 ...
 - Jquery 页面首次加载方式
			
$(document).ready(function(){ alert("111"); }); $(function(){ alert("222"); }); ...
 - 我开源了一个ios应用,你们拿去随便玩
			
今天开源一个ios应用,自己写的,你们拿去随便玩.地址是: https://github.com/huijimuhe/prankPro 光拿来玩不理清个来龙去脉玩的也不开心是吧,那我就给你们摆摆来龙去 ...