[bzoj2743][HEOI2012]采花_树状数组
采花 bzoj-2743 HEOI-2012
题目大意:给定n朵花,每朵花有一个种类,m次询问:一段区间中至少出现两朵花的种类的个数。
注释:$1\le n,m\le10^6$。
想法:这个题超级像HH的项链
就是把那个题的$nxt$往后再延迟一个更新即可。
最后,附上丑陋的代码... ...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define RR register #define N 1000010 using namespace std; inline char nc() { static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+ fread (buf,1,100000,stdin),p1==p2)?EOF:*p1++;} int read() { int x=0; char c=nc(); while (! isdigit (c)) c=nc(); while ( isdigit (c)) x=(x<<3)+(x<<1)+c- '0' ,c=nc(); return x; } struct Node { int l,r,id,ans; }q[N]; int nxt[N],tree[N],a[N],p[N],n; inline bool cmp1( const Node &x, const Node &y) { return x.l==y.l?x.r<y.r:x.l<y.l; } inline bool cmp2( const Node &x, const Node &y) { return x.id<y.id; } inline int lowbit( int x) { return x&(-x);} void update( int x, int val) { for (RR int i=x;i<=n+1;i+=lowbit(i)) { tree[i]+=val; } } int query( int x) { int ans=0; for (RR int i=x;i>=1;i-=lowbit(i)) { ans+=tree[i]; } return ans; } int main() { n=read(); int mx=read(),m=read(); for (RR int i=1;i<=n;i++) a[i]=read(); for (RR int i=n;i>=1;i--) { nxt[i]=p[a[i]]; p[a[i]]=i; } for (RR int i=1;i<=mx;i++) { if (p[i]&&nxt[p[i]]) update(nxt[p[i]],1); } for (RR int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i; sort(q+1,q+m+1,cmp1); int l=1; for (RR int i=1;i<=m;i++) { while (l<q[i].l) { if (nxt[l]) update(nxt[l],-1); if (nxt[nxt[l]]) update(nxt[nxt[l]],1); l++; } q[i].ans=query(q[i].r)-query(q[i].l-1); } sort(q+1,q+m+1,cmp2); for (RR int i=1;i<=m;i++) { printf ( "%d\n" ,q[i].ans); } return 0; } |
小结:对于这种询问种类的题要是可以离线的话就这个做法,要是强制在线就得上树套树了。
| 欢迎来原网站坐坐! >原文链接<
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步