BZOJ 2743
来源:互联网 发布:odf格式 知乎 编辑:程序博客网 时间:2024/06/05 04:31
【题目分析】
树状数组+离线
【代码】
#include <cstdio>#include <cmath>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int next[1000001];int last[1000001];int first[1000001];int a[1000001];int t[1000001];int l[1000001];int r[1000001];int rank[1000001];int ans[1000001];int n,c,m;inline void add(int k,int f){// cout<<"add in "<<k<<" "<<f<<endl; for (;k<=n;k+=k&(-k)) t[k]+=f;}inline int gs(int k){ int ret=0; for (;k;k-=k&(-k)) ret+=t[k]; return ret;}inline bool cmp(int a,int b){return l[a]<l[b];}int main(){ scanf("%d%d%d",&n,&c,&m); for (int i=1;i<=n;++i) scanf("%d",&a[i]); for (int i=n;i;--i) {// scanf("%d",&a[i]);// if (!last[a[i]]) first[a[i]]=i; next[i]=last[a[i]]; last[a[i]]=i; }// for (int i=1;i<=n;++i) printf("%d ",next[i]);printf("\n"); for (int i=1;i<=c;++i) if (next[last[i]]) add(next[last[i]],1); for (int i=1;i<=m;++i) { scanf("%d%d",&l[i],&r[i]); rank[i]=i; } sort(rank+1,rank+m+1,cmp); int ll=1; for (int i=1;i<=m;++i) { int nl=l[rank[i]],nr=r[rank[i]];// cout<<nl<<" "<<nr<<endl; while (ll<nl) { if (next[ll]) add(next[ll],-1); if (next[next[ll]]) add(next[next[ll]],1); ll++; }// cout<<"ans "<<gs(nr)-gs(nl-1)<<endl; ans[rank[i]]=gs(nr)-gs(nl-1); } for (int i=1;i<=m;++i) printf("%d\n",ans[i]);}
0 0
- bzoj 2743
- BZOJ 2743
- 【BZOJ 2743】 [HEOI2012]采花
- bzoj-2743 采花
- bzoj 2743 [HEOI2012]采花
- BZOJ 2743 [HEOI2012]采花
- BZOJ 2743: [HEOI2012]采花
- [BZOJ ]
- BZOJ****-****
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- Java编程之水仙花数
- 关于安卓性能和内存
- Burpsuite Pro v1.6.38安装
- 01背包问题未改进版本
- python & 机器学习 & 计算机视觉 & 深度学习
- BZOJ 2743
- 第三周 项目3 求集合并集
- Android 简单引导页实现
- HDU-5573 Binary Tree(构造/二进制)
- MySQL+Navicat安装
- 持有对方的引用
- 高级查询简介
- 第一篇博客文章
- Java 项目启动流程