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语言教科书在讲述递归函数的时 ...
随机推荐
- powerdesigner 使用技巧 建模工具 导出sql 导出实体类 导出word
显示comment列 Table Properties(表属性)=>Columns(列)=>Customize Columns and Filter(自定义列过滤) 勾上 comment ...
- linux 常用的中文手册
http://linuxtools-rst.readthedocs.io/zh_CN/latest/base/index.html 总结的非常好!包括基础.进阶以及各种常用工具.
- MySQL--pymysql模块
import pymysqlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa连接conn=pymysql.connect(host='127.0.0. ...
- 神经网络rbf
clc; clear; close all; ld=400; %定义学习样本的数量 x=rand(2,ld); %得到一个2 * 400的一个矩阵,每个元素在0-1之间 x=(x-0.5)*1.5*2 ...
- VS下载Github的项目引用报错
错误如下 1.添加新的Nuget包源 添加新的源 https://www.nuget.org/api/v2/ 2.还原Nuget包 3.升级Visual Studio到最新 工具-->获取工具和 ...
- ASP.NET MVC5入门2之Ajax实现数据查询
开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...
- iOS10 远程通知需要有entitlements的支持
今天测试远程通知,发现ios9上可以收到,但是ios10上无法收到,原来是忘记开下面这个选项了: 这样看来iOS9 对这个entitlement没有什么依赖,但是10却是必须打开的!
- 加载UI工程的csb,以及纹理缓存情况
以plist+PNG模式加载csb,并播放UI工程做的动画,用法如下 local Layer = cc.CSLoader:createNode("res/yk/interface/loadi ...
- 清北学堂 清北-Day1-R1-Count
题目描述 问有几个无序二元组 (x; y) 满足 xy ≡ 1 (mod P ); 0 ≤ x < P; 0 ≤ y <P.无序二元组是指,如果 P = 10, (3; 7) 和 (7; ...
- android经典源码,很不错的开源框架
高仿最美应用项目源码 项目介绍 这是仿最美应用开发的基于mvp+rxjava+retrofit的项目,很值得学 github地址: https://github.com/JJOGGER/Beaut ...