CF-1102E-Monotonic Renumeration
比较可惜昨天比赛的时候时间不够了,在比赛结束之后五分钟找出了bug提交通过了。然并软;
首先这题说b数组的后一项要么等于前一项,要么等于前一项加一,而且如果a[i] == a[j] ,那么b[i] == b[j],所以如果a[i] == a[j],b[i]到b[j]这个区间的值都是一样的,可以看做一个整体;
那么这题要求的不就是2^(区间个数 - 1)吗;
刚看这题就觉得区间合并用并查集,但是当时思路不够清晰后来用了线段树ac掉了,今天就把两种方法的代码都贴上;
- 线段树解法
1102E - 22 GNU C++11 Happy New Year! 265 ms 9428 KB #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MOD = ;
//这里的tree其实就是一个懒标记
int tree[];
map<int, int> mp;
int n, m, L, R, cnt;
//查询包含q的区间前端
int queryHead(int l, int r, int id, int q) {
if (tree[id] != ) {
return tree[id];
}
int mid = l + r >> ;
if (q <= mid) {
return queryHead(l, mid, id << , q);
} else {
return queryHead(mid + , r, id << | , q);
}
}
//把区间[L, R]的值修改为L;
void update(int l, int r, int id) {
if (l >= L && r <= R) {
tree[id] = L;
return;
}
int mid = l + r >> ;
if (L <= mid) {
update(l, mid, id << );
}
if (R > mid) {
update(mid + , r, id << | );
}
}
// 查询线段树中包含q的节点的区间末端
int queryTail(int l, int r, int id, int q) {
if (tree[id] != ) {
return r;
}
int mid = l + r >> ;
if (q <= mid) {
return queryTail(l, mid, id << , q);
} else {
return queryTail(mid + , r, id << | , q);
}
}
// 快速幂
int quick_pow(int n, int m) {
int ans = ;
while (m) {
if (m & ) {
ans = 1LL * ans * n % MOD;
}
n = 1LL * n * n % MOD;
m >>= ;
}
return ans;
}
int main() {
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", &m);
L = mp.count(m) ? queryHead(, n, , mp[m]) : i;
R = i;
update(, n, );
mp[m] = i;
}
int mx = -;
for (int i = ; i <= n; i = queryTail(, n, , i) + ) {
int k = queryHead(, n, , i);
// 因为这题区间合并,这里的k得到的不是合并后的区间末端,只是线段树中的区间末端;所以要比较是否和上一个线段树区间属于同一区间
if (k != mx) {
mx = k;
cnt++;
}
}
printf("%d\n", quick_pow(, cnt - ));
return ;
} - 并查集解法
1102E - 22 GNU C++11 Happy New Year! 171 ms 7100 KB #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MOD = ;
int pre[], cnt;
map<int, int> mp;
int find(int id) {
if (pre[id] == ) {
return id;
}
return pre[id] = find(pre[id]);
}
int quick_pow(int n, int m) {
int ans = ;
while (m) {
if (m & ) {
ans = 1LL * ans * n % MOD;
}
n = 1LL * n * n % MOD;
m >>= ;
}
return ans;
}
int main() {
int n, m;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", &m);
int head = mp.count(m) ? find(mp[m]) : i;
int tail = i;
while (true) {
int x = find(tail);
if (x == head) {
break;
}
pre[x] = head;
tail = x - ;
}
mp[m] = i;
}
for (int i = n; i > ; i = find(i) - ) {
cnt++;
}
printf("%d\n", quick_pow(, cnt - ));
return ;
}
CF-1102E-Monotonic Renumeration的更多相关文章
- 补题Codeforces 1102E. Monotonic Renumeration
这个题还是不太懂,下面附上的是大佬的题解(https://zhanghuimeng.github.io/post/codeforces-1102e-monotonic-renumeration/) E ...
- 【Codeforces 1102E】Monotonic Renumeration
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 会发现如果a[i]=a[j] 那么b[i]~b[j]都是相同的,等于b[i] 而b[i]等于b[i-1]+1或者b[i] 有两种可能 所以对于 ...
- Codeforces J. Monotonic Renumeration(组合)
题目描述: You are given an array consisting of nmonotonic renumeration as an array b consisting of \(n\) ...
- Codeforces Round #531 (Div. 3) E. Monotonic Renumeration (构造)
题意:给出一个长度为\(n\)的序列\(a\),根据\(a\)构造一个序列\(b\),要求: 1.\(b_{1}=0\) 2.对于\(i,j(i\le i,j \le n)\),若\(a_{i ...
- Codeforces Round #531 (Div. 3) ABCDEF题解
Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
随机推荐
- git常用操作及其基本命令
克隆远程仓库代码到本地 本地创建有文件夹 git clone 远程仓库地址 本地文件夹名称 本地没有创建文件夹 git clone 远程仓库地址 文件夹名称 克隆完成之后,使用“cd 文件夹”的方式进 ...
- 吴裕雄--天生自然TensorFlow2教程:维度变换
图片视图 [b, 28, 28] # 保存b张图片,28行,28列(保存数据一般行优先),图片的数据没有被破坏 [b, 28*28] # 保存b张图片,不考虑图片的行和列,只保存图片的数据,不关注图片 ...
- C# 基础Array
一.Array的作用 连续定义多个相同类型的变量,比如我定义1000个学生的学生年龄,int[] age = new int[1000];不需要慢慢的一个一个变量的定义,数组是不是很方便. 需要注意的 ...
- 电影评论分类:二分类问题(IMDB数据集)
IMDB数据集是Keras内部集成的,初次导入需要下载一下,之后就可以直接用了. IMDB数据集包含来自互联网的50000条严重两极分化的评论,该数据被分为用于训练的25000条评论和用于测试的250 ...
- liunx常用命令笔记
安装软件教程 linux安装java:https://www.cnblogs.com/lamp01/p/8932740.html linux安装mysql:https://www.cnblogs.co ...
- Python笔记_第三篇_面向对象_3.重载(overloading)和重写(overriding)
1. 重载: overloading:就是将函数重新定义一遍. 1.1 __str__( )和__repr__( )的重载: 格式: __str__( ):在调用print打印对象时自动调用,是给用户 ...
- dubbo的本地存根
在消费者创建存根类 修改消费者XML 也可以修改消费者注解
- RDD(九)——序列化问题
在实际开发中我们往往需要自己定义一些对于RDD的操作,那么此时需要考虑的主要问题是,初始化工作是在Driver端进行的,而实际运行程序是在Executor端进行的,这就涉及到了跨进程通信,是需要序列化 ...
- Hbase的极限测试经验之java项目的jar包导入
Hbase的极限测试的内容是把之前编过的网站的后台数据库改成hbase即可. 我很快就在hbase数据库中建完表,也把关于操作数据库的函数写好了. 当我调试时,发现在jsp中的操作数据库的函数都不能用 ...
- The website is API(3)
网络爬虫实战知识准备: Requests库.robots(网络爬虫排除标准).BeautifulSoup库 一.Re正则表达式 1. 简洁地表达一组字符串 通用的字符串表达框架 字符串匹配 编译: 2 ...