题解:

平衡树维护hash值

为了支持加入删除操作 x*base^y 其中y为他是第k大

同一般的维护方法,我们不用对每个节点维护他的hash值

而是只用记录他的x值(他的位置) 然后通过updata的时候维护

很神奇的一点是

我用了mo数就炸了。。。

直接自然溢出就好了。。。应该是哪里正负没处理好。。

另外还wa了一个点。。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=5e5+;
const ll Base=;
ll n,m,q,cl[N],a[N],b[N];
map<ll,ll> M;
struct Splay{
ll count2[N],data[N],ls[N],rs[N],fa[N],v[N],vv[N],root=,cnt=;
void updata(ll x)
{
count2[x]=count2[ls[x]]+count2[rs[x]]+;
data[x]=(data[ls[x]]+1ll*data[rs[x]]*cl[count2[ls[x]]+]
+cl[count2[ls[x]]]*v[x]);
}
void rotate(ll x,ll y)
{
ll fa1=fa[x];
if (y==)
{
rs[fa1]=ls[x];
if (ls[x]) fa[ls[x]]=fa1;
} else
{
ls[fa1]=rs[x];
if (rs[x]) fa[rs[x]]=fa1;
}
fa[x]=fa[fa1];
if (fa[fa1])
{
ls[fa[fa1]]==fa1?ls[fa[fa1]]=x:rs[fa[fa1]]=x;
}
fa[fa1]=x;
if (y==) ls[x]=fa1; else rs[x]=fa1;
updata(fa1); updata(x);
}
void splay(ll x,ll goal)
{
ll fa1=fa[x];
while (fa1!=goal)
{
if (fa[fa1]==goal)
x==ls[fa1]?rotate(x,):rotate(x,);
else
if (fa1==ls[fa[fa1]])
if (x==ls[fa1]) rotate(fa1,),rotate(x,);
else rotate(x,),rotate(x,);
else
if (x==rs[fa1]) rotate(fa1,),rotate(x,);
else rotate(x,),rotate(x,);
fa1=fa[x];
}
if (!goal) root=x;
}
ll search(ll goal)
{
ll x=root;
while (x)
{
if (vv[x]==goal) return(x);
if (vv[x]<goal) x=rs[x];
else x=ls[x];
}
}
void ins(ll y,ll x1)
{
ll x=root;
while (x)
{
if (y>vv[x])
if (rs[x]) x=rs[x]; else break;
else
if (ls[x]) x=ls[x]; else break;
}
if (!x) root=++cnt;
else
{
if (y>vv[x])
{
rs[x]=++cnt; fa[cnt]=x;
} else
{
ls[x]=++cnt; fa[cnt]=x;
}
}
vv[cnt]=y; v[cnt]=x1; count2[cnt]=;
splay(cnt,);
}
void del(ll x1)
{
ll x=search(x1);
splay(x,);
if (!ls[x])
{
root=rs[root]; fa[root]=; return;
}
ll y=ls[x];
while (rs[y]) y=rs[y];
rs[y]=rs[x];
if (rs[y]) fa[rs[y]]=y;
updata(y);
root=ls[x]; fa[ls[x]]=; splay(y,);
}
}A,B;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cl[]=;
for (ll i=;i<N;i++) cl[i]=(1ll*cl[i-]*Base);
cin>>n>>m>>q;
ll cnt=;
for (ll i=;i<m;i++) cnt+=cl[i];
for (ll i=;i<=n;i++) cin>>a[i];
for (ll i=;i<=m;i++) A.ins(a[i],i);
++M[A.data[A.root]];
for (ll i=m+;i<=n;i++)
{
A.del(a[i-m]); A.ins(a[i],i);
ll tmp=A.data[A.root]-1ll*cnt*(i-m);
++M[tmp];
}
for (ll i=;i<=m;i++)
{
cin>>b[i];
B.ins(b[i],i);
}
for (ll i=;i<=q;i++)
{
ll x,y;
cin>>x>>y;
B.del(b[x]);
b[x]=y;
B.ins(y,x);
cout<<M[B.data[B.root]]<<endl;
}
return ;
}

最新文章

  1. wamp环境 安装memcache 扩展
  2. UiAutomator自动化测试框架介绍
  3. sql server 执行计划(execution plan)介绍
  4. Android内存性能优化(内部资料总结)
  5. vim切换buffer
  6. Linux下搭建Oracle11g RAC(2)----配置DNS服务器,确认SCAN IP可以被解析
  7. Java三大特征之封装(一)
  8. flex 载入GIF图片
  9. Internet基础
  10. SpringMVC 学习-上传文件分解器 CommonsMultipartResolver 类
  11. Spring动态数据源的配置
  12. 百度编辑器 UEditor第一次加载后台数据失败
  13. Centos 6.5升级openssh漏洞
  14. Docker:dockerfile自动构建镜像 [六]
  15. 论文笔记:ATOM: Accurate Tracking by Overlap Maximization
  16. MySQL ERROR 1130 (HY000): Host &#39;192.168.1.8&#39; is not allowed to connect to this MySQL server
  17. Ubuntu下useradd与adduser区别
  18. 理解JSON Web Token (一)
  19. Git 更新操作
  20. ​零基础该如何学习UI设计

热门文章

  1. linux下添加删除,修改,查看用户和用户组
  2. MySQL的数据文件存储
  3. javascript移动端禁止页面滑动的解决方案
  4. [C]控制外部变量访问权限的extern和static关键字
  5. [C][代码实例]整型数组二分排序
  6. sql拼接显示table的多个列
  7. swift 学习- 11 -- 属性
  8. struts2 过滤器和拦截器的区别和使用
  9. Confluence 6 配置验证码(Captcha)来防止垃圾
  10. Confluence 6 用户目录图例 - 使用 LDAP 授权的内部目录