传送门

题目大意:

给定一个序列,维护每个数字在[L,R]出现的次数以及交换a[x]和a[x+1]的操作

一开始想的分桶法,感觉复杂度还可以吧,常数有点大,于是死得很惨(65分)

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define ll long long
#define SIZE 2505
#define MAXN 300005
using namespace std; int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,num,len;
struct Bucket{
int L;
int a[SIZE];
vector<int> v;
Bucket(){
L=-;
memset(a,,sizeof(a));
}
void add(int x){
a[++L]=x;
vector<int>::iterator P=lower_bound(v.begin(),v.end(),x);
v.insert(P,x);
}
}s[];
//pos:id->position
//id:
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
n=read();int T=read();
len=pow(1.0*n,0.618);
num=(n-)/len;
for(int i=;i<n;i++){
s[i/len].add(read());
}
while(T--){
int p=read();
int numl=,numr=,posl=,posr=;
if(==p){
int ans=;
int l=read(),r=read(),c=read();
l--,r--;
numl=l/len,numr=r/len;
posl=l%len,posr=r%len;
if(numl!=numr){
for(int i=numl+;i<numr;i++){
ans+=upper_bound(s[i].v.begin(),s[i].v.end(),c)-lower_bound(s[i].v.begin(),s[i].v.end(),c);
}
for(int i=posl;i<=s[numl].L;i++){
if(s[numl].a[i]==c){
ans++;
}
}
for(int i=;i<=posr;i++){
if(s[numr].a[i]==c){
ans++;
}
}
}
else{
for(int i=posl;i<=posr;i++){
if(s[numl].a[i]==c){
ans++;
}
}
}
printf("%d\n",ans);
}
else{
int l=read()-,r=l+;
numl=l/len,numr=r/len;
posl=l%len,posr=r%len;
int lc=s[numl].a[posl],rc=s[numr].a[posr];
if(lc==rc){
continue;
}
vector<int>::iterator it;
it=lower_bound(s[numl].v.begin(),s[numl].v.end(),lc);
s[numl].v.erase(it);
it=lower_bound(s[numl].v.begin(),s[numl].v.end(),rc);
s[numl].v.insert(it,rc);
it=lower_bound(s[numr].v.begin(),s[numr].v.end(),rc);
s[numr].v.erase(it);
it=lower_bound(s[numr].v.begin(),s[numr].v.end(),lc);
s[numr].v.insert(it,lc);
swap(s[numl].a[posl],s[numr].a[posr]);
// for(int i=0;i<=num;i++){
// for(int j=0;j<s[i].v.size();j++){
// printf("%d ",s[i].v[j]);
// }
// printf("\n");
// }
// printf("\n");
}
}
return ;
}

分桶

其实直接记录下每个数字出现的位置放到vector里面然后二分一下就可以了,

思路很简单,正如管理员说的“很多人学数据结构学傻了”,简单的问题不需要那么麻烦的

不过这题有个小坑,编号指的就是从左向右数第几个,不是兔子的属性

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 300005
using namespace std;
int n;
vector<int> s[MAXN];
int read(){
int x=;char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x;
}
void write(int x){
if(!x){
putchar();
putchar('\n');
return;
}
char t[]={};
int cnt=;
while(x){
t[++cnt]=x%;
x/=;
}
for(int i=cnt;i>=;i--){
putchar(+t[i]);
}
putchar('\n');
}
int a[MAXN];
int main()
{
// freopen("color2.in","r",stdin);
n=read();
int T=read();
for(int i=;i<=n;i++){
a[i]=read();
s[a[i]].push_back(i);
}
while(T--){
int p=read();
if(p==){
int l=read(),r=read(),c=read();
write(upper_bound(s[c].begin(),s[c].end(),r)-lower_bound(s[c].begin(),s[c].end(),l));
}
else{
int l=read(),r=l+;
if(a[l]==a[r]){
continue;
}
int P1=lower_bound(s[a[l]].begin(),s[a[l]].end(),l)-s[a[l]].begin();
int P2=lower_bound(s[a[r]].begin(),s[a[r]].end(),r)-s[a[r]].begin();
s[a[l]][P1]=r;
s[a[r]][P2]=l;
swap(a[l],a[r]);
}
}
return ;
}

