数据结构综合

P1279 文艺平衡树

额真的是平衡树啊…调了0.5h有点方

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 666666
int ch[SZ][2],fa[SZ],sz[SZ],val[SZ],an,root;
bool rev[SZ];
void init()
{
    root=1; ch[1][0]=0; ch[1][1]=2; sz[1]=2;
    fa[2]=1; ch[2][0]=ch[2][1]=0; sz[2]=1; an=2;
}
void pd(int x)
{
    if(!rev[x]) return;
    swap(ch[x][0],ch[x][1]);
    rev[ch[x][0]]^=1;
    rev[ch[x][1]]^=1;
    rev[x]=0;
}
void upd(int x)
{
    sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}
void rot(int x)
{
    int y=fa[x],d=ch[y][0]==x; pd(y); pd(x);
    int f=fa[y]; fa[x]=f; fa[y]=x;
    if(f) ch[f][ch[f][1]==y]=x;
    int p=ch[x][d]; ch[x][d]=y; ch[y][!d]=p;
    if(p) fa[p]=y; upd(y); upd(x); if(y==root) root=x;
}
void splay(int x,int f)
{
    pd(x);
    while(fa[x]!=f)
    {
        int y=fa[x];
        if(fa[y]!=f)
        {
            if(ch[fa[y]][1]==y^ch[y][0]==x) rot(x);
            else rot(y);
        }
        rot(x);
    }
    upd(x);
    if(!f) root=x;
}
void splayp(int x,int f)
{
    int c=root;
    while(pd(c),sz[ch[c][0]]!=x-1)
    {
        if(sz[ch[c][0]]<x-1) x-=sz[ch[c][0]]+1,c=ch[c][1];
        else c=ch[c][0];
    }
    splay(c,f);
}
int n;
#define RRL ch[ch[root][1]][0]
void addnode(int& x,int f,int v)
{
    x=++an; fa[x]=f; sz[x]=1; val[x]=v; ch[x][0]=ch[x][1]=rev[x]=0;
}
void build(int& x,int f,int l,int r)
{
    if(l>r) {x=0; return;}
    int mid=l+r>>1;
    addnode(x,f,mid);
    build(ch[x][0],x,l,mid-1);
    build(ch[x][1],x,mid+1,r);
    upd(x);
}
void revs(int l,int r)
{
    splayp(l,0);
    splayp(r+2,root);
    rev[RRL]^=1;
}
void prt(int cur)
{
    if(!cur) return;
    pd(cur);
    prt(ch[cur][0]);
    if(val[cur]) printf("%d ",val[cur]);
    prt(ch[cur][1]);
}
int main()
{
    int q;
    scanf("%d%d",&n,&q); init();
    build(RRL,ch[root][1],1,n);
    upd(ch[root][1]); upd(root);
    while(q--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        revs(l,r);
    }
    prt(root);
}

FJOI2016 神秘数

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 666666
#define S2 5555555
int ch[S2][2],rot[SZ],sum[S2],an=0;
void ins(int r1,int& r2,int l,int r,int p,int q)
{
    if(!r2) r2=++an;
    sum[r2]=sum[r1]+q;
    if(l==r) return;
    int mid=l+r>>1;
    if(p<=mid) ins(ch[r1][0],ch[r2][0],l,mid,p,q), ch[r2][1]=ch[r1][1];
    else ins(ch[r1][1],ch[r2][1],mid+1,r,p,q), ch[r2][0]=ch[r1][0];
}
int query(int r1,int r2,int l,int r,int p)
{
    if(l>p) return 0;
    if(sum[r1]==sum[r2]) return 0;
    if(r<=p) return sum[r2]-sum[r1];
    int mid=l+r>>1,ans=0;
    ans+=query(ch[r1][0],ch[r2][0],l,mid,min(p,mid));
    if(p>mid) ans+=query(ch[r1][1],ch[r2][1],mid+1,r,p);
    return ans;
}
int n,q,a[SZ],mm=1;
int ans(int l,int r)
{
    int cur=0;
    while(1)
    {
        int cc=query(rot[l-1],rot[r],1,mm,cur+1);
        if(cc==cur) return cc+1;
        cur=cc;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",a+i), mm=max(mm,a[i]);
    for(int i=1;i<=n;i++) ins(rot[i-1],rot[i],1,mm,a[i],a[i]);
    scanf("%d",&q);
    while(q--)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        printf("%d\n",ans(l,r));
    }
}

