[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, ...
随机推荐
- 基于pygame的打砖块游戏,做到一半,不带做了
跟着一个博主做的,前面的变量的定义全是内个哥们的,没带任何改动,就做了个界面,背景音乐,绘制了个小球,绘制了挡板 小球可以撞到边界反弹,然后做了砖块,定义了一个存放砖块的列表,,,就没有下文了 原博主 ...
- 前端学习之HTML基础
要点: 理解HTTP请求响应模式及通信规范 HTML的各种标签和常用标签 CSS是用于样式渲染和定位布局 JS将HTML动态化 jquery是JS的高级封装 理解HTTP请求响应模式及通信规范 HTT ...
- 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(三):设置上传文件夹权限(这里测试用完全共享)
基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...
- 当应用出现 access violation at address in module时
Delphi2010和XE10,midas是不同的版本,之前开发的两个系统,基于不同的Delphi版本,经常出现access violation at address in module错误.特别是当 ...
- 深度学习(deep learning)优化调参细节(trick)
https://blog.csdn.net/h4565445654/article/details/70477979
- 创龙TMS320C6748开发找不到 tl.dsp.evm6748的问题研究
1. 使用中遇到问题,看了一下帖子说是把tl.dsp.evm6748换成ti.platforms.evm6748可以编译过去.这个包是在XDCtools里面的. js: "D:/ti/ccs ...
- PHP通过copy()函数来复制一个文件
PHP通过copy()函数来复制一个文件.用法如下: bool copy(string $source, string $dest) 其中$source是源文件的路径,$dest是目的文件的路径.函数 ...
- LAXCUS对数据存储的优化
LAXCUS兼容行存储(NSM)和列存储(DSM)两种数据模型,实现了混合存储.同时在分布环境里,做到将数据的分发和备份自动处理,这样就不再需要人工干预了. 行存储,为了兼容广大用户对 ...
- c++知识点总结--函数模板
通用函数可变参模板 用于处理不限定参数的函数 showall(){//空函数,接口,最后结束递归 } template<typename T,typename... Args> void ...
- HDU 3697 Selecting courses(贪心+暴力)(2010 Asia Fuzhou Regional Contest)
Description A new Semester is coming and students are troubling for selecting courses. Students ...