[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, ...
随机推荐
- 网站安全检测 漏洞检测 对thinkphp通杀漏洞利用与修复建议
thinkphp在国内来说,很多站长以及平台都在使用这套开源的系统来建站,为什么会这么深受大家的喜欢,第一开源,便捷,高效,生成静态化html,第二框架性的易于开发php架构,很多第三方的插件以及第三 ...
- unity开发c#代码
1.摄像头跟随主角移动,并支持旋转. 开发过程中需要摄像头以一定距离跟随player,同时会进行旋转,属于一种常见的跟随方式. using UnityEngine; using System.Coll ...
- RedHat安装Oracle后中文乱码
radhat7.1 Oracle11gr2 安装Oracle时忘记设置字符集,导致安装后中文乱码,中文变成"???????????" 分析原因是Oracle服务器端和客户端的字符集 ...
- 【转】让Moodle支持多个域名
默认情况下,moodle仅能绑定一个域名.但是由于学校网络分内网和外网,总希望如果是外网访问的,用外网的域名,用内网访问的,就转到内网的ip.这样访问的速度会更快一些,也减低对防火墙的压力.尤其是当外 ...
- 洛谷P1090 合并果子
合并果子 题目链接 这个只能用于结构体中 struct item { int val; friend bool operator < (item a,item b) { return a.val ...
- SpringBoot学习:使用logback进行日志记录
项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)pom.xml文件中引入jar: <!-- https://mvnrepos ...
- sqlserver2012 查询远程数据库
EXEC sp_addlinkedserver 'LinkName','','SQLOLEDB','121.43.177.236'EXEC sp_addlinkedsrvlogin 'LinkName ...
- HDU 3697 Selecting courses(贪心+暴力)(2010 Asia Fuzhou Regional Contest)
Description A new Semester is coming and students are troubling for selecting courses. Students ...
- DFS(2)——hdu1241Oil Deposits
一.题目回顾 题目链接:Oil Deposits 题意:给你一块网格,网格被分为面积相等的地块,这些地块中标记'@'的是油田,标记'*'的不是油田.已知一块油田与它上下左右以及对角线的油田同属一片油区 ...
- 软件工程项目组Z.XML会议记录 2013/10/22
软件工程项目组Z.XML会议记录 [例会时间]2013年10月22日星期二21:00-22:30 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]周敏轩 会议整体流程 ...