bzoj3110 K大数查询

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 23333333
int an=0,rot[SZ],sum[SZ],tag[SZ],ch[SZ][2],n;
int alc(int& x) {return (x)?(x):(x=++an);}
void I_add(int x,int l,int r,int ql,int qr)
{
    sum[x]+=qr-ql+1;
    if(l==ql&&r==qr) {++tag[x]; return;}
    int mid=l+r>>1;
    if(ql<=min(mid,qr)) I_add(alc(ch[x][0]),l,mid,ql,min(mid,qr));
    if(max(mid+1,ql)<=qr) I_add(alc(ch[x][1]),mid+1,r,max(mid+1,ql),qr);
}
void O_add(int x,int l,int r,int ql,int qr,int p)
{
    I_add(alc(rot[x]),1,n,ql,qr);
    if(l==r) return;
    int mid=l+r>>1;
    if(p<=mid) O_add(x+x,l,mid,ql,qr,p);
    else O_add(x+x+1,mid+1,r,ql,qr,p);
}
int I_sum(int x,int l,int r,int ql,int qr)
{
    if(!x||ql>qr) return 0;
    if(l==ql&&r==qr) return sum[x];
    int mid=l+r>>1;
    return tag[x]*(qr-ql+1)+I_sum(ch[x][0],l,mid,ql,min(qr,mid))+I_sum(ch[x][1],mid+1,r,max(ql,mid+1),qr);
}
int O_query(int x,int l,int r,int ql,int qr,int p)
{
    if(l==r) return l;
    int mid=l+r>>1,cnt=I_sum(rot[x+x+1],1,n,ql,qr);
    if(cnt>=p) return O_query(x+x+1,mid+1,r,ql,qr,p);
    else return O_query(x+x,l,mid,ql,qr,p-cnt);
}
int main()
{
    int q; scanf("%d%d",&n,&q);
    while(q--)
    {
        int t,a,b,c; scanf("%d%d%d%d",&t,&a,&b,&c);
        if(t==1) O_add(1,1,n,a,b,c);
        else printf("%d\n",O_query(1,1,n,a,b,c));
    }
}

时间关系就写到这里…碎觉

时间: 2024-10-13 11:32:04

数据结构综合的相关文章

实验五 数据结构综合应用

20162317袁逸灏 实验五 数据结构综合应用 实验内容 实验五-1-编译.运行.测试 git clone 小组项目 编译项目,提交编译成功截图(全屏,要有学号信息) 提交运行过程中的截图(全屏,要有学号信息) 实验五-2-代码修改 在小组项目中,找一个合适的地方添加一个按钮,点击显示自己的学号 提交运行截图(全屏,要有学号信息) 实验要求 分析系统架构 编译.运行.测试系统 修改系统 分析数据结构.排序.查找算法的应用 实验过程 实验五-1-编译.运行.测试 这个实验考察的是学生对于代码项目

实验五 数据结构综合应用 20162305

实验五 数据结构综合应用 20162305 0 分析系统架构 我们本次做的是一个飞机大战的游戏,本次游戏是想让使用者通过操控一个飞机进行击毁敌机和躲避敌机的操作.这个APP总体是基于精灵类ISpirte实现了战斗机类,走直线的精灵类和爆炸类,这些类构成了整个APP的整体架构,所有的功能都集中在这几个类中. 战斗机类CombatAircraft: 战斗机类,定义一个由玩家操控的战斗机,这个战斗机每隔7帧发射子弹,并且设定方法确定战斗机一直处在界面中.战斗机如果被击中,执行爆炸效果.具体来说,首先隐

