2743: [HEOI2012]采花

Time Limit: 15 Sec  Memory Limit: 128 MB
Submit: 2056  Solved: 1059
[Submit][Status][Discuss]

Description

萧芸斓是Z国的公主,平时的一大爱好是采花。
今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵洁综合各种因素拟定了m个行程,然后一一向你询问公主能采到多少朵花(她知道你是编程高手,定能快速给出答案!),最后会选择令公主最高兴的行程(为了拿到更多奖金!)。

Input

 第一行四个空格隔开的整数n、c以及m。接下来一行n个空格隔开的整数,每个数在[1, c]间,第i个数表示第i朵花的颜色。接下来m行每行两个空格隔开的整数l和r(l ≤ r),表示女仆安排的行程为公主经过第l到第r朵花进行采花。

Output

 
共m行,每行一个整数,第i个数表示公主在女仆的第i个行程中能采到的花的颜色数。

Sample Input

5 3 5
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5

Sample Output

2
0 0 1 0
【样例说明】
询问[1, 5]:公主采颜色为1和2的花,由于颜色3的花只有一朵,公主不采;询问[1, 2]:颜色1和颜色2的花均只有一朵,公主不采;
询问[2, 2]:颜色2的花只有一朵,公主不采;
询问[2, 3]:由于颜色2的花有两朵,公主采颜色2的花;
询问[3, 5]:颜色1、2、3的花各一朵,公主不采。

HINT

【数据范围】

对于100%的数据,1 ≤ n ≤    10^6,c ≤ n,m ≤10^6。

Source

 

[Submit][Status][Discuss]

用莫队据说会TLE,有人实践了一下,@NEIGHTHORN

那就只好离线+树状数组喽,预处理每种颜色的下一个出现位置,从左向右枚举左端点即可。

 #include <bits/stdc++.h>

 #define siz 1024

 inline int get_c(void)
{
static char buf[siz];
static char *head = buf + siz;
static char *tail = buf + siz; if (head == tail)
fread(head = buf, , siz, stdin); return *head++;
} inline int get_i(void)
{
register int ret = ;
register int neg = false;
register int bit = get_c(); for (; bit < ; bit = get_c())
if (bit == '-')neg ^= true; for (; bit > ; bit = get_c())
ret = ret * + bit - ; return neg ? -ret : ret;
} #define N 1000005 int n;
int c;
int m;
int lt[N];
int rt[N];
int ans[N];
int ord[N];
int num[N];
int nxt[N];
int lst[N];
int fst[N];
int tree[N]; inline bool cmp(int a, int b)
{
return lt[a] < lt[b];
} inline int ask(int p)
{
int ret = ;
for (; p; p -= p&-p)
ret += tree[p];
return ret;
} inline void add(int p, int k)
{
for (; p <= n; p += p&-p)
tree[p] += k;
} signed main(void)
{
n = get_i();
c = get_i();
m = get_i(); for (int i = ; i <= n; ++i)
num[i] = get_i(); for (int i = ; i <= m; ++i)
{
ord[i] = i;
lt[i] = get_i();
rt[i] = get_i();
} std::sort(ord + , ord + + m, cmp); nxt[n + ] = n + ; for (int i = ; i <= c; ++i)
lst[i] = n + , fst[i] = ; for (int i = n; i >= ; --i)
nxt[i] = lst[num[i]], lst[num[i]] = i; for (int i = ; i <= n; ++i)
if (!fst[num[i]])
{
add(nxt[i], );
fst[num[i]] = ;
} int left = ; for (int i = ; i <= m; ++i)
{
while (left < lt[ord[i]])
{
add(nxt[left], -);
add(nxt[nxt[left]], );
++left;
} ans[ord[i]] = ask(rt[ord[i]]);
} for (int i = ; i <= m; ++i)
printf("%d\n", ans[i]);
}
 #include <bits/stdc++.h>

 const int mxn = ;

 int n, m, col[mxn];

 namespace BIT
{
int tree[mxn]; void add(int p, int v)
{
for (; p <= n; p += p&-p)
tree[p] += v;
} int qry(int p)
{
int ret = ; for (; p >= ; p -= p&-p)
ret += tree[p]; return ret;
}
} namespace PRW
{
int nxt[mxn];
int lst[mxn]; void prework(void)
{
nxt[n + ] = n + ; for (int i = ; i <= n + ; ++i)
lst[i] = n + ; for (int i = n; i >= ; --i)
{
nxt[i] = lst[col[i]];
lst[col[i]] = i;
} for (int i = ; i <= n; ++i)
BIT::add(nxt[lst[i]], );
}
} namespace QRY
{
struct query
{
int l, r, ans;
}qry[mxn]; int hd[mxn], to[mxn], nt[mxn], tot; void add(int u, int v)
{
nt[++tot] = hd[u], to[tot] = v, hd[u] = tot;
} void read(int i)
{
scanf("%d%d", &qry[i].l, &qry[i].r); add(qry[i].l, i);
}
} signed main(void)
{
scanf("%d%*d%d", &n, &m); for (int i = ; i <= n; ++i)
scanf("%d", col + i); PRW::prework(); for (int i = ; i <= m; ++i)
QRY::read(i); for (int i = ; i <= n; ++i)
{
for (int j = QRY::hd[i]; j; j = QRY::nt[j])
{
int q = QRY::to[j]; QRY::qry[q].ans = BIT::qry(QRY::qry[q].r);
} BIT::add(PRW::nxt[i], -);
BIT::add(PRW::nxt[PRW::nxt[i]], );
} for (int i = ; i <= m; ++i)
printf("%d\n", QRY::qry[i].ans);
}

