洛谷mNOIP模拟赛Day1-数颜色
传送门
题目大意:
给定一个序列,维护每个数字在[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-数颜色的更多相关文章
- 【洛谷mNOIP模拟赛Day1】T1 斐波那契
题目传送门:https://www.luogu.org/problemnew/show/P3938 这题出得特别吼啊~~ 通过打表或者大胆猜想斐波那契数列的一些性质,我们不难发现对于一只兔子$x$,其 ...
- 洛谷mNOIP模拟赛Day1-斐波那契
题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 养了一些很可爱的兔子. 有一天,小 C 突然发现兔子们都是严格按照伟大的数学家 ...
- 洛谷mNOIP模拟赛Day2-将军令
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...
- 洛谷noip 模拟赛 day1 T3
T7983 大芳的逆行板载 题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇 ...
- 洛谷mNOIP模拟赛Day2-星空
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. ...
- 洛谷mNOIP模拟赛Day1-分组
传送门 首先是贪心的思路 从后向前选,能多选就多选, 理由:数字越少肯定越优,同时间隔尽量向前推,字典序尽量小 对于K==1,枚举1~512直接判断 对于K==2,需要用镜像并查集,来刻画" ...
- 洛谷mNOIP模拟赛Day2-入阵曲
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 丹青千秋酿,一醉解愁肠. 无悔少年枉,只愿壮志狂. 题目描述 小 F 很喜欢数学,但是到 ...
- 洛谷noip 模拟赛 day1 T1
T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
随机推荐
- ios swift例子源码网址总结
http://blog.csdn.net/woaifen3344/article/details/40079351 http://www.ruanman.net/swift/learn/4607.ht ...
- C++智能指针(auro_ptr...)
写的很好,忍不住转了: 博文原址:http://blog.csdn.net/xt_xiaotian/article/details/5714477 一.简介 由于 C++ 语言没有自动内存回收机制,程 ...
- MySort实验报告
实验日期:2017.5.2 实验内容:利用sort方法对已给的数据进行重新排序. 实验原图: 对原代码进行添加,补充新的内容: 在for循环中,新输入一个变量j,并新定义新的长度toSort.leng ...
- DML数据操作语言之常用函数
所谓函数,就是输入某一值,得到相应的输出结果的功能.相当于一个加工厂,给了原料,最终产出成品. 其中原料 就是参数(parameter). 产品 就是返回值. 函数大致可以分为以下五个种类: 算术函数 ...
- Binary Tree Xorder Traversal
 * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeN ...
- nyoj 第几是谁
第几是谁? 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有"abcdefghijkl"12个字符,将其按字典序排列,如果给出任意一种排列, ...
- 记一次SQL调优/优化(SQL tuning)——性能大幅提升千倍以上
好久不写东西了,一直忙于各种杂事儿,恰巧昨天有个用户研发问到我一个SQL调优的问题,说性能太差,希望我能给调优下,最近有些懒,可能和最近太忙有关系,本来打算问问现在的情况,如果差不多就不调了,那哥们儿 ...
- Linq 集合操作符 Except,Intersect,Union
IList<string> s1 = new List<string>() { "One", "Two", "Three&qu ...
- 解决IE8下opacity属性失效问题
由于opacity属性存在兼容性问题,所以在IE8下,用opacity来设置元素的透明度,会失效,从而导致页面的样式问题. 在IE8及其更早的浏览器下,我们可以使用filter属性,来代替opacit ...
- SSH 配置
ssh免密通用配置 Host * Port 1234 User root #ProxyCommand nc -X 5 -x 127.0.0.1:1081 %h %p #5 socks5, 4 sock ...