国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[BZOJ2120]數顏色(帶修改莫隊)

2019-11-06 06:23:15
字體:
來源:轉載
供稿:網友

題目描述

傳送門

題解

和BZOJ2453相同,在這里可以看到分塊的做法 而這道題同時又是一道帶修莫隊裸題 帶修莫隊大體方法如下: 1、將修改詢問離線并分開,記錄每一個修改之前最近的一次詢問的編號 2、分塊之后將區間排序,關鍵字為:左端點塊的編號、右端點塊的編號、記錄的最近一次修改的編號 3、在查詢每一次詢問之前,判斷當前做過的修改是否恰好是這次詢問需要的修改,如果不夠將其修改,修改多了的話恢復回去,注意如果修改的位置在前一個詢問的區間內要更新答案 4、轉移詢問和普通莫隊相同

代碼

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 10005int n,m,cq,cc,block,now,ans;struct data{int x,y,t,id,ans;}q[N],ch[N];int c[N],num[N],last[N],cnt[N*100];int cmp(data a,data b){ return num[a.x]<num[b.x]||(num[a.x]==num[b.x]&&num[a.y]<num[b.y])||(num[a.x]==num[b.x]&&num[a.y]==num[b.y]&&a.t<b.t);}void modui(int x,int y,int val){ for (int i=x;i<=y;++i) { if (val==1) { if (!cnt[c[i]]) ++ans; ++cnt[c[i]]; } else { --cnt[c[i]]; if (!cnt[c[i]]) --ans; } }}int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) scanf("%d",&c[i]); block=sqrt(n); for (int i=1;i<=n;++i) num[i]=(i-1)/block+1; for (int i=1;i<=m;++i) { char opt=getchar(); while (opt!='R'&&opt!='Q') opt=getchar(); if (opt=='R') { ++cc; scanf("%d %d",&ch[cc].x,&ch[cc].y); } else { ++cq;q[cq].id=cq; scanf("%d %d",&q[cq].x,&q[cq].y); q[cq].t=cc; } } sort(q+1,q+cq+1,cmp);now=q[1].t; for (int i=1;i<=q[1].t;++i) { last[i]=c[ch[i].x]; c[ch[i].x]=ch[i].y; } modui(q[1].x,q[1].y,1);q[q[1].id].ans=ans; for (int i=2;i<=cq;++i) { if (now<q[i].t) for (int j=now+1;j<=q[i].t;++j) { if (ch[j].x>=q[i-1].x&&ch[j].x<=q[i-1].y) { --cnt[c[ch[j].x]]; if (!cnt[c[ch[j].x]]) --ans; if (!cnt[ch[j].y]) ++ans; ++cnt[ch[j].y]; } last[j]=c[ch[j].x]; c[ch[j].x]=ch[j].y; } else if (now>q[i].t) for (int j=now;j>q[i].t;--j) { if (ch[j].x>=q[i-1].x&&ch[j].x<=q[i-1].y) { --cnt[c[ch[j].x]]; if (!cnt[c[ch[j].x]]) --ans; if (!cnt[last[j]]) ++ans; ++cnt[last[j]]; } c[ch[j].x]=last[j]; } now=q[i].t; if (q[i].x>q[i-1].x) modui(q[i-1].x,q[i].x-1,-1); else modui(q[i].x,q[i-1].x-1,1); if (q[i].y>q[i-1].y) modui(q[i-1].y+1,q[i].y,1); else modui(q[i].y+1,q[i-1].y,-1); q[q[i].id].ans=ans; } for (int i=1;i<=cq;++i)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内丘县| 文水县| 黄浦区| 汪清县| 九江县| 台州市| 德格县| 高平市| 江门市| 丽江市| 运城市| 五原县| 建湖县| 竹山县| 雷州市| 乡宁县| 水城县| 天台县| 田东县| 巴彦淖尔市| 获嘉县| 达拉特旗| 永州市| 游戏| 青冈县| 武汉市| 沙坪坝区| 安庆市| 射阳县| 大余县| 苏尼特左旗| 宣城市| 白城市| 峨眉山市| 芜湖县| 岐山县| 商都县| 武强县| 峡江县| 临邑县| 灌阳县|