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

3 5 7
C 1 2
C 2 2
W 1 2
C 3 2
W 1 2
C 3 3
W 1 3

Sample Output

3
3
0

HINT

善用STL

Source

By orzpzmaimeng

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 乱搞的更多相关文章

  1. BZOJ3578:GTY的人类基因组计划2(集合hash,STL)

    Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信 ...

  2. BZOJ3578 : GTY的人类基因组计划2

    关于如何判断一个集合是否出现过: 给每个元素随机一个hash权值,然后xor起来即可 插入删除都只需xor 线段树维护区间有效人数和,以及打标记表示这个区间的集合要全部标记为出现过,并把区间内sum值 ...

  3. 【分块】【哈希】bzoj3578 GTY的人类基因组计划2

    每个房间用一个集合来维护,具体来说,就是给1-n的数每个数一个long long的hash值,往集合S里insert(i),就是S^=HASH[i]:erase(i),也是S^=HASH[i]. 用m ...

  4. [BZOJ 3731] Gty的超级妹子树 (树分块)

    [BZOJ 3731] Gty的超级妹子树 (树分块) 题面 给出一棵树(或森林),每个点都有一个值.现在有四种操作 1.查询x子树里>y的值有多少个 2.把点x的值改成y 3.添加一个新节点, ...

  5. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

  6. BZOJ 3744 Gty的妹子序列

    Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...

  7. BZOJ 3744 Gty的妹子序列 (分块 + BIT)

    3744: Gty的妹子序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1931  Solved: 570[Submit][Status][Dis ...

  8. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  9. bzoj 3744 Gty的妹子序列 区间逆序对数(在线) 分块

    题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 强制在线. 思路 参考:http://www.cnblogs.com/candy99/p/65795 ...

随机推荐

  1. C#输出log信息

    在写程序的过程中,有时候我们需要添加一些log信息,这个时候,可以采用下面的方法来实现. public static void WriteLog(string ExtraMsg, Exception ...

  2. Javascript的ArrayBuffer从Utf8ArrayToString

    由于项目需要,需要从一个已知的ArrayBuffer中读取出字符串,虽然环境是typescript,但最终还是用的js的代码改了一下解决, public Utf8ArrayToStr(array):s ...

  3. ejb3: message drive bean(MDB)示例

    上一篇已经知道了JMS的基本操作,今天来看一下ejb3中的一种重要bean:Message Drive Bean(mdb) 如果要不断监听一个队列中的消息,通常我们需要写一个监听程序,这需要一定的开发 ...

  4. 扩展 easyui-tabs 插件 关闭标签页方法

    $.extend($.fn.tabs.methods,{ allTabs:function(jq){ var tabs = $(jq).tabs('tabs'); var all = []; all ...

  5. [译]用AngularJS构建大型ASP.NET单页应用(三)

    原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single A ...

  6. 踩到一个Emit的坑,留个纪念

    重现代码: var dmFoo = new DynamicMethod("Foo", typeof(void), Type.EmptyTypes); var ilFoo = dmF ...

  7. JavaScript学习笔记-简单的欢迎cookie

    0<!DOCT0000YPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml&quo ...

  8. C# Label显示多行文本及换行(WinForm/WebForm)

    转载: http://www.cnblogs.com/greatverve/archive/2011/10/20/label-multi.html WinForm 很多朋友都会在开发WinForm中遇 ...

  9. python之旅【第一篇】

    python简介 python的起源 追溯Python语言的起源,是从20世纪90年代初由Guido van Rossum,在阿姆斯特丹,开发一个新的脚本解释程序.不知道Guido当初有没有想到,Py ...

  10. .Net Core 1.0.0正式版安装及示例教程

    使用VS Code 从零开始开发调试.NET Core 1.0 RTM. .NET Core 是一个开源的.跨平台的 .NET 实现. VS Code 全称是 Visual Studio Code,V ...