20162302 实验五《数据结构综合应用》实验报告

实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:数据结构综合应用 实验器材:装有IdeaU的联想拯救者15ISK 实验目的与要求: 1.编译运行测试 2.代码修改 3.代码分析 实验内容.步骤与体会: 实验内容: 编译运行测试 点击红色圈出来的地方 选择虚拟机也可以选择连在usb上的物理机,在这里就选择虚拟机 运行成功 测试按下方向键会向不同方向移动,并记录按键步数 把箱子推到指定位置会出现过关画面并播放一小段音乐 代码修改 增加按键效果

20162328蔡文琛 实验五 数据结构综合应用

实验五:数据结构综合应用 课程:程序设计与数据结构 班级: 1623 姓名: 蔡文琛 学号:20162328 指导教师:娄嘉鹏 王志强 实验日期:12月15日 实验密级: 非密级 预习程度: 已预习 必修/选修: 必修 实验名称: 数据结构综合应用 实验内容: 1.分析系统架构 2.编译.运行.测试系统 3.修改系统 4.分析数据结构.排序.查找算法的应用 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验报告,

20162320刘先润大二 实验五 数据结构综合应用

一.分析系统架构 二.编译.运行.测试系统 1.首先进入团队项目的码云? Java演绎法?,点击克隆/下载按钮下的复制 2.打开Android Studio,点击VCS列表下的Git,然后点击clone 3.将复制的地址粘贴到Git Repository URL下,然后选择克隆路径和名称,点击clone,等待克隆完成就相当于编译成功 4.点击run并配置相应的虚拟手机设备,运行截图如下 三.修改系统 1.首先打开主界面的xml文件,进入design模式,从左边添加一个按钮进入任意位置,查看其id

实验五数据结构综合应用 20162310

分析系统架构 Sprite精灵类 ISprite精灵类是所有类的父类 CombatAircraft战斗机类 首先确保战斗机完全位于Canvas范围内,每隔7帧发射单发黄色子弹. protected void beforeDraw(Canvas canvas, Paint paint, GameView gameView) { if(!isDestroyed()){ //确保战斗机完全位于Canvas范围内 validatePosition(canvas); //每隔7帧发射子弹 if(getFr

20162303 实验五 数据结构综合应用

北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 石亚鑫 学号:20162303 成绩: 2分 指导教师:娄嘉鹏 王志强 实验日期:12月15日 实验密级: 非密级 预习程度: 已预习 实验时间:10:00-12:00 必修/选修: 必修 实验序号: cs_03 实验内容 实验 分析系统架构 首先分析一下各部分代码 card类 card是用来显示2048游戏中的数字卡片,首先设定的是card的背景 /* * LayoutParams类也只是简单的

20162308 实验五 数据结构综合应用

style: ocean 实验四 -图的实现与应用 实验内容 实验五-1-编译.运行.测试 1 git clone 小组项目.2 编译项目,提交编译成功截图(全屏,要有学号信息).3 提交运行过程中的截图(全屏,要有学号信息). 实验五-2-代码修改 1. 在小组项目中,找一个合适的地方添加一个按钮,点击显示自己的学号.2. 提交运行截图(全屏,要有学号信息).3. 在项目中找一个界面,自己复制一份命名为XXXbak,修改代码,替换原来的部分.4. 提交运行截图(全屏,要有学号信息). 实验五-

浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍的二叉查找树(Binary Search Tree,BST)这一数据结构综合了以上两种数据结构的优点. 二叉查找树具有很高的灵活性,对其优化可以生成平衡二叉树,红黑树等高效的查找和插入数据结构,后文会一一介绍. 一 定义 二叉查找树(B