题目: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. CSS3——伸缩布局及应用

    CSS3在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开中可以发挥极大的作用. 主轴:Flex容器的主轴主要用来配置Flex项目,默认是水 ...

  2. Orika JavaBean映射工具探秘

    Orika是一个简单.快速的JavaBean拷贝框架,Orika使用字节代码生成来创建具有最小开销的快速映射器. 关于: 作为开发人员,我们必须为业务问题提供解决方案,我们希望利用我们的时间来做真正重 ...

  3. csp-s模拟9697题解

    题面:https://www.cnblogs.com/Juve/articles/11790223.html 96: 刚一看以为是水题,直接等差数列求和就好了,然后发现模数不是质数,还要1e18*1e ...

  4. nginx css,js合并插件,淘宝nginx合并js,css插件

    先下载Nginx_concat_module,下载后把它放在/usr/local/src/文件夹中,新建文件夹nginx-http-concat把下载的config  ngx_http_concat_ ...

  5. 8种形式的Android Dialog使用举例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...

  6. socket2里面,有些函数带WSA开头,有些不带。请问有何区别?

    WSASocket可以使用WinSock特有功能,比如重叠IO,用dwflags指定.    WSA的A是指api,用于区别spi,因为在spi中还有wspsocket,wspaccept等... 在 ...

  7. id(), is, ==, 的区别与小数据池

    1. id() 内存地址 s = 'asdf' n = id(s) print(n)输出:16506464 #16506464为变量s的内存地址 2. == 比较数值 3. is 比较内存地址 数字, ...

  8. VS2010-MFC(对话框:一般属性页对话框的创建及显示)

    转自:http://www.jizhuomi.com/software/169.html 属性页对话框包括向导对话框和一般属性页对话框两类,上一节演示了如何创建并显示向导对话框,本节将继续介绍一般属性 ...

  9. VS2010-MFC(对话框:属性页对话框及相关类的介绍)

    转自:http://www.jizhuomi.com/software/164.html 一 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过 ...

  10. UVA-699-The Falling Leaves-二叉树+递归

    Each year, fall in the North Central region is accompanied by the brilliant colors of the leaves on ...