题目:https://www.cnblogs.com/Juve/articles/11295333.html

话说这题方法挺多

40分:暴力

65:莫队,你会T得飞起

我考场上没打出带修莫队,没有修改的·跑普通莫队,有修改的,跑暴力(反正都是离线)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define MAXN 300005
//#define int long long
#define re register
using namespace std;
int n,m,a[MAXN],rk[MAXN];
bool appear[MAXN],flag=0;
int num=0,sum=0,blo,block[MAXN],l=1,r=0;
struct node{
int l,r,id,t,val,opt;
friend bool operator < (node a,node b){
return block[a.l]==block[b.l]?a.r<b.r:a.l<b.l;
}
}ask[MAXN];
struct node1{
int pos,val,t,opt;
}change[MAXN];
struct node2{
int l,r,val,opt,pos;
}vio[MAXN];
int cnt[MAXN],ans[MAXN];
void add(int x){
cnt[x]++;
}
void del(int x){
cnt[x]--;
}
signed main(){
scanf("%d%d",&n,&m);
blo=sqrt(n);
for(re int i=1;i<=n;i++){
scanf("%d",&a[i]);
block[i]=i/blo+1;
if(appear[a[i]]){
flag=1;
}
appear[a[i]]=1;
}
if(!flag){
for(re int i=1;i<=n;i++)
rk[a[i]]=i;
for(re int i=1,opt;i<=m;i++){
scanf("%d",&opt);
if(opt==1){
re int l,r,col;
scanf("%d%d%d",&l,&r,&col);
if(l<=rk[col]&&rk[col]<=r)
puts("1");
else puts("0");
}else{
re int x;
scanf("%d",&x);
rk[a[x]]=x+1;
rk[a[x+1]]=x;
swap(a[x],a[x+1]);
}
}
return 0;
}
for(re int i=1,opt;i<=m;i++){
scanf("%d",&opt);
if(opt==1){
ask[++num].opt=opt;
scanf("%d%d%d",&ask[num].l,&ask[num].r,&ask[num].val);
ask[num].t=sum;
ask[num].id=num;
vio[i].opt=opt;
vio[i].l=ask[num].l,vio[i].r=ask[num].r,vio[i].val=ask[num].val;
}else{
change[++sum].opt=opt;
re int x;
scanf("%d",&x);
change[sum].pos=x,change[sum].val=a[x+1];
change[++sum].opt=opt;
change[sum].pos=x+1,change[sum].val=a[x];
vio[i].opt=opt,vio[i].pos=x;
}
}
if(sum==0){
sort(ask+1,ask+num+1);
for(re int i=1;i<=num;i++){
while(l<ask[i].l){
cnt[a[l++]]--;
//del(a[l++]);
}
while(l>ask[i].l){
cnt[a[--l]]++;
//add(a[--l]);
}
while(r<ask[i].r){
cnt[a[++r]]++;
//add(a[++r]);
}
while(r>ask[i].r){
cnt[a[r--]]--;
//del(a[r--]);
}
ans[ask[i].id]=cnt[ask[i].val];
}
for(re int i=1;i<=num;i++){
printf("%d\n",ans[i]);
}
return 0;
}
else{
for(re int i=1;i<=m;i++){
if(vio[i].opt==1){
re int col=vio[i].val,ans=0;
for(re int j=vio[i].l;j<=vio[i].r;j++){
if(a[j]==col) ans++;
}
printf("%d\n",ans);
}else{
swap(a[vio[i].pos],a[vio[i].pos+1]);
}
}
}
return 0;
}

100:

vector排序+二分查找

#include<cstdio>
#include<vector>
#include<algorithm>
#define N 300050
using namespace std;
int n,m;
int a[N];
vector<int>v[N];
int main()
{
scanf("%d%d",&n,&m);
int ok1=1,ok2=1;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
v[a[i]].push_back(i);
}
int opt,l,r,c,x;
while(m--)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&l,&r,&c);
l=lower_bound(v[c].begin(),v[c].end(),l)-v[c].begin();
r=upper_bound(v[c].begin(),v[c].end(),r)-v[c].begin();
printf("%d\n",r-l);
continue;
}
scanf("%d",&x);
l=a[x],r=a[x+1];
v[l][lower_bound(v[l].begin(),v[l].end(),x)-v[l].begin()]=x+1;
v[r][lower_bound(v[r].begin(),v[r].end(),x+1)-v[r].begin()]=x;
swap(a[x],a[x+1]);
}
return 0;
}

