P1972 HHのnecklace 离线+树状数组
此题莫队可过
然而太难了......
我在胡雨菲那看的解法,然后自己打了一波,调了一个错,上交,自信AC。
做法:离线,对于L排序。
每种颜色可能出现很多次,那么我们如何不算重复呢?
只需把[L,n]区间内第一个出现的该颜色标为1即可。
所以我们记录下每个下标i所对应的颜色下一次出现的位置next[i]即可。
每次L挪动时,挪动的每个位置都-1(一定是1不是0),然后把next[i]+1即可。
所求即为∑[1,R]。
#include <cstdio>
#include <algorithm>
#define lowbit(a) (a&(-a))
#define say(a) printf(#a);
#define ln printf("\n");
using namespace std;
const int N = ; struct Question
{
int L,R,ans,num;
}quest[];
int next[N],lastfind[N],x[N],tree[N],a[N];
int n;
bool cmp1(Question x,Question y) {return x.L<y.L;}
bool cmp2(Question x,Question y) {return x.num<y.num;}
void add(int x,int v)
{
if(x==) return;
for(int i=x;i<=n;i+=lowbit(i)) tree[i]+=v;
return;
}
int getsum(int x)
{
if(x==) return ;
int ans=;
for(int i=x;i>;i-=lowbit(i)) ans+=tree[i];
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]),x[i]=a[i];
int m;
scanf("%d",&m);
for(int i=;i<=m;i++) scanf("%d%d",&quest[i].L,&quest[i].R),quest[i].num=i;
sort(x+,x+n+);
int k=;
for(int i=;i<=n;i++) if(x[i]!=x[i-]) x[++k]=x[i]; /// 离散化
for(int i=;i<=n;i++)
{
int p=lower_bound(x+,x+k+,a[i])-x;///预处理出next[i]
if(lastfind[p]) next[lastfind[p]]=i;
else add(i,);///p -> i 这里调一个错,之前写的p
lastfind[p]=i;
}
int j=,ans=;
//for(int i=1;i<=6;i++) printf("%d ",getsum(i)-getsum(i-1));ln;
sort(quest+,quest+m+,cmp1);
for(int i=;i<=m;i++)
{
while(j<quest[i].L)
{ add(j,-);
add(next[j],);
j++;
}
//for(int i=1;i<=6;i++) printf("%d ",getsum(i)-getsum(i-1));ln
quest[i].ans=getsum(quest[i].R);
}
sort(quest+,quest+m+,cmp2);
for(int i=;i<=m;i++) printf("%d\n",quest[i].ans);
return ;
}
AC代码如下:
用了一些特殊的调试手法。。。
P1972 HHのnecklace 离线+树状数组的更多相关文章
- P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- 洛谷 P1972"[SDOI2009]HH的项链"(离线+树状数组 or 在线+主席树)
传送门 •题意 给你一个包含 n 个数的数组 $a$: 有 m 此操作,每次操作求区间 [l,r] 中不同数的个数: •题解(离线+树状数组) 以样例 $[1,2,3,4,3,5]$ 为例,求解区间 ...
- BZOJ 1878 HH的项链 (树状数组+离线)
题目大意:给你一个序列,求某区间出现不同的数的个数. 貌似离线树状数组是最好的解法 先把所有询问挂在它们询问的右端点上 然后从头到尾遍历这个序列,记录这个位置的值上一次出现的位置 那么,当遍历到第i位 ...
- POJ 3416 Crossing --离线+树状数组
题意: 给一些平面上的点,然后给一些查询(x,y),即以(x,y)为原点建立坐标系,一个人拿走第I,III象限的点,另一个人拿II,IV象限的,点不会在任何一个查询的坐标轴上,问每次两人的点数差为多少 ...
- HDU 2852 KiKi's K-Number(离线+树状数组)
题目链接 省赛训练赛上一题,貌似不难啊.当初,没做出.离线+树状数组+二分. #include <cstdio> #include <cstring> #include < ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组
题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...
- HDU3333 Turing Tree 离线树状数组
题意:统计一段区间内不同的数的和 分析:排序查询区间,离线树状数组 #include <cstdio> #include <cmath> #include <cstrin ...
- 离线树状数组 hihocoder 1391 Countries
官方题解: // 离线树状数组 hihocoder 1391 Countries #include <iostream> #include <cstdio> #include ...
随机推荐
- day 7-5 生产者消费者模型
一. 生产者和消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 二. 为什么要使用生产者和消费者模式 ...
- 创建虚拟目录失败,必须为服务器名称指定“localhost”
关于微信开发过程,远程调试后,再次打开vs出现项目加载失败的解决办法! 第一步: 第二步:打开编辑的页面,把下图这部分直接注释掉 ok了,再加载一次,就好了!
- C#如何调用C++的dll
背景 一个项目,算法部分使用C++的openCV库编写图像处理程序,编译成dll,用户界面采用C#编写,去调用该dll暴露的接口. C#编写的是托管代码,编译生成微软中间语言,而普通C++代码则编译 ...
- Django 2.11 静态页面404 解决
在settings中配置 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,"static"), ...
- 老男孩python学习自修第四天【字典的使用】
dict = {key1:value1, key2:value2} 定义字典 dict[key] = value 设置字典中指定健的值 dict.pop(key) 删除字典中指定健 dict.popi ...
- pip 升级
pip install --upgrade qrcode pip install --upgrade qrcode==5.3
- JS--bom对象:borswer object model浏览器对象模型
bom对象:borswer object model浏览器对象模型 navigator获取客户机的信息(浏览器的信息) navigator.appName;获得浏览器的名称 window:窗口对象 a ...
- mvc 学前必知
MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性.可移植性,代码的可 ...
- 使用update可以防止并发问题(保证数据的准确性),如果使用select会产生并发问题 ; select * from xx for update 给查询开启事务,默认情况下是没有事物的
update可以锁住数据防止数据被更新且导致与查询出的数据有误差,如果响应条数为0.说明更新失败 则可以回滚事务;
- iOS应用的性能调试
1.Static Analysis 使用之前先清理一下数据:product-->Clean 可能遇到的问题: a.发现工程中有多个“User-facing text should use loc ...