Codeforces #496 E1. Median on Segments (Permutations Edition)

Posted thunder-110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces #496 E1. Median on Segments (Permutations Edition)相关的知识,希望对你有一定的参考价值。

 

http://codeforces.com/contest/1005/problem/E1 题目

https://blog.csdn.net/haipai1998/article/details/80985281  原博客

 

对样例1:

5 4
2 4 5 3 1

m=4,所以下标pos=2; 从pos往右遇到比m大的就cnt++,遇到小的就cnt--: 刚开始cnt=0;  mp[cnt]++

于是从pos开始到 n:   mp[0]=1,   mp[1]=1,   mp[0]=2 ,   mp[-1]=1;

 

接下来从pos向左, 遇到比m大的就cnt-- ,遇到比小的就cnt++ , 刚开始cnt=0 

因为n为偶数时m要排在n/2 ,n为奇数时m要排在n/2+1;

所以  ans += mp[cnt] + mp[cnt+1]     比如i=pos时候,此时cnt=0, ans+=mp[0]+mp[1] (偶数的情况加上奇数的情况)

i=pos-1,即cnt=1,a[i]=2的时候,ans+=mp[1]+mp[2] (mp[1]即加到5的位置)

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<string>
 8 #include<cmath>
 9 #include<set>
10 #include<vector>
11 #include<stack>
12 #include<queue>
13 #include<map>
14 using namespace std;
15 #define ll long long
16 #define mem(a,x) memset(a,x,sizeof(a))
17 #define se second
18 #define fi first
19 const int INF= 0x3f3f3f3f;
20 const int N=2e5+5;
21 
22 int n,m,pos,a[N];
23 map<int,ll> mp;
24 
25 int main()
26 {
27     cin>>n>>m;
28     for(int i=1;i<=n;i++){
29         scanf("%d",&a[i]);
30         if(a[i]==m) pos=i;
31     }
32     int num=0,cnt=0;
33     for(int i=pos;i<=n;i++)
34     {
35         if(a[i]>m) cnt++;
36         if(a[i]<m) cnt--;
37         mp[cnt]++;
38     }
39     num=0,cnt=0;
40     ll ans=0;
41     for(int i=pos;i>=1;i--)   // 2 4 5 3 1
42     {
43         if(a[i]<m) cnt++;
44         if(a[i]>m) cnt--;
45         ans+=mp[cnt]+mp[cnt+1];
46     }
47     cout<<ans;
48 }

 


以上是关于Codeforces #496 E1. Median on Segments (Permutations Edition)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces_496_E

[Codeforces 496E] Distributing Parts

Codeforces 496C - Removing Columns

Codeforces Round #496 (Div. 3) ABCDE

Codeforces Round 496

Codeforces Round #496 (Div. 3)