题目链接 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. 【转】Python之函数与变量

    [转]Python之函数与变量 本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 变量与作用域 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的 ...

  2. linux系统的休眠与唤醒简介

    转自:http://blog.csdn.net/haomcu/article/details/7398703 系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很 ...

  3. java中printf()方法简单用法

    %n 换行 相当于 \n %c 单个字符 %d 十进制整数 %u 无符号十进制数 %f 十进制浮点数 %o 八进制数 %x 十六进制数 %s 字符串 %% 输出百分号 > 在printf()方法 ...

  4. Bootstrap3.0学习第五轮(表格)

    详情请查看 http://aehyok.com/Blog/Detail/11.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:h ...

  5. 反向代理负载均衡之APACHE

    反向代理负载均衡之APACHE 一.反向代理1.1 介绍反响代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将 ...

  6. Android:Service

    Android Service: http://www.apkbus.com/android-15649-1-1.html android service 的各种用法(IPC.AIDL): http: ...

  7. 电信运营商 IT 系统介绍

    业务支撑系统 BSS: Business support system  运营支撑系统 OSS: Operation support system  管理支撑系统 MSS: Management Su ...

  8. Expm 2_1 k-路合并操作问题

      假定有k个有序数组,每个数组中含有n个元素,您的任务是将它们合并为单独的一个有序数组,该数组共有kn个元素.设计和实现 一个有效的分治算法解决k-路合并操作问题,并分析时间复杂度.

  9. VirtualBox虚拟机安装Mac OS 10.12

    注:本文作者  (QQ:85805214) 本博主只是转载发布而已. VMware 安装Mac OS 方法 由于Virtual Box拷贝文件比较麻烦,有时候经常出现拷贝失败的情况,故使用VMware ...

  10. 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注 ...