Codeforces - 331B2 权值线段树 区间合并
题意:题目太玄了我无法用语言精简..
题目要求的操作1是基于值的,所以用普通线段树基本无法维护(反正我不知道)
换做权值型后十分好做,因为连接处必然是更后面的,这时比较一下位置就好
PS.感觉周赛越来越硬核了
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define print(a) printf("%lld",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 3e5+11;
const int INF = 0x3f3f3f3f;
typedef long long ll;
int a[MAXN],pos[MAXN];
ll read(){
    ll x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct ST{
    #define lc o<<1
    #define rc o<<1|1
    int cnt[MAXN<<2];
    void pu(int o,int l,int r){
        cnt[o]=cnt[lc]+cnt[rc];
        int taillc=l+r>>1;
        int headrc=taillc+1;
        if(pos[taillc]<pos[headrc]) cnt[o]--;
    }
    void build(int o,int l,int r){
        if(l==r){
            cnt[o]=1;
            return;
        }
        int mid=l+r>>1;
        build(lc,l,mid);
        build(rc,mid+1,r);
        pu(o,l,r);
    }
    ll query(int o,int l,int r,int L,int R){
        if(L<=l&&r<=R){
            return cnt[o];
        }
        int mid=l+r>>1;
        ll ans1=0,ans2=0,ans3=0;
        if(L<=mid) ans1=query(lc,l,mid,L,R);
        if(R>mid) ans2=query(rc,mid+1,r,L,R);
        if(ans1&&ans2){
            int taillc=l+r>>1;
            int headrc=taillc+1;
            if(pos[taillc]<pos[headrc]) ans3=-1;
        }
        return ans1+ans2+ans3;
    }
    void update(int o,int l,int r,int k,int v=1){
        if(l==r){
            return;
        }
        int mid=l+r>>1;
        if(k<=mid) update(lc,l,mid,k,v);
        else update(rc,mid+1,r,k,v);
        pu(o,l,r);
    }
}st;
int main(){
    int n,m;
    while(cin>>n){
        rep(i,1,n){
            a[i]=read();
            pos[a[i]]=i;
        }
        st.build(1,1,n);
        m=read();
        rep(i,1,m){
            int x,y,z;
            x=read();y=read();z=read();
            if(x==1){
                println(st.query(1,1,n,y,z));
            }else{
                int yy=a[y],zz=a[z];
                swap(pos[yy],pos[zz]);
                swap(a[y],a[z]);
                st.update(1,1,n,yy,1);
                st.update(1,1,n,zz,1);
            }
        }
    }
    return 0;
}
												
											Codeforces - 331B2 权值线段树 区间合并的更多相关文章
- BZOJ 2733 [HNOI2012]永无乡 (权值线段树启发式合并+并查集)
		
题意: n<=1e5的图里,在线连边.查询某连通块第k大 思路: 练习线段树合并的好题,因为依然记得上一次启发式合并trie的时候内存爆炸的恐怖,所以这次还是用了动态开点.回收 听说启发式合并s ...
 - [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)
		
[BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...
 - B20J_2733_[HNOI2012]永无乡_权值线段树合并
		
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
 - 【bzoj3065】带插入区间K小值  替罪羊树套权值线段树
		
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
 - 【bzoj4399】魔法少女LJJ  并查集+权值线段树合并
		
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
 - 【bzoj3307】雨天的尾巴  权值线段树合并
		
题目描述 N个点,形成一个树状结构.有M次发放,每次选择两个点x,y,对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入 第一行数字N,M接下来 ...
 - 权值线段树&线段树合并
		
权值线段树 所谓权值线段树,就是一种维护值而非下标的线段树,我个人倾向于称呼它为值域线段树. 举个栗子:对于一个给定的数组,普通线段树可以维护某个子数组中数的和,而权值线段树可以维护某个区间内数组元素 ...
 - HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并)
		
layout: post title: HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并) author: "luowentaoaa&quo ...
 - BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
		
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
 
随机推荐
- redis集群部署及常用的操作命令(下)
			
搭建好集群之后,为了扩容需要再加入一个节点.那就再复制一个7006,改为相应的redis.conf(复制了改个port就好,如果复制的redis之前属于集群,需要把关联的node.conf之类的去掉) ...
 - 通过input上传图片,判断不同浏览器及图片类型和大小的js代码
			
1.jsp页面代码 <form id="userPhoto" name="userPhoto" method="post" actio ...
 - sklearn中的随机森林
			
阅读了Python的sklearn包中随机森林的代码实现,做了一些笔记. sklearn中的随机森林是基于RandomForestClassifier类实现的,它的原型是 class RandomFo ...
 - Actor模型文章收集
			
参与者模式——维基百科 Akka.Net——github开源项目 Actor原理——比较深入的文章
 - SpringMVC源码解读 - RequestMapping注解实现解读 - ConsumesRequestCondition
			
consumes 指定处理请求的提交内容类型(media-Type),例如application/json, text/html. 所以这边的ConsumesRequestCondition就是通过 ...
 - 设计模式18:Observer 观察者模式(行为型模式)
			
Observer 观察者模式(行为型模式) 动机(Motivation) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有依赖对象(观察者对象) ...
 - Sed的使用方法简介
			
=============Sed================== Sed:是一款流编辑工具,用来对文本进行过滤与替换工作,特别是当你想对几十个配置文件进行统一修改时,你会体会到它的魅力:Sed通过 ...
 - 修改阿里云ECS服务器的系统时区
			
1.前提 由于公司有在印尼的项目,所以购买了阿里云在新加坡机房的服务器(在印尼还没有),印尼当地使用的是东七区的时间,所以领导要求修改阿里云ECS系统的时区. 2.动手 修改阿里云ECS服务器系统的时 ...
 - C++-结构体,联合体,枚举,的区别
			
结构体: struct NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union data { int a ...
 - 文字编码ASCII,GB2312,GBK,GB18030,UNICODE,UCS,UTF的解析
			
众所周知,一个文字从输入到显示到存储是有一个固定过程的,其过程为:输入码(根据输入法不同而不同)→机内码(根据语言环境不同而不同,不同的系统语言编码也不一样)→字型码(根据不同的字体而不同)→存储码( ...