Chino的数列
题解:
一道练代码能力的题目。。
首先很显然他是一道平衡树裸题
第5个操作是势能分析维护最大值最小值就可以了
另外设置虚点和noip2017队列那题一样(不过我只写过线段树)
具体细节:
1.内存池,要直接判断(!x) 因为可能进去就是0
2.输出的时候有重复的要都输出
3.search的时候要down
4.为了简单我写的down是更新自己的,而这个标记会对updata产生影响,所以updata的时候要down两个儿子
5.splay虚点变变三个点要判断点数,分三种情况 1个点,2个点,>2个点
这个洛谷评测是什么鬼。。数据测出来是对的显示wa
另外本题也可以用分块做。。以后写下试试
代码:
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
#define ll long long
const int INF=1e9;
const int N=4e6;
queue<int> q;
int s[N],count2[N],count3[N],data[N],maxa[N],mina[N],rs[N],ls[N],lazy[N],fa[N],root;
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
int cnt,minxx=INF;
struct phs{
IL void down(rint x)
{
if (lazy[x]==INF) return;
maxa[x]=mina[x]=data[x]=lazy[x];
if (ls[x]) lazy[ls[x]]=lazy[x];
if (rs[x]) lazy[rs[x]]=lazy[x];
lazy[x]=INF;
}
IL void updata(rint x)
{
rint l=ls[x],r=rs[x],tmp=data[x];
down(l); down(r);
count2[x]=count2[l]+count2[r]+count3[x];
maxa[x]=max(tmp,max(maxa[l],maxa[r]));
mina[x]=min(tmp,min(mina[l],mina[r]));
}
IL void rotate(int x,int y)
{
int fa1=fa[x];
if (y==)
{
if (ls[x]) fa[ls[x]]=fa1;
rs[fa1]=ls[x];
} else
{
if (rs[x]) fa[rs[x]]=fa1;
ls[fa1]=rs[x];
}
fa[x]=fa[fa1];
if(fa[fa1])
{
if (ls[fa[fa1]]==fa1) ls[fa[fa1]]=x;
else rs[fa[fa1]]=x;
}
fa[fa1]=x;
if (y==) ls[x]=fa1; else rs[x]=fa1;
updata(fa1);
updata(x);
}
void dfs(int x)
{
if (fa[x]) dfs(fa[x]);
down(x);
}
IL void splay(int x,int goal)
{
dfs(x);
int fa1=fa[x];
while (fa1!=goal)
{
if (fa[fa1]==goal)
{
if (x==ls[fa1]) rotate(x,); else 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;
}
IL int search(rint k)
{
rint x=root;
while (x)
{
down(x);
if (s[x])
{
rint l=ls[x],r=rs[x];
rint tmp=count3[x];
count3[x]=;
rint now=ls[x]=q.front(); q.pop();
fa[now]=x;
if ((count3[ls[x]]=tmp/)!=) s[now]=;
ls[now]=l; fa[l]=now; data[now]=data[x]; updata(now);
if (tmp>)
{
now=rs[x]=q.front(); q.pop(); data[rs[x]]=data[x];
fa[now]=x;
if ((count3[now]=tmp-(tmp/)-)!=) s[now]=;
rs[now]=r; fa[r]=now; updata(now);
}
down(x);
s[x]=;
}
if (count2[ls[x]]+==k) return(x);
if (count2[ls[x]]+<k) k-=count2[ls[x]]+,x=rs[x];
else x=ls[x];
}
}
void dfs2(int x)
{
if (!x) return;
cnt++;
q.push(x);
dfs2(ls[x]);
dfs2(rs[x]);
ls[x]=rs[x]=count2[x]=s[x]=data[x]=fa[x]=maxa[x]=mina[x]=;
count3[x]=;
lazy[x]=INF;
}
IL void split(int x,int y)
{
splay(x,);
splay(y,x);
}
IL void cl(int x)
{
down(x);
int k1=sqrt(maxa[x]); int k2=sqrt(mina[x]);
if (k1==k2)
{
lazy[x]=k1; down(x);
return;
}
data[x]=sqrt(data[x]);
if (ls[x]) cl(ls[x]);
if (rs[x]) cl(rs[x]);
updata(x);
}
IL void ycl()
{
root=; rs[]=; fa[]=; count2[]=; count2[]=;
}
IL void ou(int x)
{
down(x);
if (ls[x]) ou(ls[x]);
if (x!=&&x!=)
rep(i,,count3[x])
printf("%d ",data[x]);
if (rs[x]) ou(rs[x]);
}
}S;
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
int m;
cin>>m;
maxa[]=-INF; mina[]=INF;
int len=;
rep(i,,N-) q.push(i);
rep(i,,N-) lazy[i]=INF,count3[i]=;
S.ycl();
rep(i,,m)
{
minxx=min(minxx,q.size());
int x,y,z,k;
cin>>k;
if (k==)
{
cin>>x>>y;
rint now=S.search(len+);
S.splay(,);
S.splay(now,);
rint now2=rs[now]=q.front(); q.pop();
count3[now2]=x; data[now2]=y; fa[now2]=now;
if (x!=) s[now2]=;
S.splay(now2,);
len+=x;
}
if (k==)
{
int x;
cin>>x;
len-=x;
x=S.search(x+);
S.split(,x);
// S.dfs2(ls[x]);
ls[x]=;
S.splay(x,);
}
if (k==)
{
int kk;
cin>>x>>y>>z>>kk;
rint t=y-x+;
rint ans=;
while(z)
{
if (z&) ans=(1ll*ans*t)%kk;
t=(1ll*t*t)%kk;
z>>=;
}
int l=S.search(x);
int r=S.search(y+);
S.split(l,r);
lazy[ls[r]]=ans;
S.splay(ls[r],);
}
if (k==)
{
int x,y;
cin>>x>>y;
//cout<<x<<" "<<y<<endl;
len-=y-x;
x=S.search(x),y=S.search(y+);
S.split(x,y);
S.down(ls[y]);
int now=ls[y];
int mm=maxa[now];
// S.dfs2(ls[now]); S.dfs2(rs[now]);
ls[now]=rs[now]=; lazy[now]=INF; count3[now]=; s[now]=;
data[now]=mm; S.splay(now,);
printf("%d\n",mm);
}
if (k==)
{
cin>>x>>y;
x=S.search(x),y=S.search(y+);
S.split(x,y);
int now=ls[y];
S.cl(now);
}
}
S.ou(root);
// printf("\n%d\n%d",cnt,minxx);
return ;
}
Chino的数列的更多相关文章
- 【luoguP5550】Chino的数列
题目背景 没有背景 我写不出来了qwq 题目描述 Chino给定了nn个数a_1...a_na1...an,给定常数s,m,她会轮流对这nn个数做k组操作,每组操作包含以下几步: 1.swap(a ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- PAT 1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
随机推荐
- python3+selenium入门10-表单切换
当元素在ifarm或farm中时,需要先进入到表单中,然后才能定位元素进行操作.直接对元素定位.会提示元素无法找到. <!DOCTYPE html> <html> <he ...
- boost.asio包装类st_asio_wrapper开发教程(2013.12.8更新)(二)
如果你是偶然浏览到这里,请先看 源代码及例程下载地址:命令行:svn checkout http://st-asio-wrapper.googlecode.com/svn/trunk/ st-asio ...
- unity制作背景
- 关于boost中enable_shared_from_this类的原理分析
首先要说明的一个问题是:如何安全地将this指针返回给调用者.一般来说,我们不能直接将this指针返回.想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变 ...
- ffmpeg 加载双语字幕
set infile=in.mp4 set subfile1=cn.srt set subfile2=en.srt set subvf1="subtitles=%subfile1%:forc ...
- live555运行时报错:StreamParser internal error ( 86451 + 64000 > 150000)
搭建好live555服务器后,使用 vlc播放网络视频.此时服务器端报如下错误: StreamParser internal error ( 86451 + 64000 > 150000). ...
- OpenStack实践系列⑧可视化服务Horizon之Dashboard演示
OpenStack实践系列⑧可视化服务Horizon之Dashboard演示 七.可视化服务Horizon之Dashboard演示 仪表板依赖于功能核心服务,包括身份,图像服务,计算和网络两种(neu ...
- MySQL MyISAM引擎转换为InnoDB操作记录
进入mysql命令行模式: # mysql -uroot -ppwd 1.查看mysql提供什么存储引擎: mysql> show engines; 2.查看mysql当前提供的默认存储引擎: ...
- python学习第42、43天 HTML\CSS
前端是什么? 帮助不了解后端程序的客户轻松使用程序的工具,可以提升工作效率,提供各种各样的体验. 通用的前端大致会使用三种语言,用在三个不同的方面对前端进行架构和优化,这里也只介绍这三种 web前端常 ...
- mac 上如何安装非app store上的下载的软件-------打开未知来源
打开了 Terminal 终端后 ,在命令提示后输入 sudo spctl --master-disable 并按下回车执行,如下图所示. 随后再输入当前 Mac 用户的密码,如下图所示. 如 ...