luogu 1972 小H的项链

1.莫队算法 TLE 80

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
const int N=50005,M=200005;
int h[N],n,m,a[N],ans[M];
struct node{
    int l,r,id;
    bool operator<(const node&b)const{
       if(h[l]==h[b.l])return r<b.r;
       return l<b.l;}}q[M];
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;}
void block(){
    int k=sqrt(n);
    rep(i,1,n) h[i]=(i-1)/k+1;}
int L,R,now,vis[1000005];
//vis实质上记录的是出现次数
void revise(int i,int d){
     if(d==1){
         if(vis[a[i]]==0)now++;vis[a[i]]++;}
     else{
        vis[a[i]]--;if(!vis[a[i]])now--;}}
int main(){
     n=read();
     rep(i,1,n) a[i]=read();
     block();m=read();
     rep(i,1,m) q[i].l=read(),q[i].r=read(),q[i].id=i;
     sort(q+1,q+1+m);
     rep(i,1,m){
         while(L<q[i].l) revise(L++,-1);
         while(L>q[i].l) revise(--L,1);
         while(R<q[i].r) revise(++R,1);
         while (R>q[i].r) revise(R--,-1);
         ans[q[i].id]=now;}
     //注意编号问题,会影响值(unknown reasons)
     rep(i,1,m) printf("%d\n",ans[i]);
     return 0;
}

2.离线树状数组

别人的代码,没看懂,链接:https://www.cnblogs.com/five20/p/7603849.html

 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[50005],s[50005],has[50005],last[50005],n,m;
 4 struct o{
 5 int x,y,num;
 6 }q[200005];
 7 inline int gi()
 8 {
 9     int a=0;char x=getchar();bool f=0;
10     while((x>‘9‘||x<‘0‘)&&x!=‘-‘)x=getchar();
11     if(x==‘-‘)x=getchar(),f=1;
12     while(x>=‘0‘&&x<=‘9‘)a=a*10+x-‘0‘,x=getchar();
13     return f?-a:a;
14 }
15 bool cmp(o a,o b)
16 {return a.y<b.y;}
17 inline void add(int k,int a)
18 {
19     while(k<=n)
20     {
21         s[k]+=a;
22         k+=k&-k;
23     }
24 }
25 int ans(int x)
26 {
27     int sum=0;
28     while(x)
29     {
30         sum+=s[x];
31         x-=x&-x;
32     }
33     return sum;
34 }
35 int main()
36 {
37     n=gi();
38     for(int i=1;i<=n;i++)
39     {int A=gi();has[i]=last[A]+1;last[A]=i;}
40     m=gi();
41     for(int i=1;i<=m;i++)
42     {
43         q[i].x=gi();q[i].y=gi();q[i].num=i;
44     }
45     sort(q+1,q+m+1,cmp);
46     int now=1;
47     for(int i=1;i<=m;i++)
48     {
49         while(now<=q[i].y)
50         {
51             now++;
52             add(has[now-1],1);
53             add(now,-1);
54         }
55         a[q[i].num]=ans(q[i].x);
56     }
57     for(int i=1;i<=m;i++)
58     printf("%d\n",a[i]);
59     return 0;
60 }

原文地址:https://www.cnblogs.com/asdic/p/9573910.html

时间: 2025-01-18 02:57:58

luogu 1972 小H的项链的相关文章

luogu P1972 [SDOI2009]HH的项链

二次联通门 : luogu P1972 [SDOI2009]HH的项链 /* luogu P1972 [SDOI2009]HH的项链 莫队水过 记录一个count数组 来记录每个数出现了几次 缩小区间时只要看是否只出现一次 扩张区间时只要看看是否出现过即可 */ #include <algorithm> #include <cstdio> #include <cmath> #define Max 1000001 void read (int &now) { no

【渗透笔记】拿下某小H网的全过程

自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下,也没什么用.从cms下手吧放进椰树里 百度一下maxcms的漏洞看到这样一条 http://www.2cto.com/index.php/364.html发现注入点 http://www.xxxxx.com/inc/ajax.asp?action=videoscore&id=11 ,放进sqlmap

luogu P1120 小木棍 [数据加强版]

二次联通门 : luogu P1120 小木棍 [数据加强版] /* luogu P1120 小木棍 [数据加强版] 暴搜 + 剪枝 枚举可能的长度 挨个检查答案 二分显然正确性不能保障 搜索时从最大的开始找 放上当前木棍后的长度比枚举的长度要大, 则退出 若当前的长度与当前扫到的木棍长度相同, 或是还需要的长度与枚举的长度相同,则退出 若当前的木棍不符合要求, 则后面与它长度相同的木棍都不行 */ #include <algorithm> #include <iostream>

小H和密码

小H在击败怪兽后,被一个密码锁挡住了去路     密码锁由N个转盘组成,编号为1~N,每个转盘有M个位置,每个位置上要么有一个小写字母,要么没有任何字符.一个密码能被转盘表示出,当且仅当指定每个转盘上面的某一个位置,然后将这些位置按照所属的转盘编号顺次连接(空位置直接忽略),可以得到这个密码     小H并没有得到任何线索,因此只能猜,她一共猜了Q次,但并不知道自己猜的密码能否被表示出来,于是她向你求助 输入描述: 第1行,三个整数N,M,Q第2~N+1行,每行一个长度为M的字符串,依次表示每个

一个简洁的小H车调运模型

一个简洁的小H车调运模型 不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀.于是有如下问题: 观察帝都 HD区SY村区域,将其划分成10个用车点,用大数据回归预测出第二天(周一)的用车数据如下,夜晚开始调运,务必满足第二天的需求,极小化调运总里程. 数据项 符号 用车点 地区  i 1 2 3 4 5 6 7 8 9 10 X-坐标  X[i] 0 200 155 70 90 45 88 44 60 111 Y-坐标 Y[i] 0 200 30

zzulioj - 2624: 小H的奇怪加法

题目链接:http://acm.zzuli.edu.cn/problem.php?id=2624 题目描述 小H非常喜欢研究算法,尤其是各种加法.没错加法包含很多种,例如二进制中的全加,半加等.全加:对两个输入数据位相加,输出一个结果位和进位,有进位输入的加法.半加:对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法.异或操作就是半加.C语言中,‘^’是异或运算符但是常见的加法都是十进制的,人们习惯使用十进制数,并且默认一个数字的每一位都是十进制的.前几天,小H听说ADD星有一种新的

luogu P3818 小A和uim之大逃离 II

题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然一阵南风吹来,一片乌云从南部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个牛头马面的怪物,低沉着声音说:“呵呵,既然你们来到这,两个都别活了!”.小a和他的小伙伴再次惊呆了! 题目描述 瞬间,地面上出现了一个H行W列的巨幅矩阵,矩阵的每个格子上要么是空地‘

Luogu 1494 - 小Z的袜子 - [莫队算法模板题]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜

Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