P1972 [SDOI2009]HH的项链

P1972 [SDOI2009]HH的项链

题意:

给你一个序列,问这个序列中的种类数
n,m,ai<=1e6

题解:

三个方法:莫队(会超时),树状数组,主席树(会超时)

莫队就是裸题,不讲了,复杂度O(n*sqrt(n))

树状数组:
对于若干个区间[l,r],如果他们的r都相等,那么项链中出现的同一个数字,一定只关心最右边的那一个。
比如:1 3 4 5 1
对于r=5的所有询问,第一个位置上的1是没有价值的,因为第五个位置已经出现1,也就是对于所有查询[L,5]区间来说,如果第一个1被算,那么它完全可以用第5个1来代替
因此,我们对所有询问按照r来排序,然后维护一个树状数组。
树状数组的用途:
对于序列:1 2 1 3
我们用pre[i]来表示上一此出现i的位置
对于第一个1,insert(1,1),此时树状数组表示的每个数有1 0 0 0
对于第二个2,insert(2,1),此时1 1 0 0
对于第三个1,因为之前出现过1,所以将之前1的位置删掉,insert(1,-1),然后再把当前1加入insert(3,1).此时就是0 1 1 0
询问[2,3],就是sum(3)-sum(2-1)=2

主席树做法:
对于每个点,我们用nex表示这个点之后最近的颜色相同的点的位置,如果没有就设为n+1.
对于区间询问l~r之间的种类,其实就是求满足(l<=i<=r&&nex[i]>r)的个数,因为如果某个点的next已近超出了这个区间的范围,就说明这个点对答案产生贡献了(其实和树状数组思想是一样的,相同颜色只考虑离r最近的)
这样问题就变成在区间l~r之间权值大于r的个数
复杂度是O(mlogn),也会超时

代码:

莫队

