zoukankan      html  css  js  c++  java
  • 【BZOJ1303】[CQOI2009]中位数图(模拟)

    【BZOJ1303】[CQOI2009]中位数图(模拟)

    题面

    BZOJ
    洛谷

    题解

    把大于(b)的数设为(1),小于(b)的数设为(-1)。显然询问就是有多少个横跨了(b)这个数所在的位置的区间的和恰好为(0)。那么拿个数组记一下左边,右边直接算就好了。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define ll long long
    #define MAX 100100
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int n,b,pos,a[MAX];ll ans;
    int s[MAX<<1];
    int main()
    {
    	n=read();b=read();
    	for(int i=1;i<=n;++i)a[i]=read();
    	for(int i=1;i<=n;++i)
    		if(a[i]<b)a[i]=-1;
    		else if(a[i]>b)a[i]=1;
    		else a[i]=0,pos=i;
    	for(int i=pos,sum=0;i;--i)
    		sum+=a[i],s[sum+MAX]+=1;
    	for(int i=pos,sum=0;i<=n;++i)
    		sum+=a[i],ans+=s[MAX-sum];
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    蓝桥杯 大数定理
    蓝桥杯 密码发生器
    简单定时器的使用
    Eclipse中更改Project Explorer的字体
    列的别名修改
    ||拼接字符串
    SQL知识总结
    java 打开记事本
    报表使用分组
    js处理异步问题
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9751694.html
Copyright © 2011-2022 走看看