Codeforces Codeforces Round #484 (Div. 2) D. Shark
Codeforces Codeforces Round #484 (Div. 2) D. Shark
题目连接:
http://codeforces.com/contest/982/problem/D
Description
For long time scientists study the behavior of sharks. Sharks, as many other species, alternate short movements in a certain location and long movements between locations.
Max is a young biologist. For $n$ days he watched a specific shark, and now he knows the distance the shark traveled in each of the days. All the distances are distinct. Max wants to know now how many locations the shark visited. He assumed there is such an integer $k$ that if the shark in some day traveled the distance strictly less than $k$, then it didn't change the location; otherwise, if in one day the shark traveled the distance greater than or equal to $k$; then it was changing a location in that day. Note that it is possible that the shark changed a location for several consecutive days, in each of them the shark traveled the distance at least $k$.
The shark never returned to the same location after it has moved from it. Thus, in the sequence of $n$ days we can find consecutive nonempty segments when the shark traveled the distance less than $k$ in each of the days: each such segment corresponds to one location. Max wants to choose such $k$ that the lengths of all such segments are equal.
Find such integer $k$, that the number of locations is as large as possible. If there are several such $k$, print the smallest one.
Sample Input
8
1 2 7 3 4 8 5 6
Sample Output
6
25 1 2 3 14 36
题意
给定一个k,所有严格小于k的为0,大于等于k的为1,由此产生新序列。
对于新的序列
1.要保证所有连续为1的长度相等
2.满足1情况下,尽可能段数更多
3.满足2的k尽可能小
Creating a new sequence, for each element replace by 0, if \(x<k\); otherwise 1.
If the new sequence is valid, it must fit these condition:
1.The length of every consecutive nonempty segments which is made of 1 are same.
2.The number of consecutive segments is maximum possible satisfying the first condition,
3.K is smallest possible satisfying the first and second conditions.
题解:
用优先队列来枚举k,用并查集维护线段,然后判断线段是否改变了答案
Use priority_queue to enumeratioin k. Use Disjoint set union to maintain segment, then judge the new segment changing the answer or not.
代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[100010];
using pii = pair<int, int>;
priority_queue<pii, vector<pii>, greater<pii> > q;
int fa[100010];
int sz[100010];
int sumduan;
int bigduan;
int maxduan;
int ans;
int ansduan;
int find(int k) {
return fa[k] == k ? k : fa[k] = find(fa[k]);
}
void unionfa(int q, int w) {
if (w > q) swap(q, w);
fa[q] = w = find(w);
sz[w] += sz[q];
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cerr.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sz[i] = 1;
fa[i] = i;
q.push(make_pair(a[i], i));
}
memset(a, 0, sizeof a);
for (int i = 1; i <= n; i++) {
int o = q.top().first;
int x = q.top().second;
q.pop();
a[x] = 1;
if (a[x - 1] && a[x + 1]) {
unionfa(x, x - 1);
unionfa(x, x + 1);
sumduan--;
} else if (a[x - 1]) {
unionfa(x, x - 1);
} else if (a[x + 1]) {
unionfa(x, x + 1);
} else {
sumduan++;
}
int f = find(x);
if (sz[f] > maxduan) {
maxduan = sz[f];
bigduan = 1;
} else if (sz[f] == maxduan) {
bigduan++;
}
if (bigduan == sumduan) {
if (sumduan > ansduan) {
ansduan = sumduan;
ans = o;
}
}
}
cout << ans+1 << endl;
}
Codeforces Codeforces Round #484 (Div. 2) D. Shark的更多相关文章
- 【set】【multiset】Codeforces Round #484 (Div. 2) D. Shark
题意:给你一个序列,让你找一个k,倘若把大于等于k的元素都标记为不可用,那么剩下的所有元素形成的段的长度相同,并且使得段的数量尽量大.如果有多解,输出k尽量小的. 把元素从大到小排序插回原位置,用一个 ...
- Codeforces Codeforces Round #484 (Div. 2) E. Billiard
Codeforces Codeforces Round #484 (Div. 2) E. Billiard 题目连接: http://codeforces.com/contest/982/proble ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
- Codeforces Beta Round #79 (Div. 2 Only)
Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...
- Codeforces Beta Round #77 (Div. 2 Only)
Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...
- Codeforces Beta Round #76 (Div. 2 Only)
Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...
- Codeforces Beta Round #75 (Div. 2 Only)
Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...
- Codeforces Beta Round #74 (Div. 2 Only)
Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...
随机推荐
- js中的“默默的失败”
看阮一峰的js标准教程,看到了“默默的失败”觉得很形象也很无奈, 总结一下都有哪些地方会“默默的失败” 字符串内部的单个字符无法改变和增删,这些操作会默默地失败. var s = 'hello'; d ...
- Bootstrap中的data-toggle,data-target
data-toggle指以什么事件触发常用的如collapse,modal,popover,tooltips等:data-target指事件的目标, 一起使用就是代表data-target所指的元素以 ...
- CSS 背景图像 背景图片定位
背景图片定位 background-position属性可以给背景图片定位. background-position属性有两个值,第一个值是水平位置,第二个值是垂直位置.这两个值可以使用百分比来表示( ...
- Java 定时任务的几种实现方式
JAVA实现定时任务的几种方式 @(JAVA)[spring|quartz|定时器] 近期项目开发中需要动态的添加定时任务,比如在某个活动结束时,自动生成获奖名单,导出excel等,此类任务由于活动 ...
- icons 在线网站
icons https://www.iconfinder.com/ http://v3.bootcss.com/components/ http://fontawesome.io/icons/ htt ...
- Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中
一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...
- .net MVC简洁的登录页面
初学mvc,参考别人的代码写的 界面效果如下: 代码如下: @{ Layout = null; } <!DOCTYPE html> <html> <head> &l ...
- Linux /etc/hosts文件
均为转载 ———————— 1.主机名: 无论在局域网还是INTERNET上,每台主机都有一个IP地址,是为了区分此台主机和彼台主机,也就是说IP地址就是主机的门牌号. 公网:IP地址不方便记忆,所以 ...
- go语言语法基础
1. go标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号 如:fmt.Println("hello world") 2.行分隔符 在 Go 程序中,一 ...
- 用python计算圆周率PI
1.蒙特卡洛求圆周率 向区域内随即撒点 当点的数目足够多时,落在圆的点数目与在正方形点数目成正比 即圆的面积和正方形的面积成正比 可以得出计算圆周率的算法 DARTS=100000000 hits ...