或者。。。主席树?

就是查找排名

#include<bits/stdc++.h>
using namespace std;
#define cri const register int
const int L=1<<20|1;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
inline int read(){
int a=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+ch-'0',ch=getchar();
return a;
}
int a[3000010],rt[3000010],t,now;
int ls[20000010],rs[20000010],da[20000010],cnt;
void insert(int &k,cri l,cri r,cri x,cri y){
if(!k) k=++cnt;
if(l==r){
da[k]+=y;
return;
}
int mid=l+r>>1;
if(x<=mid) insert(ls[k],l,mid,x,y);
else insert(rs[k],mid+1,r,x,y);
da[k]=da[ls[k]]+da[rs[k]];
}
void query(cri k,cri l,cri r,cri L,cri R){
if(!k||da[k]<=0) return;
if(l>=L&&r<=R){
if(da[k]>0) now+=da[k];
return;
}
int mid=l+r>>1;
if(L<=mid) query(ls[k],l,mid,L,R);
if(R>mid) query(rs[k],mid+1,r,L,R);
}
int main(){
// freopen("t.in","r",stdin);
// freopen("w.out","w",stdout);
int n,m,x,y,z,k,ans,ma=0;
scanf("%d%d",&n,&m);t=sqrt(n);
for(int i=1;i<=n;i++) a[i]=read(),insert(rt[a[i]],1,n,i,1);
while(m--){
x=read();ans=0;
if(x==1){
y=read(),z=read(),k=read();
if(y>z) swap(y,z);
now=0;
query(rt[k],1,n,y,z);
printf("%d\n",now);
}
else{
y=read();
insert(rt[a[y]],1,n,y,-1);
insert(rt[a[y+1]],1,n,y+1,-1);
insert(rt[a[y]],1,n,y+1,1);
insert(rt[a[y+1]],1,n,y,1);
swap(a[y],a[y+1]);
}
}
return 0;
}

也可以像我一样,来个平衡树

这里用我的平衡树思路将一下

我们给每个颜色建一个平衡树,将该颜色所在的位置插入平衡树,

修改就暴力del和ins,

查询就是找区间端点的排名,

若我们要询问[L,R]中col的出现次数,那么我们在col的平衡树中查询R+1和L的排名,相减就是答案

好像还要卡常。。。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define MAXN 1000005
#define re register
using namespace std;
int n,m,a[MAXN],root[MAXN];
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9'){ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x;
}
struct Treap{
int tot;
struct node{
int l,r,data,val,size;
}tr[MAXN];
Treap(){tot=1;}
inline void update(re int p){
tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
}
inline int New(re int val){
re int x=++tot;
tr[x].val=val;
tr[x].data=rand();
tr[x].size=1;
return x;
}
inline void merge(re int &root,re int a,re int b){
if(!a||!b){
root=a+b;
return ;
}
if(tr[a].data<tr[b].data){
root=a;
merge(tr[root].r,tr[a].r,b);
}
else{
root=b;
merge(tr[root].l,a,tr[b].l);
}
update(root);
}
inline void split(re int x,re int &a,re int &b,re int val){
if(!x){
a=b=0;
return ;
}
if(tr[x].val<=val){
a=x;
split(tr[x].r,tr[a].r,b,val);
}
else{
b=x;
split(tr[x].l,a,tr[b].l,val);
}
update(x);
}
inline int get_rank(re int &root,re int val){
int x=0,y=0;
split(root,x,y,val-1);
int ans=tr[x].size+1;
merge(root,x,y);
return ans;
}
inline void ins(re int &root,re int val){
int x=0,y=0;
split(root,x,y,val);
merge(x,x,New(val));
merge(root,x,y);
}
inline void del(re int &root,re int val){
int x=0,y=0,z=0;
split(root,x,y,val);
split(x,x,z,val-1);
merge(z,tr[z].l,tr[z].r);
merge(x,x,z);
merge(root,x,y);
}
}treap;
signed main(){
n=read(),m=read();
for(re int i=1;i<=n;i++){
a[i]=read();
treap.ins(root[a[i]],i);
}
for(re int i=1,opt;i<=m;i++){
opt=read();
if(opt==1){
re int l,r,col;
l=read(),r=read(),col=read();
printf("%d\n",treap.get_rank(root[col],r+1)-treap.get_rank(root[col],l));
}else{
re int pos;
pos=read();
if(a[pos]==a[pos+1]) continue;
treap.del(root[a[pos]],pos);
treap.del(root[a[pos+1]],pos+1);
swap(a[pos],a[pos+1]);
treap.ins(root[a[pos]],pos);
treap.ins(root[a[pos+1]],pos+1);
}
}
return 0;
}

