[POI2008] Poc (原名 Trians) Treap+Hash
这个题和千山鸟飞绝体现出了一种用平衡树解决动态集合问题,主要套路就是蜜汁标记。
这个题我一开始用替罪羊树搞了一下对了28个点,后来我换成了Treap一搞对了14个点,再后来发现被卡了Hash我竟然在自然溢出中用了256....
上代码
#include<cstdio>
#include<cstring>
#include<map>
#include<cstdlib>
#define N 1010
#define L 110
#define M 100010
using namespace std;
typedef unsigned long long ULL;
const ULL base=;
ULL tool[L];
ULL hash[N];
char s[N][L];
int size[N],n,l,m;
map<ULL,int>Hash;
inline int Max(int x,int y){ return x>y?x:y; }
inline void swap(char &a,char &b){char c=a;a=b;b=c;}
struct Treap
{
Treap *ch[];
int size,Max,i,r;
Treap(){ch[]=ch[]=NULL;size=Max=i=r=;}
}node[(N+M)<<],*null,*root[(N+M)<<];
int sz,tp;
inline void Init()
{
null=node;
null->size=null->Max=null->i=null->r=;
null->ch[]=null->ch[]=null;
for(int i=;i<((N+M)<<);i++)root[i]=null;
}
inline Treap *New(int i)
{
Treap *p=&node[++sz];
p->ch[]=p->ch[]=null;
p->Max=;
p->i=i;
p->size=;
p->r=rand()+;
return p;
}
inline void pushup(Treap *p)
{
if(p==null)return;
p->size=p->ch[]->size+p->ch[]->size+;
}
inline void down(Treap *p,int x)
{
size[p->i]=Max(size[p->i],x);
p->Max=Max(p->Max,x);
}
inline void pushdown(Treap *p)
{
if(p->Max==)return;
if(p->ch[]!=null) down(p->ch[],p->Max);
if(p->ch[]!=null) down(p->ch[],p->Max);
p->Max=;
}
inline void rotate(Treap *&p)
{
int wh=p->ch[]->r>p->ch[]->r;
Treap *ch=p->ch[wh];
pushdown(p);
pushdown(ch);
p->ch[wh]=ch->ch[wh^];
ch->ch[wh^]=p;
pushup(p);
pushup(ch);
p=ch;
}
void insert(Treap *&p,int i)
{
if(p==null)
{
p=New(i);
return;
}
pushdown(p);
insert(p->ch[p->i<i],i);
if(p->r<p->ch[p->i<i]->r)rotate(p);
pushup(p);
}
void del(Treap *&p,int i)
{
pushdown(p);
if(p->i==i)
{
if(p->ch[]==null||p->ch[]==null)
{
p=p->ch[]==null?p->ch[]:p->ch[];
pushup(p);
return;
}
rotate(p);
del(p->ch[p->ch[]->i==i],i);
pushup(p);
return;
}
del(p->ch[p->i<i],i);
pushup(p);
return;
}
inline void Insert(int i)
{
insert(root[Hash[hash[i]]],i);
down(root[Hash[hash[i]]],root[Hash[hash[i]]]->size);
}
inline void Del(int i)
{
del(root[Hash[hash[i]]],i);
}
int main()
{
Init();
scanf("%d%d%d",&n,&l,&m);
tool[]=;
for(int i=;i<=l;i++) tool[i]=tool[i-]*base;
for(int i=;i<=n;i++)
{
scanf("%s",s[i]+);
for(int j=;j<=l;j++)hash[i]=hash[i]*base+s[i][j];
if(Hash[hash[i]]==)Hash[hash[i]]=++tp;
Insert(i);
}
for(int i=;i<=m;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
Del(a);
if(a!=c)Del(c);
hash[a]-=s[a][b]*tool[l-b];
hash[c]-=s[c][d]*tool[l-d];
swap(s[a][b],s[c][d]);
hash[a]+=s[a][b]*tool[l-b];
hash[c]+=s[c][d]*tool[l-d];
if(Hash[hash[a]]==)Hash[hash[a]]=++tp;
Insert(a);
if(a!=c){if(Hash[hash[c]]==)Hash[hash[c]]=++tp;Insert(c);}
}
for(int i=;i<=n;i++)Del(i);
for(int i=;i<=n;i++)printf("%d\n",size[i]);
return ;
}
[POI2008] Poc (原名 Trians) Treap+Hash的更多相关文章
- 【BZOJ1125】[POI2008]Poc hash+map+SBT
[BZOJ1125][POI2008]Poc Description n列火车,每条有l节车厢.每节车厢有一种颜色(用小写字母表示).有m次车厢交换操作.求:对于每列火车,在交换车厢的某个时刻,与其颜 ...
- [Bzoj1014][JSOI2008]火星人prefix(无旋Treap&hash)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 因为涉及到增加和修改,所以后缀数组就被pass掉了,想到的就是平衡树维护hash值 ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)
[JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...
- bzoj1125:[POI2008]Poc
传送门 这个题好难卡啊. 看到这种题自然会想到字符串hash是不是,但是对于每次操作造成的影响需要\(O(n)\)的时间去更新,自然是不优的 可以发现这个更新可以用数据结构来维护,对于每个hash值开 ...
- 关于 SSV-ID: 4474 POC的分析和思考
SSV-ID: 4474 SSV-AppDir: Discuz!漏洞 发布时间: 2008-11-21 (GMT+0800) URL:http://sebug.net/vuldb/ssvid-4474 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- gulp-rev:项目部署缓存解决方案----gulp系列(六)
引言: 前端工程化部署比较重要考虑的一个问题是缓存 ,可以参考 <变态的静态资源缓存与更新>. 使用gulp-rev解决的就是<变态的静态资源缓存与更新>提出的问题. rev会 ...
- 详解常用的gulp命令
gulp.js是一款自动化构建工具,我们经常使用它在开发过程自动执行常见的任务.gulp.js 是基于 Node.js 构建的,利用 Node.js,可以快速构建项目. 由于gulp使用基于node, ...
随机推荐
- Java学习笔记五:Java中常用的运算符
Java中常用的运算符 运算符是一种“功能”符号,用以通知 Java 进行相关的运算.譬如,我们需要将变量 score 的值设置为 20 ,这时候就需要一个“=”,告诉程序需要进行赋值操作. Java ...
- Python3爬虫(八) 数据存储之TXT、JSON、CSV
Infi-chu: http://www.cnblogs.com/Infi-chu/ TXT文本存储 TXT文本存储,方便,简单,几乎适用于任何平台.但是不利于检索. 1.举例: 使用requests ...
- (数据科学学习手札25)sklearn中的特征选择相关功能
一.简介 在现实的机器学习任务中,自变量往往数量众多,且类型可能由连续型(continuou)和离散型(discrete)混杂组成,因此出于节约计算成本.精简模型.增强模型的泛化性能等角度考虑,我们常 ...
- Verilog学习笔记基本语法篇(七)········ 生成块
生成块可以动态的生成Verilog代码.可以用于对矢量中的多个位进行重复操作.多个模块的实例引用的重复操作.根据参数确定程序中是否包含某段代码.生成语句可以控制变量的声明.任务和函数的调用.还能对实例 ...
- python2.7练习小例子(二十八)
28):题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. ...
- spring+springmvc+maven+mongodb
1.前言 最近项目开发使用到了spring+springmvc+maven+mongodb,项目中的框架是用springboot进项开发的,对于我们中级开发人员来说,有利有弊,好处呢是springbo ...
- 还原T4模板执行前的警告对话框
T4模板在保存的时候都会弹出个对话框,确认是否立即执行,大部分情况下我是不想立即执行的,所以一般都点Cancel,只有想执行的时候才点OK. 今天操作的时候不小心勾选了“Do not show thi ...
- 获取.jar文件运行时所处的路径
在Windows控制台中运行.jar文件时的两种环境: (1)控制台当前所在目录是.jar文件所在的目录 (2)控制台当前所在目录不是.jar文件所在的目录 我的期望: 我希望在上述两种环境下均可以得 ...
- 命令行下对apk签名
l创建key,需要用到keytool.exe (位于jdk安装目录\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于jdk安装目录\bin目录下),把上两个软件所 ...
- 小程序js脚本模块化调用
可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块.模块只有通过 module.exports 或者 exports 才能对外暴露接口. 1. common.js // common.j ...