题目链接 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. vsftpd控制用户禁止访问上级目录 只能访问自己目录

    涉及文件: vsftpd.conf chroot_list_file=/etc/vsftpd.chroot_list 如果设置为 chroot_local_user=YES chroot_list_e ...

  2. Python 优雅获取本机 IP 方法【转】

    转自:https://www.cnblogs.com/lfxiao/p/9672975.html 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 ...

  3. C++11 并发指南一(C++11 多线程初探)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  4. C#实现Zip压缩解压实例

    原文地址:https://www.cnblogs.com/GoCircle/p/6544678.html 本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZi ...

  5. js的闭包的一个示例说明

    js中 某个函数的内部函数在该函数执行结束后仍然可以访问这个函数中定义的变量,这称为闭包(Closure) 复制代码 代码如下: function outside() { var myVar = 1; ...

  6. Python源码学习(一)

    考虑到性能的要求,我在工作中用的最多的是c/c++,然而,工作中又经常会有一些验证性的工作,这些工作对性能的要求并不高,反而对完成的效率要求更高,对于这样的工作,用一种开发效率高的语言是合理的想法,鉴 ...

  7. Jquery----对文档操作

    jquery对css操作: 1.CSS .css() - .css("color") -> 获取color css值 - .css("color", &q ...

  8. web----ssl通信

    ssl通信 https://www.cnblogs.com/zhengah/p/5007753.html

  9. BBC 记录片planet earth

    He'll have to remain on guard for another two weeks, but in the jungle, just surviving the day can c ...

  10. 几种常见SQL分页方式效率比较

    分页很重要,面试会遇到.不妨再回顾总结一下: 一:创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTestuse DBTest 二:--创建测试表 creat ...