才知道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. windows调起git bash执行sh脚本定时统计git仓库代码量

    本来挺简单的一个东西硬是弄了两天 心力交瘁 找了网上不少资料 整理一下发给大家 首先是统计每个人的代码量的git命令 在网上找的 我这里做了以下修改 git log --format='%aN'|so ...

  2. 在微信框架模块中,基于Vue&Element前端的事件和内容的管理

    在微信后台管理中,我们需要定义好菜单对应的事件管理,因为微信通过菜单触发相关的事件,因此菜单事件的响应关系,我们如果处理好,就能构建出我们的微信应用入口了.通过入口,我们可以响应用户菜单的事件,如响应 ...

  3. traefik: 基础入门总结

    traefik介绍 traefik-现代反向代理,也可称为现代边缘路由:traefik原声兼容主流集群,Kubernetes,Docker,AWS等.官方的定位traefik是一个让开发人员将时间花费 ...

  4. [DB] Zookeeper

    介绍 相当于"数据库",类似linux.hdfs的属性文件结构 分布式协调框架,实现HA(High Availability) 分布式锁管理框架 保证数据在zookeeper集群之 ...

  5. Docker------Linux安装Docker

    1.添加yum源 yum install epel-release –y yum clean all yum list 2.安装并运行Docker yum install docker-io –y s ...

  6. BUUCTF(十)[GXYCTF2019]Ping Ping Ping 1

    BUUCTF系列 /?ip=baidu.com /?ip=baidu.com|ls 正常回显,当cat flag.php时,提示不让输入空格,而且后面还不让出现falg字符 IFS IFS (Inte ...

  7. Jenkins——安装部署

    1.部署Jdk 由于jenkins需要jdk环境,所以先部署jdk,解压并设置环境变量就行: # tar zxf jdk-8u45-linux-x64.tar.gz # mv jdk-8u45-lin ...

  8. Linux进阶之补充知识篇

    一.Linux系统的主要特点: 开放性:指系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准 多用户:允许多个用户从相同或不同终端上同时使用同一台计算机 多任务:它是指计算机同时执行多个程 ...

  9. Linux服务之cobbler批量部署篇

    一.Cobbler简介:Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED等服务,结合了PXE.kick ...

  10. Linux Socket编程-(转自吴秦(Tyler))

    "一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...