zoukankan      html  css  js  c++  java
  • Codeforces Round #496 (Div. 3) E1. Median on Segments (Permutations Edition) (中位数,思维)

    • 题意:给你一个数组,求有多少子数组的中位数等于\(m\).(若元素个数为偶数,取中间靠左的为中位数).

    • 题解:由中位数的定义我们知道:若数组中\(<m\)的数有\(x\)个,\(>m\)的数有\(y\)个,只有\(x=y\)\(y-x\)=1时,中位数才能取到\(m\),记\(m\)在原数组的位置为\(pos\).

      ​ 于是,我们先遍历\([pos,n]\),记录区间\([pos,i]\)中大于\(m\)的数和小于\(m\)的数个数差,用桶记录差值的个数.

      然后我们反着遍历\([1,pos]\),在段区间中,比\(m\)小的数可以和右边比\(m\)大的数抵消,比\(m\)大的数可以和右边比\(m\)小的数抵消,所以我们记录这些个数,然后每次更新一下答案即可(要考虑元素个数为偶数的情况且这题爆\(long\ long\)).

      ​ 其实可能有点难理解,我个人认为可以这么想,假如我们不看左边的部分,那么对于右边的部分,只有当差值为\(0\)\(1\)的情况才满足条件,而差值是\(0\)\(1\)的所有情况当我第一次遍历左边的时候(\(m\)本身)就全部加到答案中了,然后再不断向左遍历,和右边相抵消.(比如说,我左边有\(3\)个连续比\(m\)小的数,那么此时\(cnt=3\),而对于右边而言,假如右边的差值为\(3\),也就是说相对比\(m\)大的数有\(3\)个,而此时我左边有\(3\)个比\(m\)小的数,那么他们就抵消了,这种情况自然也就成立,显然,当右边为\(4\)的时候,左边为\(3\)也是成立的).

    • 代码:

      #include <iostream>
      #include <cstdio>
      #include <cstring>
      #include <cmath>
      #include <algorithm>
      #include <stack>
      #include <queue>
      #include <vector>
      #include <map>
      #include <set>
      #include <unordered_set>
      #include <unordered_map>
      #define ll long long
      #define fi first
      #define se second
      #define pb push_back
      #define me memset
      const int N = 1e6 + 10;
      const int mod = 1e9 + 7;
      const int INF = 0x3f3f3f3f;
      using namespace std;
      typedef pair<int,int> PII;
      typedef pair<ll,ll> PLL;
       
      int n,m;
      ll a[N];
      int pos,cnt;
      map<int,ll> mp;
      int main() {
          ios::sync_with_stdio(false);cin.tie(0);
      	cin>>n>>m;
      	 for(int i=1;i<=n;++i){
      	 	cin>>a[i];
      	 	if(a[i]==m) pos=i;
      	 }
      	 for(int i=pos;i<=n;++i){
      	 	if(a[i]>m) cnt++;
      	 	else if(a[i]<m) cnt--;
      	    mp[cnt]++;
      	 }
      	 cnt=0;
      	 ll res=0;
      	 for(int i=pos;i>=1;--i){
      	 	if(a[i]<m) cnt++;
      	 	else if(a[i]>m) cnt--;
      	 	res+=mp[cnt]+mp[cnt+1];
      	 }
      	 printf("%lld\n",res);
      	 
          return 0;
      }
      
  • 相关阅读:
    利用 AlwaysInstallElevated 提权
    一批内网文章分享
    关于DLL劫持提权
    Xposed+JustTrustMe关闭ssl证书验证
    关于windows组策略首选项提权
    关于代替Procdump dump lsass的两种方法
    与ServletContext相关的监听器
    java EE 监听器
    ServletContext
    GenericServlet
  • 原文地址:https://www.cnblogs.com/lr599909928/p/12984973.html
Copyright © 2011-2022 走看看