博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1972 HHのnecklace 离线+树状数组
阅读量:6138 次
发布时间:2019-06-21

本文共 1455 字,大约阅读时间需要 4 分钟。

此题莫队可过

然而太难了......

我在胡雨菲那看的解法,然后自己打了一波,调了一个错,上交,自信AC。

做法:离线,对于L排序。

每种颜色可能出现很多次,那么我们如何不算重复呢?

只需把[L,n]区间内第一个出现的该颜色标为1即可。

所以我们记录下每个下标i所对应的颜色下一次出现的位置next[i]即可。

每次L挪动时,挪动的每个位置都-1(一定是1不是0),然后把next[i]+1即可。

所求即为∑[1,R]。

 

1 #include 
2 #include
3 #define lowbit(a) (a&(-a)) 4 #define say(a) printf(#a); 5 #define ln printf("\n"); 6 using namespace std; 7 const int N = 500010; 8 9 struct Question10 {11 int L,R,ans,num;12 }quest[200010];13 int next[N],lastfind[N],x[N],tree[N],a[N];14 int n;15 bool cmp1(Question x,Question y) {
return x.L
0;i-=lowbit(i)) ans+=tree[i];28 return ans;29 }30 int main()31 {32 scanf("%d",&n);33 for(int i=1;i<=n;i++) scanf("%d",&a[i]),x[i]=a[i];34 int m;35 scanf("%d",&m);36 for(int i=1;i<=m;i++) scanf("%d%d",&quest[i].L,&quest[i].R),quest[i].num=i;37 sort(x+1,x+n+1);38 int k=0;39 for(int i=1;i<=n;i++) if(x[i]!=x[i-1]) x[++k]=x[i]; /// 离散化40 for(int i=1;i<=n;i++)41 {42 int p=lower_bound(x+1,x+k+1,a[i])-x;///预处理出next[i]43 if(lastfind[p]) next[lastfind[p]]=i;44 else add(i,1);///p -> i 这里调一个错,之前写的p45 lastfind[p]=i;46 }47 int j=1,ans=0;48 //for(int i=1;i<=6;i++) printf("%d ",getsum(i)-getsum(i-1));ln;49 sort(quest+1,quest+m+1,cmp1);50 for(int i=1;i<=m;i++)51 {52 while(j
AC代码如下:

 

用了一些特殊的调试手法。。。

 

转载于:https://www.cnblogs.com/huyufeifei/p/8696078.html

你可能感兴趣的文章
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
直播视频流技术名词
查看>>
企业级java springboot b2bc商城系统开源源码二次开发-hystrix参数详解(八)
查看>>
java B2B2C 多租户电子商城系统- 整合企业架构的技术点
查看>>
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
mysql的innodb中事务日志(redo log)ib_logfile
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>