AC

有点卡常

总的来说这题出的还算不错的,很灵活的数据结构

洛谷mNOIP模拟赛Day1-数颜色的更多相关文章

  1. 【洛谷mNOIP模拟赛Day1】T1 斐波那契

    题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...

  2. 洛谷mNOIP模拟赛Day1-斐波那契

    题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家 ...

  3. 洛谷mNOIP模拟赛Day2-将军令

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...

  4. 洛谷noip 模拟赛 day1 T3

    T7983 大芳的逆行板载 题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇 ...

  5. 洛谷mNOIP模拟赛Day2-星空

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. ...

  6. 洛谷mNOIP模拟赛Day1-分组

    传送门 首先是贪心的思路 从后向前选,能多选就多选, 理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小 对于K==1,枚举1~512直接判断 对于K==2,需要用镜像并查集,来刻画" ...

  7. 洛谷mNOIP模拟赛Day2-入阵曲

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...

  8. 洛谷noip 模拟赛 day1 T1

    T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...

  9. CH Round #48 - Streaming #3 (NOIP模拟赛Day1)

    A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...

随机推荐

  1. 项目Beta冲刺预热

    Beta准备 1. 讨论组长是否重选的议题和结论. 经过讨论,我们认为,经过一段时间的磨合,现任组长是不需要更换的. 2. 下一阶段需要改进完善的功能. 增加关于征信的功能,贴近选题主题 美化界面,尽 ...

  2. Python 图片转字符画

    Python 图片转字符画 一.课程介绍 1. 课程来源 原创 2. 内容简介 本课程讲述怎样使用 Python 将图片转为字符画 3. 前置课程 Python编程语言 Linux 基础入门(新版) ...

  3. Flask 蓝图(Blueprint)

    蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响.但是它们又属于应用中,可以共享应用的配置.对于大型应用来说,我们可以通过添加蓝图来扩 ...

  4. 在360、UC等浏览器,img不加载原因

    问题:图片在360浏览器不被加载,在UC浏览器强制不显示. 前言不多说,直接上图. 360浏览器显示情况: UC浏览器显示情况: 由以上两张截图可以看到,在360浏览器,banner图片处根本没有加载 ...

  5. python小练习之二

    title: python小练习之二 tags: 新建,模板,小书匠 grammar_cjkRuby: true --- python小练习之二 需求:实现用户登录,用户名和密码保存到文件里,连续输入 ...

  6. 释义Oracle 11r2中并行执行相关参数

    因最近对现场某些服务器进行诊断和调整,用到了这类参数,因此对这类参数做了详尽的查阅和研究,现将该类参数释义如下,以方便同行和自己参考,禁止转载: 1.PARALLEL_ADAPTIVE_MULTI_U ...

  7. hibernate_exercise-many- to-one(1)

    多对一关系 1.创建t_user表.t_group表 2.在eclipse中创建对应的实体类 package com.eneity; public class User { private int i ...

  8. 离线Chrome插件安装文件(crx)的安装方法

    离线Chrome插件安装文件(crx)的安装方法 一.正常安装方法 1.开发谷歌浏览器,设置->扩展程序 在打开的谷歌浏览器的扩展管理器中用户可以看到一些已经安装程序的Chrome插件,或者一个 ...

  9. Echarts 中国地图(包括china.js文件)

    用Echarts写中国地图需要导入china.js(现在官方不提供下载,个人找的在最下面有),根据需要的效果如下.位置可以自己在option里面修改 <!DOCTYPE html> < ...

  10. Excel 日期截取(函数)

    需求:时间段截取,去掉年月日,保留时分. 实现函数:    =TEXT(A2,"HH:MM")&"-"&TEXT(B2,"HH:MM& ...