CF622C Not Equal on a Segment
2024-09-30 09:35:26
题目链接:
http://codeforces.com/problemset/problem/622/C
题目大意:
给定一个长度为n(n不超过200000)的序列,有m(m不超过200000)次询问,第i次询问一个区间[li,ri]内是否存在一个数不等于一个给定值x。如果存在,就输出这个数的位置,否则输出-1。
解题思路:
预处理一个数组p[n]。p[i]表示从位置i向左一直到位置0,第一个不等于a[i]的数的位置。可以以o(n)的复杂度通过对递推实现。具体来说就是首先令p[0]=-1,然后从左向右递推,若a[i - 1] != a[i],则p[i] = i - 1,否则p[i] = p[i - 1]。
查询的时候首先检查a[r]是否等于x。若不等于则找到一个解r;否则检查p[r]即可。
代码:
#include <iostream>
#include <cstdio>
using namespace std; int a[];
int p[];
int n, t, l, r, x;
void init()
{
p[] = -;
for (int i = ; i < n; i++)
{
if (a[i] != a[i - ])
p[i] = i - ;
else
p[i] = p[i - ];
}
}
int main()
{
cin >> n >> t;
for (int i = ; i < n; i++)
{
scanf("%d", &a[i]);
}
init();
while (t--)
{
scanf("%d %d %d", &l, &r, &x);
l--;
r--;
if (a[r] != x)
{
printf("%d\n", r + );
}
else
{
if (p[r] != - && p[r] >= l)
{
printf("%d\n", p[r] + );
}
else
{
puts("-1");
}
}
}
return ;
}
最新文章
- 从Undo,Redo谈命令模式
- Android自定义View 画弧形,文字,并增加动画效果
- SQL Server 2008 R2——用CTE进行递归计算求解累计值
- 学霸数据处理项目之数据处理网页以及后台以及C#代码部分开发者手册
- 解除svn版本控制
- mysql,实现数据库检索结果添加自增的序号
- Spring@Autowired注解与自动装配
- Git补丁
- LinQ综合应用实例
- poj 3126 Prime Path( bfs + 素数)
- bzoj1027
- linux下通过yum安装svn及配置
- spring AOP简单入门
- DevExpress中获取RichTextEdit中RichEditControl的两种方式
- c# 配置文件App.config操作类库
- Struts配置的各种视图转发类型
- Android 使用TextView实现跑马灯效果
- AI学习吧-公钥私钥、沙箱环境
- Es6入门解构
- Java知识锦囊