才知道vector在插入值后是可以直接修改的...

那就很简单了

用vector的lowerbound这样的二分操作,提前储存每个颜色的位置

发现交换相对位置不变

关于vector的lowerbound的讲解(感谢QAQ)

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<cstring>
#define MAXN 310001
#define int long long
#define ps push_back
using namespace std;
int n,m;vector<int>v[MAXN];int a[MAXN];
int find(int l,int r,int x)
{
return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
}
int kx(int l,int x)
{
return lower_bound(v[x].begin(),v[x].end(),l)-v[x].begin();
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
v[a[i]].ps(i);
}
for(int i=1;i<=m;++i)
{
int orz;
int l,r,x;
scanf("%lld",&orz);
if(orz==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
printf("%lld\n",find(l,r,x));
}
else
{
scanf("%lld",&l);
if(a[l]==a[l+1])continue;
int me=kx(l,a[l]);
int me1=kx(l+1,a[l+1]);
//printf("me=%lld\nme1=%lld\n",me,me1);
//printf("v[%lld][%lld]=%lld\n",a[l+1],me1,v[a[l+1]][me1]);
v[a[l]][me]=l+1;
v[a[l+1]][me1]=l;
swap(a[l],a[l+1]);
}
}
}

还有主席树做法(我怎么没想到.....)

ps:超时了,只是存板子(它竟然卡我....)

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<cstring>
#define MAXN 1000001
#define int long long
#define ps push_back
using namespace std;
struct node
{
int ls,rs,val;
}T[20*MAXN];
int root[MAXN];int a[MAXN];
int tot=0;int n,m;
void insert(int &now,int l,int r,int x,int k,int last)
{
now=++tot;
T[now]=T[last];
int mid=(l+r)>>1;
if(l==r)
{
T[now].val+=k;
return ;
}
if(x<=mid)insert(T[now].ls,l,mid,x,k,T[last].ls);
else insert(T[now].rs,mid+1,r,x,k,T[last].rs);
}
int query(int x,int l,int r,int val)
{
if(l==r){return T[x].val;}
int mid=(l+r)>>1;
if(val<=mid)return query(T[x].ls,l,mid,val);
else return query(T[x].rs,mid+1,r,val);
}
int maxn=0;
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
maxn=max(maxn,a[i]);
}
for(int i=1;i<=n;++i)
{
//root[i]=root[i-1];
insert(root[i],1,maxn,a[i],1,root[i-1]);
}
for(int i=1;i<=m;++i)
{
int orz,l,r,x;
scanf("%lld",&orz);
if(orz==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
if(x>maxn){printf("0\n");continue;}
printf("%lld\n",query(root[r],1,maxn,x)-query(root[l-1],1,maxn,x));
}
else
{
scanf("%lld",&l);
insert(root[l],1,maxn,a[l],-1,root[l-1]);
insert(root[l],1,maxn,a[l+1],1,root[l-1]);
swap(a[l],a[l+1]);
}
}
}

【模拟8.03】数颜色(vector//主席树)的更多相关文章

  1. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  2. CDOJ 1104 求两个数列的子列的交集 查询区间小于A的数有多少个 主席树

    求两个数列的子列的交集 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1104 ...

  3. SPOJ DQUERY 求区间内不同数的个数 主席树

    这题跟HDU3333差不多吧. 离线的做法很简单,不再说了 以前做过. 主席树的做法就比较暴力了.. 什么是主席树呢.. 其实是某种称号. 在该题中的体现是可持久化的线段树. 对于一个数 如果以前没出 ...

  4. [四校联考P3] 区间颜色众数 (主席树)

    主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...

  5. BZOJ5011 JXOI2017颜色(主席树)

    相当于求满足在子段中出现的颜色只在该子段中出现的非空子段数量.这也就相当于其中出现的颜色最左出现的位置在左端点右侧,最右出现的位置在右端点左侧.那么若固定某个端点,仅考虑对该端点的限制,会有一段合法区 ...

  6. luogu P3939 数颜色 |vector

    题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排,来给他们喂胡萝卜吃. 排列完成后, ...

  7. SPOJ DQUERY D-query(主席树 区间不同数个数)

    题意:问你区间有几个不同的数 思路:主席树nb.我们知道主席树每一个root都存着一棵权值线段树,现在我们在每个root中存位置,也就是01表示这个位置存不存在.然后我们用一个fa[a[i]]表示a[ ...

  8. 【BZOJ3439】 Kpm的MC密码 (TRIE+主席树)

    3439: Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当然地忘记 ...

  9. hdu_2665_Kth number(主席树)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2665 题意:给你一个区间,让你找这个区间第K大的数 题解:主席树模版题,也可以用划分树 #includ ...

随机推荐

  1. vue 访问页面时报错 Failed to compile

    这个是因为node-sass没安装好,所以要重新安装 windows下运行命令:npm install node-sass --registry=https://registry.npm.taobao ...

  2. flex布局的使用

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ disp ...

  3. python爬虫——汽车之家数据

    相信很多买车的朋友,首先会在网上查资料,对比车型价格等,首选就是"汽车之家",于是,今天我就给大家扒一扒汽车之家的数据: 一.汽车价格: 首先获取的数据是各款汽车名称.价格范围以及 ...

  4. opencv打开摄像头获取视频程序

    // // main.cpp // opencv3 // // Created by PKU on 14-9-16. // Copyright (c) 2014年 PKU. All rights re ...

  5. 吃透KVM创建虚机和KVM命令

    1.创建虚拟机 1.1创建虚拟机磁盘 #使用qemu命令来创建磁盘 qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.2.qcow2 2 ...

  6. Msf--永恒之蓝 ms17_010

    |>>>中华人民共和国网络安全法<<<|警告:请勿用于非法用途,后果自负! 简介 一.概述 永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers ...

  7. KVM性能优化

    一.KVM为什么要调优 性能的损耗是关键.KVM采用全虚拟化技术,全虚拟化要由一个软件来模拟硬件,故有一定的损耗,特别是I/O,因此需要优化.KVM性能优化主要在CPU.内存.I/O这几方面.当然对于 ...

  8. DES加密 超详解 及 C++编程实现

    参考资料: 1.计算机与软件学院实验报告管理系统资料 2.强烈推荐观看:<信息安全技术>课程微课设计 简介 什么是DES DES全称为Data Encryption Standard,即数 ...

  9. jmeter从安装到使用

    最近,项目需要做接口测试,在python和jmeter之前选择,最终还是选择jmeter,虽然脚本管理及持续集成方面有所不便,但胜在使用简单,调试方便,方便后续做并发压力测试,而且最后的报告统计图表也 ...

  10. origin2018去掉demo水印

    消除demo字样 有的origin破解完成后,使用没问题,但导出的图有demo水印.其实不需要重装,只需要下载一个补丁即可解决. 1. 把下载到的origin.exe复制到安装文件夹 2. 双击执行一 ...