传送门

题目大意:

给定一个序列,维护每个数字在[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. 团队作业6——展示博客(Alpha版本)

    Deadline: 2017-12-3  23:00PM,以博客发表日期为准   评分基准 按时交 - 有分,检查的项目包括后文的两个方面 团队成员介绍 Alpha阶段进展 团队合作,各成员分工 Be ...

  2. Ubuntu下tomcat或eclipse启动提示没有java环境问题

    tomcat和eclipse默认使用了openjdk,通过压缩包安装的jdk无法被识别,通过修改tomcat/bin下的catalina.sh添加jdk和jre路径即可 sudo gedit cata ...

  3. Scrum 冲刺 第三日

    Scrum 冲刺 第三日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...

  4. 【iOS】swift 排序Sort函数用法(包含NSDictionary排序)

    用了几分钟做的简单翻译 一个例子 直接贴代码,不过多解释 //这是我们的model class imageFile { var fileName = String() var fileID = Int ...

  5. bzoj千题计划251:bzoj3672: [Noi2014]购票

    http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...

  6. bzoj千题计划244:bzoj3730: 震波

    http://www.lydsy.com/JudgeOnline/problem.php?id=3730 点分树内对每个节点动态维护2颗线段树 线段树以距离为下标,城市的价值为权值 对于节点x的两棵线 ...

  7. signalR 消息推送

    业务情景一:上传报表,上传excel.如果excel的数据量很大,上万条,上十万条数据,那么这个上传请求必然是个耗时请求.用户上传之后,很关心上传的进度和结果. 业务情景二:站内消息提醒,实时有效地接 ...

  8. php里面的变量的使用

    php里面的变量一般可以直接使用不需要声明,但是这种var_dump($a);就会报错,还有sql语句里面如果某个变量为空也会报错. 如果变量为null,空,未声明都==false,但是不===fal ...

  9. Centos6.7下面配置vim及其插件

    Vim是在vi的基础上升级而来的,比vi更强大,提供代码补全,编译功能 [4]vim Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用 ...

  10. Python内置函数(19)——oct

    英文文档: oct(x) Convert an integer number to an octal string. The result is a valid Python expression. ...