题目

P3939 数颜色

思路1(待修莫队)

哇,这不是莫队模板题吗

3e5,TLE45分

不行 我有信仰啊

pow(n,0.66666)

75分

思路2(vector+二分)

怕不是数据结构学傻了

开vector直接桶拍二分呀

代码1

#include <cmath>
#include <cstdio>
#include <algorithm>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=3e5+7;
inline int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
inline void print(int x) {
if(x>=10)print(x/10);
putchar(x%10+'0');
}
int n,m,A,B,belong[maxn],a[maxn],vis[maxn],C[maxn];
struct query {
int l,r,tim,id,ans,k;
}Q[maxn];
inline bool cmp1(const query &a,const query &b) {
return belong[a.l]^belong[b.l] ? a.l<b.l : belong[a.r]^belong[b.r] ? belong[a.l]&1 ? a.r<b.r :a.r>b.r : belong[a.r]&1 ? a.tim<b.tim : a.tim>b.tim;
}
inline bool cmp2(const query &a,const query &b) {
return a.id<b.id;
}
inline void work(int i,int x,int y) {
if(Q[i].l<=x&&x<=Q[i].r)
--vis[a[x]],++vis[a[y]];
if(Q[i].l<=y&&y<=Q[i].r)
++vis[a[x]],--vis[a[y]];
swap(a[x],a[y]);
}
int main() {
n=read(),m=read();
int k=2100;
FOR(i,1,n) a[i]=read();
FOR(i,1,n) belong[i]=(i-1)/k+1;
FOR(i,1,m) {
int opt=read();
if(opt==1)
Q[++A].id=A,Q[A].l=read(),Q[A].r=read(),Q[A].k=read(),Q[A].tim=B;
else
C[++B]=read();
}
sort(Q+1,Q+1+A,cmp1);
int l=1,r=0,t=0;
FOR(i,1,A) {
for(;l > Q[i].l;) ++vis[a[--l]];
for(;r < Q[i].r;) ++vis[a[++r]];
for(;l < Q[i].l;) --vis[a[l++]];
for(;r > Q[i].r;) --vis[a[r--]]; for(;t > Q[i].tim;) work(i,C[t],C[t]+1),--t;
for(;t < Q[i].tim;) ++t,work(i,C[t],C[t]+1); Q[i].ans=vis[Q[i].k];
}
sort(Q+1,Q+1+A,cmp2);
FOR(i,1,A) print(Q[i].ans),puts("");
return 0;
}

代码2

#include <iostream>
#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define pb(x) push_back(x)
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=3e5+7;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,b[maxn];
vector<int> a[maxn];
int main() {
n=read(),m=read();
FOR(i,1,n) b[i]=read();
FOR(i,1,n) a[1].pb(-0x3f3f3f3f);
FOR(i,1,n) a[b[i]].pb(i);
FOR(i,1,m) {
int opt=read();
if(opt==1) {
int l=read(),r=read(),x=read();
int ans=upper_bound(a[x].begin(),a[x].end(),r)-a[x].begin();
ans-=upper_bound(a[x].begin(),a[x].end(),l-1)-a[x].begin();
cout<<ans<<"\n";
} else {
int x=read();
if(b[x]==b[x+1]) continue;
int j;
j=lower_bound(a[b[x]].begin(),a[b[x]].end(),x)-a[b[x]].begin();
a[b[x]][j]=x+1;
j=lower_bound(a[b[x+1]].begin(),a[b[x+1]].end(),x+1)-a[b[x+1]].begin();
a[b[x+1]][j]=x;
swap(b[x],b[x+1]);
}
}
return 0;
}

P3939 数颜色的更多相关文章

  1. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  2. 【题解】P3939数颜色

    [题解]P3939 数颜色 不要数据结构和模板学傻了... 考虑到兔子们交换都是相邻的,说明任何一次交换只会引起\(O(1)\)的变化. 我们开很多\(vector\)存没种兔子的下标就好了.到时候二 ...

  3. 洛谷——P3939 数颜色(暴力vecotr+二分)

    P3939 数颜色 $vecotr$里二分就是好用,全是$STL$ 颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$ve ...

  4. P3939 数颜色 线段树动态开点

    P3939 数颜色 线段树动态开点 luogu P3939 水.直接对每种颜色开个权值线段树即可,注意动态开点. #include <cstdio> #include <algori ...

  5. [luogu]P3939 数颜色[二分]

    [luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排, ...

  6. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  7. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...

  8. 洛谷P3939 数颜色(二分 vector)

    题意 题目链接 Sol 直接拿vector维护每种颜色的出现位置,然后二分一下. #include<bits/stdc++.h> using namespace std; const in ...

  9. [洛谷P3939]数颜色

    题目大意:有n个物品,每个物品有一个颜色.现在有两种操作:1.查询l-r内有多少颜色为c的物品并输出.2.将第x个物品和第x+1个交换.现在让你实现这些操作. 解题思路:首先一共有300000种颜色, ...

随机推荐

  1. 2018/03/15 每日一个Linux命令 之 mv

    Linux mv命令用来为文件或目录改名.或将文件或目录移入其它位置. mv [参数] [要移动/更名的文件] [移动路径/要更改名字] 平常用的很多了,这里就不多讲解了,只介绍两个重要参数就好了 - ...

  2. Ball---hdu5821(排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5821 题意:有n个盒子,每个盒子又一个值 a[i] 如果 a[i] 大于 0 说明盒子里面有 1 个颜 ...

  3. 杭电oj题目分类

    基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.1032.1037.1040.1048.1056.1058.1 ...

  4. 【PyQt5-Qt Designer】QComboBox(下拉列表框) 使用模板

    import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * ###### ...

  5. "context:annotation-config" and "context:component-scan"

    1.<context:annotation-config/>注册多个处理器 <context:annotation-config/>作用是向 Spring 容器注册 Autow ...

  6. xpath教程 2 - lxml库

    xpath教程 2 - lxml库 这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml. lxml库 lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HT ...

  7. SqlAlchemy个人学习笔记完整汇总-转载

    使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM.   前两种方式可以统称为 core ...

  8. selenium-python:登录网站并签到

    测试网站的图像验证码统一设置成了:121 Elements中定位元素比较费眼睛~~ import time from selenium import webdriver # import os use ...

  9. 计划评审技术PERT

    概念 编辑 PERT(Program Evaluation and Review Technique)即 [2]  计划评审技术,最早是由美国海军在计划和控制北极星导弹的研制时发展起来的.PERT技术 ...

  10. Vim/Vi的使用

     Vim 是vi的加强 Gvim图形化的vim Vim/Vi简介 Vim/Vi是一个功能强大的全屏幕文本编辑器,是Linux/Unix上最常用的文本编辑器,他们 的作用是建立,编辑,显示文本文件 Vi ...