题目链接 COGS

BZOJ2120

洛谷P1903

/*
Add和Subd函数中的vis不能直接设为=1或=0
比如 l=1,r=0 -> l=3,r=5 时,[1,5]的vis标记全都是1
所以要进行取反
*/
#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
const int N=1e4+5,M1=1e4+5,M2=1005,MAX=1e6+5; int n,m,size,A[N],Ans[M1],times[MAX],qn,mn,belong[N],now;
int H[N];
bool vis[N];
struct QUERY
{
int l,r,id,t;//t:修改了几次后的
bool operator <(const QUERY &x)const
{
if(belong[l]==belong[x.l])
{
if(belong[r]==belong[x.r]) return t<x.t;
return r<x.r;
}
return l<x.l;
}
}q[M1];
struct MODIFT
{
int pos,val,bef;
}optm[M2]; inline int read()
{
int now=0,f=1;register char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=getchar());
return now*f;
} void Change(int t)
{
int pos=optm[t].pos;
if(vis[pos])//在询问区间内
{
--times[A[pos]];
if(!times[A[pos]]) --now;
}
optm[t].bef=A[pos],
A[pos]=optm[t].val;//记录下改之前的值,然后更新
if(vis[pos])
{
if(!times[A[pos]]) ++now;
++times[A[pos]];
}
}
void Unchange(int t)//改回来
{
int pos=optm[t].pos;
if(vis[pos])
{
--times[A[pos]];
if(!times[A[pos]]) --now;
}
A[pos]=optm[t].bef;
if(vis[pos])
{
if(!times[A[pos]]) ++now;
++times[A[pos]];
}
}
//void Change(int p,int v)//Change和Unchange可以由这一个函数代替
//{
// if(vis[p])
// Calc(p), A[p]=v, Calc(p);
// else
// A[p]=v;
//}
void Add(int p)
{
if(!times[A[p]]) ++now;
++times[A[p]];
vis[p]^=1;
// vis[p]=1;//加入访问区间 //错的!
}
void Subd(int p)
{
--times[A[p]];
if(!times[A[p]]) --now;
vis[p]^=1;
// vis[p]=0;//从区间中删掉 //错的!
}
void Calc(int p)
{
if(vis[p])
{
if(--times[A[p]]==0)
--now;
}
else if(++times[A[p]]==1)
++now;
vis[p]^=1;
// vis[p]=!vis[p];
} int main()
{
freopen("nt2011_color1.in","r",stdin);
freopen("nt2011_color.out","w",stdout); n=read(),m=read();
size=pow(n,2.0/3.0)*0.7;//取小一点更优
for(int i=1;i<=n;++i)
A[i]=read(), H[i]=A[i], belong[i]=(i-1)/size+1;
char opt[3];
for(int a,b,i=1;i<=m;++i)
{
scanf("%s",opt);a=read(),b=read();
if(opt[0]=='Q')
q[++qn]=(QUERY){a,b,qn,mn};//注意编号
else
optm[++mn].pos=a, optm[mn].val=b;//, optm[mn].bef=H[a], H[a]=b;
}
sort(q+1,q+1+qn);
for(int i=1,l=1,r=0,t=0;i<=qn;++i)
{
int ln=q[i].l,rn=q[i].r,tn=q[i].t;
while(t<tn) Change(++t);
while(t>tn) Unchange(t--);
// while(t<tn) ++t,Change(optm[t].pos,optm[t].val);//++t不能放在参数里写!
// while(t>tn) Change(optm[t].pos,optm[t].bef),--t; while(l<ln) Calc(l++);
while(l>ln) Calc(--l);
while(r<rn) Calc(++r);
while(r>rn) Calc(r--);
// while(l<ln) Subd(l++);
// while(l>ln) Add(--l);
// while(r<rn) Add(++r);
// while(r>rn) Subd(r--);
Ans[q[i].id]=now;
}
for(int i=1;i<=qn;++i)
printf("%d\n",Ans[i]); fclose(stdin);fclose(stdout);
return 0;
}

COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)的更多相关文章

  1. [国家集训队][bzoj2120] 数颜色 [带修改莫队]

    题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...

  2. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  3. P1903 [国家集训队]数颜色 (带修改莫队)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  4. P1903 [国家集训队]数颜色 带修改莫队板子

    大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...

  5. bzoj 2120 数颜色 带修改莫队

    带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...

  6. BZOJ2120数颜色(带修改莫队)

    莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...

  7. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  8. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

  9. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

随机推荐

  1. 【vim】删除标记内部的文字 di[标记]

    当我开始使用 Vim 时,一件我总是想很方便做的事情是如何轻松的删除方括号或圆括号里的内容.转到开始的标记,然后使用下面的语法: di[标记] 比如,把光标放在开始的圆括号上,使用下面的命令来删除圆括 ...

  2. redis学习笔记(面试题)

    1. 什么是redis Redis是一个数据库,他和我们传统的oracle数据库差别是它是基于内存的数据库:因为是基于内存,所以效率就高,在某些场景下就可以对我们传统的关系型数据库做一个补充 2. r ...

  3. db_recovery_file_dest_size

    select name,space_limit,space_used,number_of_files from v$recovery_file_dest; alter system set db_re ...

  4. CSS高度塌陷问题解决方案

    高度塌陷的存在:原因分析 1 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /& ...

  5. KVM -> 虚拟机磁盘管理_03

    1.KVM磁盘管理 1.KVM qcow2.raw.vmdk等镜像格式说明:http://blog.csdn.net/zhengmx100/article/details/53887162 raw: ...

  6. java.util.Map

    map时key/value形式存储信息的,键可以为对象null public static void main(String[] args) { Map<String, String> m ...

  7. Android:Camera

    Android Camera开发 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可 ...

  8. matplotlib画堆叠条形图

    import matplotlib.pyplot as plt%matplotlib inlineplt.style.use('ggplot') plt.style.use("ggplot& ...

  9. Android几种强大的下拉刷新库

    BeautifulRefreshLayout 众多优秀的下拉刷新(除了我写的之外T_T) 说起下拉刷新,好像经历一段历史的洗礼... (1)在我刚学android的时候,用的是XListView,在g ...

  10. 性能测试十四:Xshell链接linux虚拟机

    一.先装一个linux虚拟机 VBox+centos1.先下载Linux镜像文件的ovf或者OVA文件2.打开vbox,点击菜单栏“管理”-“导入虚拟电脑3.选择解压路径中的ovf或者OVA文件,点击 ...