• 首先非常显然的 答案=颜色总数-数量为1的颜色数

  • 如果只有一次询问:

    • 考虑如何算颜色总数:
      如果将每一个颜色在当前询问的最右边的位置赋为1,其余位置赋为0的话,是不是就是一个区间和呢?
      用查询数组1表示。

    • 考虑如何算数量为1的颜色数:
      如果将每一个颜色在当前区间的位置赋为1,该颜色的前一个位置赋为-1,其余位置赋为0,是不是这又变成了一个区间和呢?
      用查询数组2表示。

    • 为什么这是对的呢:
      如果该区间包含了多个x的话其实只用考虑最后两个即可,倒数第三个第四个无关紧要,完全可以缩为0。

  • 接下来考虑多次询问:

    • 如何如果右端点r固定每次将左端点l右移:
      问题就非常简单了吧,只要将右端点所包括的点做成单次询问的查询数组即可,左端点的右移仅仅会影响询问而不会影响查询数组的值。
    • 如果右端点会不断右移呢:
      我们只要使得查询数组仍然成立即可。
      如果每次添加一个点x则将查询数组1中x的上一个位置赋为0,当前位置赋为1;将查询数组2中x的上上个位置赋为0,上个位置赋为-1,当前位置赋为1即可
    • 如何保证上述条件呢:
      将问题离线,以右端点r为关键字排序即可。
  • 注意点:由于n的范围所以要用树状数组来维护区间和。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline long long _read() {long long ans; char c;for (c = getchar(); c<'0' || c>'9'; c = getchar());for (ans = 0; c <= '9'&&c >= '0'; c = getchar()) ans = ans * 10 + c - '0';return ans;
}
long long write_node[20], write_i;
inline void _write(long long ans) {if (!ans) putchar('0');for (write_i = 1; ans; write_i++, ans /= 10) write_node[write_i] = ans % 10;for (write_i--; write_i; write_i--) putchar(write_node[write_i] + '0');putchar('\n'); return;
}
struct TT {#define lowbit(x) x&(-x)int a[2000001], n;inline void inin(int x) {n = x;memset(a, 0, sizeof a);return;}inline int ask(int pos) {register int ans = 0;for (register int i = pos; i; i -= lowbit(i)) ans += a[i];return ans;}inline void change(int pos, int tag) {if (pos == 0) return;for (register int i = pos; i <= n; i += lowbit(i)) a[i] += tag;return;}
}f1, f2; //查询数组
struct TTT {int l, r, pos;
}t[2000001];
int n, q;
int pre[2000001], last[2000001], a[2000001], ans[2000001];
inline bool cmd(TTT t1, TTT t2) {return t1.r < t2.r;
}
inline void inin() {n = _read(); q = _read(); q = _read();for (register int i = 1; i <= n; ++i) a[i] = _read();memset(last, 0, sizeof last);for (register int i = 1; i <= n; ++i) pre[i] = last[a[i]], last[a[i]] = i;for (register int i = 0; i < q; ++i) t[i].l = _read(), t[i].r = _read(), t[i].pos = i;sort(t, t + q, cmd);return;
}
int main() {inin();f1.inin(n); f2.inin(n);for (register int i = 0, r = 1; i < q; ++i) {while (r <= t[i].r&&r <= n) {f1.change(pre[r], -1);f1.change(r, 1);f2.change(pre[pre[r]], 1);f2.change(pre[r], -2);f2.change(r, 1);++r;}ans[t[i].pos] = f1.ask(t[i].r) - f1.ask(t[i].l - 1) - f2.ask(t[i].r) + f2.ask(t[i].l - 1);}for (register int i = 0; i < q; ++i) _write(ans[i]);return 0;
}

【HEOI2012】采花相关推荐

  1. 1619. [HEOI2012]采花

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比 时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿 ...

  2. P4113 [HEOI2012]采花 ( 树状数组 + 离线 )

    题目链接:点击进入 题目 思路 跟此题相似:HH的项链 对于若干个询问的区间 [ l , r ] ,如果他们的 r 都相等的话,那么对于数组中出现的同一个数字,因为要求只有每个数出现至少两次才可以计入 ...

  3. 洛谷P4113 [HEOI2012]采花 题解

    洛谷P4113 [HEOI2012]采花 题解 题目链接:P4113 [HEOI2012]采花 题意:萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园 ...

  4. [HEOI2012]采花(思维 + 离线 + 树状数组)

    题目链接 分析 我只能说太妙了- 离线 + 树状数组 参考题解: 这个题要和<HH的项链>做对比: 关键就是为什么要离线处理,以及 怎么对区间进行排序和维护: [SDOI2009]HH的项 ...

  5. 2743: [HEOI2012]采花(离线树状数组)

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MB Submit: 2365  Solved: 1218 [Submit][Stat ...

  6. cogs1619. [HEOI2012]采花 x

    1619. [HEOI2012]采花 ★★☆   输入文件:1flower.in   输出文件:1flower.out   简单对比 时间限制:5 s   内存限制:128 MB [题目描述] 萧薰儿 ...

  7. BZOJ2743: [HEOI2012]采花

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MB Submit: 2386  Solved: 1231 [Submit][Stat ...

  8. BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】

    题目 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采 ...

  9. P4113 [HEOI2012]采花

    题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...

  10. [HEOI2012]采花

    题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...

最新文章

  1. 一文读懂深度学习中的矩阵微积分
  2. matlab linprog应用示例
  3. 数据中心冷却塔结冰应急演练
  4. 奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?
  5. 【Python】RotatingFileHandler:log日志文件自定义大小+滚动输出
  6. Perfect Appearance NIKE KD 9 PERFORMANCE REVIEW
  7. Scrapy 爬取京东商城华为全系列手机评论
  8. 深度学习优化算法大全系列4:AdaGrad(Adaptive Gradient)
  9. win10系统回收站隐藏的方法
  10. 金融笔记:货币的概念
  11. Android back按键基础开发
  12. web自动化(鼠标、键盘操作)
  13. APS高级计划排程和生产计划排产系统电子行业的解决方案
  14. Android调试工具adb的高逼格使用方式
  15. 目前医疗大数据面临四大挑战
  16. 数据库系统中的三级模式、两级映像以及数据独立性(附绪论思维导图)
  17. iOS开发-常用的数学方法
  18. 华为IdeaHub的商业市场启示“路”
  19. iOS音频播放 (三):AudioFileStream 转
  20. 三种批量删除PLSQL写法效率的比对

热门文章

  1. MySQL多行数据合并(单例显示多个值)之GROUP_CONCAT()函数(字符串连接函数)
  2. MySQL执行成本是如何计算的?
  3. Anaconda创建虚拟环境、配环境变量步骤笔记
  4. 关于eclipse控制台出不来,无法打印日志信息解决办法
  5. windows安装rabbitmq详细实例
  6. K-means算法分析,案例(大数据的用户分组召回)
  7. springcloud在 repository层通过sql语句实现查询功能
  8. 2020身高体重标准表儿童_【宝宝身高体重标准表】儿童身高体重标准表2020、2019_身高体重标准表_亲子百科_太平洋亲子网...
  9. 微信公众平台开发(PHP)(五) 天气预报功能开发
  10. 2021易烊千玺高考成绩查询,2021高考进入倒计时 考生后援团送上祝福