HZOI20190803 B题的更多相关文章

  1. HZOI20190803 A,C题

    题目链接:https://www.cnblogs.com/Juve/articles/11295333.html A: 考场上只有70分... 发现几个性质:特殊性质1:在两条链上,看它是fib第几项 ...

  2. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  3. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  4. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  5. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  6. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  7. SQL面试笔试经典题(Part 1)

    本文是在Cat Qi的原贴的基础之上,经本人逐题分别在MySql数据库中实现的笔记,持续更新... 参考原贴:http://www.cnblogs.com/qixuejia/p/3637735.htm ...

  8. 刷LeetCode的正确姿势——第1、125题

    最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的 ...

  9. AWS的SysOps认证考试样题解析

    刚考过了AWS的developer认证,顺手做了一下SysOps的样题.以下是题目和答案. When working with Amazon RDS, by default AWS is respon ...

随机推荐

  1. 【JZOJ6274】梦境

    description analysis 其实可以贪心 先把区间按左端点排序,转折点也排序 扫一次转折点,把所有左端点在当前点左边的区间丢进优先队列里 按照贪心策略,对于某个转折点,一定选择右端点离它 ...

  2. undertow服务器

    参考地址:http://undertow.io/undertow-docs/undertow-docs-1.3.0/index.html 1.引入相关jar <dependencies> ...

  3. 登录操作(方法一:设置flag标志位)

    登录操作(方法一:设置flag标志位) user_name="star"passwoed='123'passed_authentication=Falsecount=0for i ...

  4. 线段树逆序对(偏序)——cf1187D好题!

    /* 排除掉所有不可能的情况,剩下的就是可行的 1.数的数量不相同 2.对任意一个区间进行排序,等价于可以交换任意逆序对, 那么从1到n扫描b数组,判断是否可以将a数组中等于b[i]的值所在的位置j交 ...

  5. hexo next中遇到的bug,引发出的关于jquery中click()函数和on("click",function())的区别

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 背景: 本人在维护博客的时候加入了aplaye ...

  6. Windows下 vundle的安装和使用

    准备工作 1. 安装git 去官网下载,安装即可. 2. 添加git的环境变量 并将Git 的安装路径加入环境变量Path,如 D:\Program Files\Git\cmd 然后运行cmd,输入 ...

  7. day 51 阿里iconfont的使用

    阿里iconfont的使用   1. 找到阿里巴巴图标库 2.找到图标 3.搜索你想要的图标 4.将图标添加到购物车 5.点击右上角的购物车按钮,我这里添加了两个. 6.提示你登陆,不需要花钱,找其中 ...

  8. CentOS升级GDB

    需要先安装ncurses-devel和texinfo 如果不安装ncurses-devel,编译会出错 如果不安装texinfo或者版本太低,安装会出错 1.yum install -y ncurse ...

  9. Collection单列集合中的常用实现类

    Collection 集合层次的根接口 List 有序 有索引 可以重复 ArrayList 底层数据结构是数组 查询快 增删快 线程不安全 效率高 LinkedList 底层数据结构是链表 查询慢 ...

  10. software database is broken解决办法

    ubuntu切换中文时报software database is broken错误. 网上的办法千篇一律,还都没有用.都是去应用中心删除thundbird之类的,啊....... 在终端下执行 sud ...