// Problem: P1972 [SDOI2009]HH的项链
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1972
// Memory Limit: 512 MB
// Time Limit: 2000 ms
// Data:2021-08-12 09:19:00
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{T f= 1;x= 0;char ch= getchar();while (0 == isdigit(ch)) {if (ch == '-')f= -1;ch= getchar();}while (0 != isdigit(ch))x= (x << 1) + (x << 3) + ch - '0', ch= getchar();x*= f;
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
int n, m;
const int maxn= 3e6 + 9;
int a[maxn];
int block;
struct node
{int l, r;int id;bool operator<(const node& x) const{if (l / block != x.l / block)return l < x.l;if ((l / block) & 1)return r < x.r; // 注意这里和下面一行不能写小于(大于)等于,否则会出错(详见下面的小细节)return r > x.r;}
} q[maxn];
int ans[maxn];
int vis[maxn];
int tot= 0;
void add(int x)
{vis[a[x]]++;if (vis[a[x]] == 1)tot++;
}
void del(int x)
{vis[a[x]]--;if (vis[a[x]] == 0)tot--;
}// bool cmp(node a, node b)
// {
// if (a.r / block == b.r / block)
// return a.l < b.l;
// return a.r < b.r;
// }
int main()
{//rd_test();read(n);block= sqrt(n);for (int i= 1; i <= n; i++)read(a[i]);read(m);for (int i= 1; i <= m; i++) {read(q[i].l);read(q[i].r);q[i].id= i;}sort(q + 1, q + 1 + m);int l= 1, r= 0;for (int i= 1; i <= m; i++) {int L= q[i].l, R= q[i].r;while (l < L)del(l++);while (l > L)add(--l);while (r < R)add(++r);while (r > R)del(r--);ans[q[i].id]= tot;}for (int i= 1; i <= m; i++) {printf("%d\n", ans[i]);}return 0;//Time_test();
}

树状数组

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{T f= 1;x= 0;char ch= getchar();while (0 == isdigit(ch)) {if (ch == '-')f= -1;ch= getchar();}while (0 != isdigit(ch))x= (x << 1) + (x << 3) + ch - '0', ch= getchar();x*= f;
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 2e6;
int a[maxn];
struct node
{int l, r;int id;
} q[maxn];
int sum[maxn];
int ans[maxn];
int n;
int vis[maxn];
bool cmp(node a, node b)
{return a.r < b.r;
}
int lowbit(int x)
{return x & (-x);
}
void add(int pos, int x)
{for (int i= pos; i <= n; i+= lowbit(i)) {sum[i]+= x;}
}
int query(int pos)
{int ans= 0;for (int i= pos; i >= 1; i-= lowbit(i)) {ans+= sum[i];}return ans;
}
int query(int l, int r)
{return query(r) - query(l - 1);
}
int main()
{//rd_test();read(n);for (int i= 1; i <= n; i++)read(a[i]);int m;read(m);for (int i= 1; i <= m; i++)read(q[i].l), read(q[i].r), q[i].id= i;sort(q + 1, q + 1 + m, cmp);int beg= 1;for (int i= 1; i <= m; i++) {for (int j= beg; j <= q[i].r; j++) {if (vis[a[j]])add(vis[a[j]], -1);add(j, 1);vis[a[j]]= j;}beg= q[i].r + 1;ans[q[i].id]= query(q[i].l, q[i].r);}for (int i= 1; i <= m; i++)printf("%d\n", ans[i]);return 0;//Time_test();
}

主席树

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{T f= 1;x= 0;char ch= getchar();while (0 == isdigit(ch)) {if (ch == '-')f= -1;ch= getchar();}while (0 != isdigit(ch))x= (x << 1) + (x << 3) + ch - '0', ch= getchar();x*= f;
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 2e6 + 9;
int rs[maxn], ls[maxn];
int sum[maxn];
int n;
int a[maxn];
int rt[maxn];
int tot= 0;
int vis[maxn], nex[maxn];
void build(int& o, int l, int r)
{o= ++tot;sum[o]= 0;if (l == r)return;int mid= (l + r) >> 1;build(ls[o], l, mid);build(rs[o], mid + 1, r);
}
void update(int& o, int l, int r, int nex, int p)
{o= ++tot;ls[o]= ls[nex];rs[o]= rs[nex];sum[o]= sum[nex] + 1;if (l == r)return;int mid= (l + r) >> 1;if (p <= mid)update(ls[o], l, mid, ls[nex], p);elseupdate(rs[o], mid + 1, r, rs[nex], p);
}
int query(int u, int v, int l, int r, int k)
{int mid= (l + r) >> 1;int ans= 0;if (l == r) {return sum[v] - sum[u];}if (k <= mid) {int x= sum[rs[v]] - sum[rs[u]];ans+= query(ls[u], ls[v], l, mid, k) + x;}elseans+= query(rs[u], rs[v], mid + 1, r, k);return ans;
}
int main()
{//rd_test();read(n);for (int i= 1; i <= n; i++) {read(a[i]);if (vis[a[i]])nex[vis[a[i]]]= i;vis[a[i]]= i;}for (int i= 1; i <= n; i++) {if (!nex[i])nex[i]= n + 1;}build(rt[0], 1, n + 1);for (int i= 1; i <= n; i++) {int p= nex[i];update(rt[i], 1, n + 1, rt[i - 1], p);}int m;read(m);while (m--) {int l, r;read(l), read(r);printf("%d\n", query(rt[l - 1], rt[r], 1, n + 1, r + 1));}//Time_test();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从ASP.NET Core2.2到3.0你可能会遇到这些问题

趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识。我们都知道微软目前已经发布了.NET Core3.0的第三个预览版&#xff0c;同时我家里的电脑也安装了vs2019。So&#xff0c;就用vs2019.NET Core3.0来跟着做一下Contoso University这个WEB应用&#xff0c;但是在基…

【学习笔记】整体二分

文章目录引整体二分几道模板题Dynamic Rankings[ZJOI2013]K大数查询[国家集训队]矩阵乘法[THUPC2017] 天天爱射击[CTSC2018]混合果汁引 例1. 给定 nnn 个数 aia_iai​&#xff0c;一次询问&#xff0c;询问区间 [l,r][l,r][l,r] 中的第 kkk 小数。 我们通常想到二分答案&#x…

P2157 [SDOI2009]学校食堂

P2157 [SDOI2009]学校食堂 题意&#xff1a; 小F 的学校在城市的一个偏僻角落&#xff0c;所有学生都只好在学校吃饭。学校有一个食堂&#xff0c;虽然简陋&#xff0c;但食堂大厨总能做出让同学们满意的菜肴。当然&#xff0c;不同的人口味也不一定相同&#xff0c;但每个人…

EntityFramework Core 3.0 Preview

前段时间.Net Core 3.0 发布了&#xff0c;Entity Framework Core 3.0 也发布了Preview版。假期用了一上午大致研究了一遍&#xff0c;同时又体验了一把Visual Studio 2019。总结一下分享给大家&#xff1a;VS2019 新建.Net Core 3.0 Console应用&#xff0c;添加EFCore相关的N…

[luogu-P4299] 首都(并查集 + LCT动态维护树的重心 / 维护虚儿子信息)

problem luogu-P4299 solution 本题考察了很经典的模型&#xff0c;运用了很经典的解法。 本题用到了重心的两个性质&#xff1a; 两棵树合并为同一棵树时&#xff0c;新的重心一定在原来两棵树各自重心的路径上。 重心为根时的最大子树大小最小&#xff0c;不超过 siz/2s…

计算几何模板中的代码

计算几何模板代码选自kuangbin 7 计算几何 7.1 二维几何 // 计算几何模板 const double eps 1e-8; const double inf 1e20; const double pi acos(-1.0); const int maxp 1010; //Compares a double to zero int sgn(double x){if(fabs(x) < eps)return 0;if(x < …

机器学习 ML.NET 发布 1.0 RC

ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架&#xff08;Windows&#xff0c;Linux&#xff0c;macOS&#xff09;,通过使用ML.NET,.NET开发人员可以利用他们现有的工具和技能组&#xff0c;为情感分析&#xff0c;推荐&#xff0c;图像分类等常见场景创建自定义机器…

[PA2015]Siano(线段树 + 二分)

problem luogu-P5579 solution 此题关键在于发现一个结论&#xff1a;生长速度快的草在任何时刻都不可能矮于生长速度慢的草。 正确性显然。 所以当我们将草按照 aaa 升序排序后&#xff0c;每次收割的草一定是一个后缀。 那么这个后缀的起点就可以二分找到。 割完后要对…

容器化时代我们应当选择Kubernetes

昨天发的文章《基于Kubernetes 构建.NET Core 的技术体系》&#xff0c;有同学问.NET Core上有Spring Cloud类似的平台吗&#xff1f; .NET Core出现这么久了&#xff0c;这个为云原生应用开发而准备的系统需要Spring cloud这样的全家桶吗&#xff1f; 大家希望使用Spring Clou…

2021杭电第8场

2021杭电第8场 题号题目知识点HDU 7056X-liked CountingHDU 7057Buying SnacksHDU 7058Ink on paperHDU 7059Counting StarsHDU 7060Separated NumberHDU 7061GCD GameHDU 7062A Simple ProblemHDU 7063Square CardHDU 7064Singing SuperstarHDU 7065Yinyang

[ZJOI2015]幻想乡 Wi-Fi 搭建计划(dp + 结论)

problem luogu-P3344 solution 这个题面&#xff0c;这个数据范围&#xff0c;完完全全就是网络流宗教。。然而我发现建不出来。 很多一眼网络流最后却不是网络流而往往是 dpdpdp 的题目都有一个特性&#xff1a;一个点可以流出多条流量&#xff0c;流入流量却只能为 111。…

CefSharp中c#和JavaScript交互读取电脑信息

介绍CEF是由Marshall Greenblatt于2008年创建的基于Google Chromium的BSD许可开源项目。与主要关注谷歌Chrome应用程序开发的Chromium项目本身不同&#xff0c;CEF专注于在第三方应用程序中促进嵌入式浏览器用例。CEF通过提供生产质量稳定的API&#xff0c;发布跟踪特定Chromiu…

Ink on paper HDU - 7058

Ink on paper HDU - 7058 题意&#xff1a; 给出n个墨水的初始位置&#xff0c;每秒向外扩展0.5cm&#xff0c;显示一个圆圈&#xff0c;问所有墨水连接起来需要多长时间 题解&#xff1a; 很明显&#xff0c;在完全图中找最小生成树&#xff0c;并记录最小生成树中最长的边…

加与乘(博弈论)

problem A,BA,BA,B 在玩游戏&#xff0c;给定一排长度为 nnn 的数列&#xff0c;每个人轮流取出任意一对相邻的两个数&#xff0c;然后把两个数的和或者乘积放入。 TTT 组询问。每组给定 n,mn,mn,m&#xff0c;接下来给定长度为 nnn 的数列 aia_iai​。 m0m0m0 AAA 先操作&…

C#8.0可空引用类型的使用注意要点

最近VS2019正式版发布了&#xff0c;装下来顺便试用了一下C#8.0&#xff0c;最大的看点应该就是可空引用类型了。不过C#8.0仍然处于Beta的状态&#xff0c;而且试用时也遇到了几个坑。背景知识说明&#xff1a;所谓的可空引用类型是指&#xff0c;一旦启用了可空引用类型这个新…

Singing Superstar HDU - 7064

Singing Superstar HDU - 7064 题意&#xff1a; 问在串T中出现了几次不相交的串S&#xff1f; 每次有n个串S询问 题解&#xff1a; AC自动机板子题。。 直接上模板 代码&#xff1a; #include <bits/stdc.h> #include <unordered_map> #define debug(a, b) …

ASP.NET Core Web 项目文件介绍

ASP.NET Core Web 项目文件在本视频中&#xff0c;我们将探索并了解asp.net core项目文件。 我们使用C&#xff03;作为编程语言&#xff0c;因此项目文件具有.csproj扩展名。如果您使用过以前版本的ASP.NET&#xff0c;那么您可能对此文件非常熟悉&#xff0c;但此文件中包含的…

[ZJOI2016] 小星星(树型dp + 状压dp + 容斥)

problem luogu-P3349 solution 这个数据首先就能想到状压 dpdpdp。 先考虑在树上的朴素 dp(i,j,S):dp(i,j,S):dp(i,j,S): 节点 iii 的对应原图编号为 jjj&#xff0c;其子树对应的编号构成的点集为 SSS 的方案数。 需要满足两个限制条件&#xff1a; 原图的每个节点只能被…

GCD Game HDU - 7061

GCD Game HDU - 7061 题意&#xff1a; 有n个数ai&#xff0c;两个人轮流操作&#xff0c;每次选择一个数ai&#xff0c;再人选一个x(1<x<ai)&#xff0c;然后用gcd(ai,x)代替ai 谁先不能操作谁先输掉比赛 题解&#xff1a; 第一反应nim游戏&#xff0c;gcd是取最大公…

[ZJOI2016]旅行者(网格图分治最短路)

problem luogu-P3350 solution 据说&#xff0c;网格图最短路用分治是一个人人皆知的套路。对不起我不是人 类比整体二分的算法流程。 考虑在一个 (xl,yl)−(yl,yr)(xl,yl)-(yl,yr)(xl,yl)−(yl,yr) 矩阵内处理 [ql,qr][ql,qr][ql,qr] 的询问。 以矩阵的中界线 mid\text{…