[题解]luogu_P1627_中位数(排列乱搞

首先我们只关注大小数量关系,所以把小于b的设为-1,大于b的设为1,只要区间包含b且和为0即为合法

统计时用桶记录左和右边sum出现的次数,把左+右==0的乘起来记到答案里

都是比较套路的吧

#include<bits/stdc++.h>
using namespace std;
const int maxn=200009;
int n,b,a[maxn],p,ans;
int sum[maxn],lc[maxn],rc[maxn];
int main(){
    scanf("%d%d",&n,&b);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]<b)a[i]=-1;
        if(a[i]>b)a[i]=1;
        if(a[i]==b)p=i;
    }
    lc[n]=1;rc[n]=1;
    for(int i=p+1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
        lc[n+sum[i]]++;
    }
    for(int i=p-1;i>=1;i--){
        sum[i]=sum[i+1]+a[i];
        rc[n+sum[i]]++;
    }
    for(int i=-n;i<=n-1;i++){
        ans+=lc[i+n]*rc[-i+n];
    }
    printf("%d",ans);
}

原文地址:https://www.cnblogs.com/superminivan/p/11730238.html

时间: 2024-10-31 08:53:56

[题解]luogu_P1627_中位数(排列乱搞的相关文章

BZOJ 1045 糖果传递 题解 【递推乱搞就对了

1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3505  Solved: 1626[Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Outpu

【NOIP模拟赛】beautiful 乱搞(平衡树)+ST

biubiu~~~ 我用平衡树处理的这道题,然而这种方法还是要看评测姬..... 正解是乱搞....就是枚举每一位数作为中位数,比他小的看做-1比他大的看做1,那么我们从一开始就有了一个绵延的山,我们记录这个数之前出现过的距水平线高度差,如果我们在右边找到了这个同样的距离就意味着我们中间的操作为0那么在这两个相同水平面之前的距离就是他作为中位数的一个区间. 似乎这是一种中位数套路........ #include <cstdio> namespace Pre{ inline void read

【乱搞】【HNOI 2008】【bzoj 1011】遥远的行星

1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2640 Solved: 954 Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用.请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

[bzoj1356]Rectangle[Baltic2009][几何常识乱搞]

虽然说是几何常识乱搞,但是想不到啊.. 题意:n个点取4个组成矩形,使面积最大,求面积. n<=1500 题解: 1.对角线相等且相互交于中点的四边形是矩形. 2.矩形四点共圆. 所以$n^2$枚举边,把线段中点和长度打包pair 如果两条线的pair相等则可以构成一个圆,把相等的线段平方级枚举即可. 考虑一个圆上的整点不多,常数小,所以没有T..注意精度问题. [学习]http://blog.csdn.net/wzq_qwq/article/details/49005387 感觉自己代码自带大

【bzoj4917】Hash Killer IV 乱搞

题目描述 已知函数: unsigned int Hash(unsigned int v) { unsigned int t = v; t = t + (t << 10); t = t ^ (t >> 6); t = t + (t << 3); t = t ^ (t >> 11); t = t + (t << 16); return t; } 的返回值为t,求传入的参数v. 输入 第一行包含一个正整数Q(1<=Q<=100000),表示

Ural 1780 Gray Code 乱搞暴力

原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1780 1780. Gray Code Time limit: 0.5 secondMemory limit: 64 MB Denis, Vanya and Fedya gathered at their first team training. Fedya told them that he knew the algorithm for constructing aGray code. Cre

【bzoj5108】[CodePlus2017]可做题 拆位+乱搞

题目描述 给出一个长度为 $m$ 的序列 $a$ ,编号为 $a_1\sim a_m$,其中 $n$ 个位置的数已经确定,剩下的位置的数可以任意指定.现在令 $b$ 表示 $a$ 的前缀异或和,求 $\sum\limits_{i=1}^mb_i$ 的最小值. 输入 输入第一行两个非负整数n,m,分别表示原始序列a的长度及剩余元素的个数. 之后m行,每行2个数i,ai,表示一个剩余元素的位置和数值. 1<=N<=10^9,0<=M<=Min(n,10^5),0<=ai<=

[USACO08OCT]牧场散步Pasture Walking (LCA) (乱搞)

题面传送门我太懒了所以吃掉题面 题解 可以发现如果两点不在一条链上的话,那么他们的最短路径一定会经过LCA. 所以可以维护一下每个点到树根的距离,然后大力前缀和乱搞就好了. #include <bits/stdc++.h> const int max_n=1e4+5; int N,M,cnt; int depth[max_n],father[15][max_n],lg2[max_n],first_edge[max_n],dis[max_n]; struct edge { int to,w,ne

【51nod1443】路径和树(堆优化dijkstra乱搞)

点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短路径,那么最容易想到的就是\(dijkstra\)和\(SPFA\)(毕竟Floyd的时间复杂度难以承受),又由于黄学长说能用\(dijkstra\)时尽量用\(dijkstra\),所以,我就打了一个堆优化的\(dijkstra\)开始乱搞. 其实,这道题目的思路真的挺简单的,只要朴素地做一遍\(