【模拟8.03】数颜色(vector//主席树)
2024-09-08 09:25:05
才知道vector在插入值后是可以直接修改的...
那就很简单了
用vector的lowerbound这样的二分操作,提前储存每个颜色的位置
发现交换相对位置不变
#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]);
}
}
}
最新文章
- T-SQL字符串相加之后被截断的那点事
- Yii2 关闭和打开csrf 验证 防止表单多次重复提交
- EXCEL经纬度转化
- easyUI之layout
- wait、waitpid 僵尸进程 孤儿进程
- Sharepoint 列表ItemAdding事件判断文件类型、获取当前上传的文件
- Golang项目目录结构组织
- EntityFramework 和 linq 判断是否在指定时间段内的方法
- DropzoneJS 可以拖拽上传的js库
- Codeforces Round #312 (Div. 2) C.Amr and Chemistry
- python成长之路——第六天
- Determining IP information for eth1... failed; no link present. Check cable? 解决办法
- 深入剖析Linux I/O操作与标准I/O操作区别与联系
- zookeeper-3.5.4-beta安装
- lldb调试mysql 插件命令
- 马凯军201771010116《面向对象与程序设计Java》第十三周学习总结
- HTML5元素标记释义
- IIS7.5配置过程
- OpenTSDB(时序数据库官网)
- Ubuntu 18.04下Couldn&#39;t connect to Docker daemon at http+docker://localunixsocket解决办法
热门文章
- idea 2018.3.3版本激活到
- Mybatis-spring-boot-starter自动配置的原理分析
- 解决nohup: 忽略输入并把输出追加到";nohup.out";或者nohup: 忽略输入重定向错误到标准输出端
- 【yumex图形安装双击】【转载】CentOS yum的详细使用方法
- 050.Python前端jQuery
- Docker的介绍和安装(1)
- brk 和 sbrk 区别
- centos下yum方法安装apache+php+mysql
- Go语言练习---判断闰年以及根据现在的秒数求现在的年月日
- TVM性能评估分析(一)