题目链接 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. phantomjs 下拉滚动条获取网页的全部源码

    //codes.js var system = require('system'); var fs = require("fs"); //console.log('Loading ...

  2. 使用Jyhon脚本和PMI模块监控WAS性能数据

    使用Jyhon脚本和PMI模块监控WAS性能数据的优点有: 1.可以使用非交互的方式远程获取数据 2.不需要图形化模块支持 3.对各种was版本的兼容性较高 4.使用方便,官方自带 缺点也有很多: 1 ...

  3. linux更换yum源

    由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源,以下为详细过程: 1.删除redhat原有的yum rpm - ...

  4. FreeSWITCH IVR中lua调用并执行nodejs代码

    一.功能需求: 通过FreeSWITCH的IVR按键调用相应的脚本文件:nodejs提供很多的模组,可以方便的与其它系统或者进行任何形式的通讯,我的应用是通过nodejs发送http post请求: ...

  5. MonkeyRunner之MonkeyRecorder录制回放脚本(亲测可正常运行)

    MonkeyRunner可以录制和回放脚本 前置条件: 电脑连接手机,输入adb devices 看看返回是否手机设备列表(我是真机,模拟器也可以) 配置好安卓sdk和Python环境 step: 1 ...

  6. php 中使用include、require、include_once、require_once的区别

    在PHP中,我们经常会通过include.require.include_once.require_once来引用文件,都可以达到引用文件的目的,但他们之间又有哪些区别呢,接一下我们详细的介绍一下 i ...

  7. poj3585 树形dp 二次扫描,换根法模板题

    #include<iostream> #include<cstring> #include<cstdio> #include<vector> using ...

  8. easyUI拖动课程进课程表

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>拖动 ...

  9. C# byte数组与Image的相互转换【转】

    功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte ...

  10. WebService:CXF-SPRING 读书笔记

    WEBSERVICE是给第三方提供一个接口,可以方便的与不同平台的系统进行通信,当然咯,这个只是我们通常运用到的最主要的作用,还有其他作用,见BAIDU知道.一个WEBSERVICE简单实例分为以下几 ...