BZOJ 1303

思路:

水题  竟然不会做 尴尬

比b大的数=1 比b小的数=-1

找到b 统计一下左边比b大x的数有多少

扫右边的时候就查左边的表 就可以了

//By SiriusRen
#include <cstdio>
using namespace std;
const int N=200500;
int n,b,sum[N],p,a[N],cnt[N];
long long ans;
int main(){
    scanf("%d%d",&n,&b);
    sum[0]=n;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]>b)sum[i]=sum[i-1]+1;
        else if(a[i]<b)sum[i]=sum[i-1]-1;
        else sum[i]=sum[i-1],p=i;
    }
    for(int i=p;i<=n;i++)cnt[sum[i]]++;
    for(int i=0;i<p;i++)ans+=cnt[sum[i]];
    printf("%lld\n",ans);
}
时间: 2024-08-07 20:55:05

BZOJ 1303的相关文章

[BZOJ 1303] [CQOI2009] 中位数图 【0.0】

题目链接:BZOJ - 1303 题目分析 首先,找到 b 的位置 Pos, 然后将数列中小于 b 的值赋为 -1 ,大于 b 的值赋为 1 . 从 b 向左扩展,不断算 Sum[i, b - 1] ,然后将 Cnt[Sum[i, b - 1]] 加一,这样就算出每个左边的Sum值有多少个了. 然后从 b 向右扩展,不断算 Sum[b + 1, i] ,然后 Ans += Cnt[Sum[b + 1, i]] . 代码 #include <iostream> #include <cstd

bzoj 1303: [CQOI2009]中位数图 数学

1303: [CQOI2009]中位数图 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1303 Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的

BZOJ 1303: [CQOI2009]中位数图【前缀和】

1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2737  Solved: 1698[Submit][Status][Discuss] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数.

【BZOJ 1303】 [CQOI2009]中位数图

1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1452  Solved: 951 [Submit][Status] Description 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数. Sample

BZOJ 1303 【CQOI2009】中位数图

baidu了一下bzoj水题列表...找到这道题.   题目大意:给定一个数t,在给定的一段包含1-n的序列中找出多少个长度为奇数子序列的中位数为t. 第一眼没看数据范围,于是开心的打了一个O(n^3)的循环,TLE....   想了想,子序列中必须包含t,所以子序列中其他数的个数必定为偶数,所以子序列中有t以及n个大于t的数和n个小于t的数(n为偶数):   因为是1-n的排列,所以也不会出现多个t的情况..   于是发现了一个很神奇的思路,对于序列里任何一个数,把小于t的数定义为-1,等于t

bzoj 1303: [CQOI2009]中位数图

1 #include<cstdio> 2 #include<iostream> 3 #define M 100005 4 using namespace std; 5 int a[M],l[2*M],r[2*M],sum[M],n,m,p,ans; 6 int main() 7 { 8 scanf("%d%d",&n,&m); 9 for(int i=1;i<=n;i++) 10 { 11 scanf("%d",&

BZOJ 1303 中位数图

注意细节啊....典型的乱搞. #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define maxn 100500 using namespace std; long long n,a[maxn],mx[maxn],mi[maxn],cnta[maxn][3],cntb[maxn][3],regis[4],b,rec; long long num[maxn],kk

BZOJ 1303 CQOI 2009 中位数图 模拟

题目大意:给出一个1~n的排列,问这其中的中位数为k的子序列的数量是多少. 思路:要想让k为中位数,一定要让它出现在这个序列中所以就以这个数为中心向两边拓展.想让一个数成为中位数,那么这个序列中出现的小于它的数一定要等于大于它的数.考虑到这个数左右都有可能有数字,那么就可以表示成:前多+后多=前少+后少,也就是前多-前少=后少-后多.之后就用个数组随意统计一下就行了. CODE: #include <cstdio> #include <cstring> #include <i

BZOJ 1303: [CQOI2009]中位数图 【水题】

给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b.中位数是指把所有元素从小到大排列后,位于中间的数. Input 第一行为两个正整数n和b ,第二行为1~n 的排列. Output 输出一个整数,即中位数为b的连续子序列个数. Sample Input 7 45 7 2 4 3 1 6 Sample Output 4 HINT 第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}N<=100000 思路:记录中间那个数左边右