题目: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. 【JZOJ6388】小w的作业

    description analysis 二分一个角度,首先假设该弧度角\(\theta \in[{\pi \over 2},\pi]\),要找的直线斜率\(k\in(-∞,\tan\theta]\) ...

  2. You can tell a lot about somebody, looking him in the eye.

    You can tell a lot about somebody, looking him in the eye.注视着别人的眼睛,你能读出很多故事.

  3. 单调栈——cf777E

    傻逼单调栈啊我怎么想了半天dp #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef st ...

  4. duilib教程之duilib入门简明教程13.复杂控件介绍

    首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图:  然后将Name属性改成其他名字,         不能是[控件名+UI+数字]这种,因为这是DuiDesigner默认的名字,它不会实际写 ...

  5. duilib教程之duilib入门简明教程7.XML基础类

    现在大家应该对XML描述界面不那么陌生了,那么我们做进一步介绍. 前面的教程我们写了很多代码,为的是让大家了解下基本流程,其实duilib已经对常用的操作做了很好的包装,正式使用时无需像前面的教程那样 ...

  6. 锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘(强制关机后引起的问题)

    电脑强制关机后,centos系统启动失败,报异常:锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘.解决办法:进入D:\vms\S1目录,删除下 ...

  7. tomcat下文件路径

    第一种:复制要访问的文件a.txt至tomcat安装路径下的webapps/ROOT文件夹下: 访问路径为:localhost:8080/a.txt 或者在webapps文件夹下新建一个文件夹(tes ...

  8. MME、PGW、SGW和PCRF的介绍

    1.简介原文连接:https://blog.csdn.net/Rong_Toa/article/details/94983607 用户面和控制面板分离2.什么是HSS?HSS有什么主要功能?HSS与H ...

  9. CSS清除默认边距

    body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquo ...

  10. Foundation框架系列-NSDictionary

    排序 对字典中的key按照字母升序排序 // NOTE: 排序,得出最终请求字串 NSArray* sortedKeyArray = [[tmpDict allKeys] sortedArrayUsi ...