[UVa12345] Dynamic len
Posted willems
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[UVa12345] Dynamic len相关的知识,希望对你有一定的参考价值。
题意:有n个数编号从0→n-1,两种操作:
Q L R:询问编号为L→R-1的数中共有多少种不同的数
M X Y:将编号为X的数改为Y
共有m个操作
题目 链接 : https://vjudge.net/problem/UVA-12345
#include<bits/stdc++.h> #define LL long long #define ULL unsigned long long #define rep(i,j,k) for(int i=j;i<=k;i++) #define dep(i,j,k) for(int i=k;i>=j;i--) #define INF 0x3f3f3f3f #define mem(i,j) memset(i,0,sizeof(i)) #define make(i,j) make_pair(i,j) using namespace std; const int N=1e6+5; int a[N],pos[N],num[N],now[N],ans[N],l=1,r=0,tmp; struct noq { int l,r,id,t; }q[N]; struct noc { int x,old,ne; }c[N]; bool cmp(noq a,noq b) { if(pos[a.l]==pos[b.l]) { if(pos[a.r]==pos[b.r]) return a.t<b.t; return pos[a.r]<pos[b.r]; } return pos[a.l]<pos[b.l]; } void add(int x,int d) { num[x]+=d; if(d>0 && num[x]==1) tmp++; else if(d<0 && num[x]==0) tmp--; } void go(int x,int ne) { if(l<=x && x<=r) { add(a[x],-1); add(ne,1); } a[x]=ne; } int main() { int n,m; int head=0,tail=0; scanf("%d %d",&n,&m); int M=(int)pow(n,0.666666); rep(i,1,n) { scanf("%d",&a[i]); now[i]=a[i]; pos[i]=(i-1)/M; } rep(i,1,m) { char ch[5]; int x,y; scanf("%s",ch); scanf("%d %d",&x,&y); x++; if(ch[0]==‘Q‘) q[++head]=(noq){x,y,head,tail}; else { c[++tail]=(noc){x,now[x],y}; now[x]=y; } } sort(q+1,q+1+head,cmp); int t=0; rep(i,1,head) { while(t<q[i].t) go(c[t+1].x,c[t+1].ne),++t; while(t>q[i].t) go(c[t].x,c[t].old),--t; while(l<q[i].l) add(a[l++],-1); while(l>q[i].l) add(a[--l],1); while(r<q[i].r) add(a[++r],1); while(r>q[i].r) add(a[r--],-1); ans[q[i].id]=tmp; } rep(i,1,head) printf("%d\n",ans[i]); return 0; }
以上是关于[UVa12345] Dynamic len的主要内容,如果未能解决你的问题,请参考以下文章
UVA 11990 ”Dynamic“ Inversion(线段树+树状数组)
UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2