BZOJ 2743: [HEOI2012]采花
2743: [HEOI2012]采花
Time Limit: 15 Sec Memory Limit: 128 MB
Submit: 2056 Solved: 1059
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5
Sample Output
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
用莫队据说会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]采花的更多相关文章
- BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- 洛谷 P2056 BZOJ 2743 [HEOI2012]采花
//表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 ...
- BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]
题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...
- ●BZOJ 2743 [HEOI2012]采花
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题解: 树状数组,离线 求区间里面有多少种出现次数大于等于 2 的颜色. 类似某一个题 ...
- bzoj 2743: [HEOI2012]采花【树状数组】
离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[ ...
- 2743: [HEOI2012]采花
Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...
- 【BZOJ】2743: [HEOI2012]采花(树状数组)
题目 传送门:QWQ 分析 已经凉凉.看错数据范围敲了发莫队........ 和HH的项链差不多,把每种颜色之前的颜色到再之前的颜色这段区间 区间加. 区间加就树状数组特技 代码 #include & ...
- [bzoj2743][HEOI2012]采花(树状数组+离线)
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1832 Solved: 954[Submit][Status] ...
随机推荐
- Dagger2 (一) 入坑篇
为什么是Dagger2 为了更好的了解Dagger2,请先阅读RoboGuice篇了解依赖注入. 官方文档称,依赖注入这种技术已经在存在多年了,为什么Dagger2要造轮子? Dagger2是第一个全 ...
- svn的使用(转载)
这里只介绍使用CornerStone来使用SVN. CornerStone是Mac OS X系统下非常好用的一款svn工具,当然还有Versions也是可以用的,但是使用起来不如CornerStone ...
- rails程序文件名命名规范
1 一般文件名是用小写单词加下划线分割,但类的名字用骆驼法.例如 sessions_controller.rb中定义SessionsController. 2 helpers内的文件为辅助类,定义了许 ...
- Java中的Atomic包
Atomic包的作用 方便程序员在多线程环境下,无锁的进行原子操作 Atomic包核心 Atomic包里的类基本都是使用Unsafe实现的包装类,核心操作是CAS原子操作: 关于CAS compare ...
- 125个工具与技术(PMBOK2008)
名称 定义 适用场景 适用过程 专家判断 对某方面擅长的人就是专家,找专家协助就是专家判断,专家可能是顾问.干系人.PMO.团队成员 制定项目章程.制定项目管理计划.指导与管理项目执行.监控项目工作. ...
- Database 'xxxx' is being recovered. Waiting until recovery is finished.
巡检发现一个SQL SERVER Express 2005数据库备份时出现下面错误: Database 'xxxx' is being recovered. Waiting until recover ...
- [MySQL Reference Manual] 8 优化
8.优化 8.优化 8.1 优化概述 8.2 优化SQL语句 8.2.1 优化SELECT语句 8.2.1.1 SELECT语句的速度 8.2.1.2 WHERE子句优化 8.2.1.3 Range优 ...
- Linux tcp黏包解决方案
tcpip协议使用"流式"(套接字)进行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你接收的时候就到达,特别是为了提高效率,充分利用带宽,底层会使用缓 ...
- html之长文本框置顶
方法: 在<body> </body>中添加如下代码: <a name="top"></a> <a href="#t ...
- hdu 5641 King's Phone
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5641 题目类型:水题 题目思路:将点x到点y所需要跨过的点存入mark[x][y]中(无需跨过其它点存 ...