洛谷P3939 数颜色 二分查找
正解:二分
解题报告:
话说其实我开始看到这题想到的是分块,,,
但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置
所以开个vector(或者开个数组也成QwQ(数组就能用lower_bound
按顺序存下来每个颜色的兔子的位置,每次修改只用O(1)地改就好了
然后复杂度是O(nlogn),和莫队复杂度一样却简单很多
over
(对了,这题我本来想的是分块嘛,我就搜了下可不可以用分块,只看到了一篇题解,说分块会被时空双卡,但是可以优化,我还没有仔细看先贴个链接QAQ
然后放下二分代码QAQ
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=+;
ll n,m,a[N];
vector<ll>gg[N]; inline ll read()
{
register char ch=getchar();register ll x=;register bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline void wk1(){ll l=read(),r=read(),c=read();if(gg[c].size()==){printf("0\n");return;}printf("%d\n",upper_bound(gg[c].begin(),gg[c].end(),r)-lower_bound(gg[c].begin(),gg[c].end(),l));}
inline void wk2(){ll x=read();if(a[x]==a[x+])return;gg[a[x]][lower_bound(gg[a[x]].begin(),gg[a[x]].end(),x)-gg[a[x]].begin()]=x+;gg[a[x+]][lower_bound(gg[a[x+]].begin(),gg[a[x+]].end(),x+)-gg[a[x+]].begin()]=x;swap(a[x],a[x+]);} int main()
{
n=read();m=read();rp(i,,n)a[i]=read(),gg[a[i]].push_back(i);
while(m--){ll op=read();op==?wk1():wk2();}
return ;
}
压行选手绝不轻易认输!(hhh其实我也jio得这次的代码压得丑了点儿,,,然而不压行我就,浑身难受QAQ
#include<bits/stdc++.h>
using namespace std;
#define ll int
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=;
ll n,m,a[N];
vector<ll>gg[N]; inline ll read()
{
register char ch=getchar();register ll x=;register bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline ll lb(ll y,ll x)
{
ll l=,r=gg[x].size()-;
while(l<=r){ll mid=(l+r)>>;if(gg[x][mid]>=y)r=mid-;if(gg[x][mid]<y)l=mid+;}
return l;
}
inline ll ub(ll y,ll x)
{
ll l=,r=gg[x].size()-;
while(l<=r){ll mid=(l+r)>>;if(gg[x][mid]>y)r=mid-;if(gg[x][mid]<=y)l=mid+;}
return l;
}
inline void wk1(){ll l=read(),r=read(),c=read();if(gg[c].size()==){printf("0\n");return;}printf("%d\n",ub(r,c)-lb(l,c));}
inline void wk2(){ll x=read();if(a[x]==a[x+])return;gg[a[x]][lb(x,a[x])]=x+;gg[a[x+]][lb(x+,a[x+])]=x;swap(a[x],a[x+]);} int main()
{
n=read();m=read();rp(i,,n)a[i]=read(),gg[a[i]].push_back(i);
while(m--){ll op=read();op==?wk1():wk2();}
return ;
}
放下手写二分写挂了的代码,,,我找不出错,,,,就很难过TT
洛谷P3939 数颜色 二分查找的更多相关文章
- 洛谷P3939 数颜色(二分 vector)
题意 题目链接 Sol 直接拿vector维护每种颜色的出现位置,然后二分一下. #include<bits/stdc++.h> using namespace std; const in ...
- 洛谷——P3939 数颜色(暴力vecotr+二分)
P3939 数颜色 $vecotr$里二分就是好用,全是$STL$ 颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$ve ...
- 2018.07.07 洛谷 P3939 数颜色(主席树)
P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...
- [洛谷P3939]:数颜色(二分)
题目传送门 题目描述 小$C$的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有相同的颜色.小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃.排列 ...
- [洛谷P3939]数颜色
题目大意:有n个物品,每个物品有一个颜色.现在有两种操作:1.查询l-r内有多少颜色为c的物品并输出.2.将第x个物品和第x+1个交换.现在让你实现这些操作. 解题思路:首先一共有300000种颜色, ...
- [luogu]P3939 数颜色[二分]
[luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排, ...
- Bzoj2120/洛谷P1903 数颜色(莫队)
题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...
- [bzoj2120] [洛谷P1903] 数颜色
Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...
- 洛谷P1903 数颜色 [国家集训队] 莫队
正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...
随机推荐
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
- 异常处理----使用 try…catch…finally 处理异常
使用 try…catch…finally 处理异常 异常处理是通过try-catch-finally语句实现的. try { ...... //可能产生异常的代码 } catch( Exception ...
- swift--控件工厂类的实现
控件工厂类,简而言之就是,减少代码的复用率,只在哪里用,然后在哪里调: 代码如下: import UIKit class ViewFactory: UIView,UITextFieldDelegate ...
- swift - 之 UIColor使用自定义的RGB配色
1.10进制颜色 UIColor(red: /, green: /, blue: /, alpha: 0.5) 2.16进制颜色 UIColor(red: , green: , blue: , alp ...
- Oracle-随机数获取
1.获取10-100的数据,保留两位小数 select trunc(dbms_random.value(10,100),2) from dual ; 2.获取0-1的小数 select dbms_ra ...
- python2.0 s12 day8 _ python线程&python进程
1.进程.与线程区别2.cpu运行原理3.python GIL全局解释器锁4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 6.q ...
- js中字符串支持正则表达式的方法
设一个字符串var myName = "fangming";则支持正则表达式的方法有:split(分割),replace(替换),search(查找),match(元素参数的数组) ...
- web 前端规范实例
<!DOCTYPE html> <html> <head> <title>tmall</title> <!-- 为了被搜索引擎作为流量 ...
- LeetCode——N-Queens
Description: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that n ...
- Git介绍和基本原理
官方文档:http://git-scm.com/doc 1.1 起步 - 关于版本控制 本章关于开始学习 Git. 我们从介绍有关版本控制工具的一些背景知识开始,然后讲解如何在你的系统运行 Git,最 ...