[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, ...
随机推荐
- 渗透测试实验(i春秋 真的很简单)
首先利用给的提示: 所以用户名是 ichunqiu 密码是adab29e084ff095ce3eb 可以确定一般密码都是md5的,但是这个20位 应该去掉ada b29e084ff095ce3e才是正 ...
- C++ 指针初始化要注意的地方
1. 声明多个指针的时候: int* P1,P2; 如上所示,声明的是创建一个指针P1和一个int型的变量P2.而不是声明的两个指针. 对每个指针变量名,都需要使用一个*. 在C++中,int* 是一 ...
- idea启动spring boot无法加载或找不到主类
问题产生原因:moudle名称修改,导致项目启动不了 在Terminal界面中执行以下三个命令,我在执行第一个命令的时候报了一个找不到dependency的错误,把那个报错的dependency删了就 ...
- (数据科学学习手札21)sklearn.datasets常用功能详解
作为Python中经典的机器学习模块,sklearn围绕着机器学习提供了很多可直接调用的机器学习算法以及很多经典的数据集,本文就对sklearn中专门用来得到已有或自定义数据集的datasets模块进 ...
- [Codeforces888E]Maximum Subsequence(暴力+meet-in-the-middle)
题意:给定n.m.有n个数,选出若干数加起来对m取模,求最大值 n<=35 如果直接暴力就是235,会T, 这里用到一个思想叫meet-in-the-middle, 就是把数列分成两半分别搜索, ...
- P1016 旅行家的预算
P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2 ...
- kindeditor 限制上传图片大小及宽高
进入:/kindeditor/plugins/image/image.js,替换其中的 self.plugin.imageDialog = function (options)方法,代码为: self ...
- Centos6 使用yum快速搭建LAMP环境
1.安装Apache [root@localhost ~]# yum -y install httpd # 开机自启动 [root@localhost ~]# chkconfig httpd on ...
- Spring实战第九章学习笔记————保护Web应用
保护Web应用 在这一章我们将使用切面技术来探索保护应用程序的方式.不过我们不必自己开发这些切面----我们将使用Spring Security,一种基于Spring AOP和Servlet规范的Fi ...
- JVM 什么时候会触发FGC
1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...