@Author: YouSiki

BZOJ 2743: [HEOI2012]采花的更多相关文章

  1. BZOJ 2743: [HEOI2012]采花( 离线 + BIT )

    处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...

  2. BZOJ 2743: [HEOI2012]采花 离线树状数组

    2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...

  3. 洛谷 P2056 BZOJ 2743 [HEOI2012]采花

    //表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 ...

  4. BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]

    题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...

  5. ●BZOJ 2743 [HEOI2012]采花

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题解: 树状数组,离线 求区间里面有多少种出现次数大于等于 2 的颜色. 类似某一个题 ...

  6. bzoj 2743: [HEOI2012]采花【树状数组】

    离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[ ...

  7. 2743: [HEOI2012]采花

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

  8. 【BZOJ】2743: [HEOI2012]采花(树状数组)

    题目 传送门:QWQ 分析 已经凉凉.看错数据范围敲了发莫队........ 和HH的项链差不多,把每种颜色之前的颜色到再之前的颜色这段区间 区间加. 区间加就树状数组特技 代码 #include & ...

  9. [bzoj2743][HEOI2012]采花(树状数组+离线)

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 1832  Solved: 954[Submit][Status] ...

随机推荐

  1. [转]看懂UML类图

    这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系: 能看懂类图中各个类之间的线条.箭头代表什么意思后,也就足够应对 日常的工作和交流: 同时,我们应该能将类图所表达的含义和最终的代码 ...

  2. .Net缓存管理框架CacheManager

    using System; using CacheManager.Core; namespace ConsoleApplication { class Program { static void Ma ...

  3. Java导入的项目乱码怎么解决?(Ⅰ)

    1.项目右键 打开  >>  Properties  >>  Resource  >>  Text file encoding  >>  Other 如 ...

  4. 《java JDK7 学习笔记》之继承与多态

    1.面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承.应该正确判断使用继承的时机及继承之后灵活的运用多态,才是学习继承时的重点. 2.程序代码重复在程序设计上,就是 ...

  5. mysql while,loop,repeat循环,符合条件跳出循环

    1.while循环 DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_test_while`$$ CREATE PROCEDURE `sp_test_while`( ...

  6. Redis学习笔记2-Redis的安装体验

    Redis的官方只提供了Linux版本的,并没提供Windows版本的(不过非官方有windows版本的.可以下载下来做开发测试学习用非常方便.博客后面会介绍到的).Linux下安装过程如下[以下命令 ...

  7. hadoop2.6.2+hbase+zookeeper环境搭建

    1.hadoop环境搭建,版本:2.6.2,参考:http://www.cnblogs.com/bookwed/p/5251393.html 启动服务:在master机器上,进入hadoop安装目录, ...

  8. Ubuntu 部署 Node.js 应用

    安装Node.js环境 sudo apt-get install nodejs sudo apt-get install npm 对于不同环境依赖 的node_module可以采用以下命令来重新生成 ...

  9. 配置jpa

    persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...

  10. 第8章 Java类的三大特性之一:封装

    1.什么是封装 1.1概念 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问.主要是类的属性 1.2好处 a.只能通过规定的方法访问数据b.隐藏类 ...