题解 | #[CQOI2009]中位数图# 数组的前缀、后缀和

[CQOI2009]中位数图

https://ac.nowcoder.com/acm/problem/19913

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
        int n, b;
        scanf("%d %d", &n, &b);
        int data[100100];//将序列元素和指定中位数对比,分类大于的是1,小于的是-1,等于是0;
        int pos;
        for (int i = 1; i <= n; i++) {
            int x;
            scanf("%d", &x);
            if (x > b) data[i] = 1;
            else if (x < b) data[i] = -1;
            else {
                data[i] = 0;
                pos = i;
            }
//             cout<<data[i]<<" ";
        }
//         cout<<endl;
        // 2 2 2 0 1 1 1
        //-3 -2 -1 0 1 2 3
        int acc = 0;
        int l_sum[100100];//l_sum[i]表示中位数左边第i个位置大于、小于中位数的数字总和;
        int r_sum[100100];//同理这个表示右边
    
        for (int i = pos; i >= 1; i--) {
            static int x=0;
            x += data[i];
            l_sum[i] = x;
            
        }
//         for(int i=1;i<=pos;i++)
//             cout<<l_sum[i]<<" ";
        for (int i = pos+1; i <= n; i++) {
           static int x = 0;
            x += data[i];
            r_sum[i] = x;
//             cout << x << " ";
        }
//         cout << endl;
        for (int i = pos; i <= n; i++) {
            for (int j = 1; j <= pos; j++) {
                if (l_sum[j] + r_sum[i] == 0) {
                //左边大于、小于中位数的的数字总数等于右边大于、大于小于中位数的的数字总和;+为大于中  的数字总和,-为小于中  的数字总和
                    acc++;
//                     cout<<i<<" "<<j<<" "<<endl;    
                }
            }
        }
            cout << acc;
            //1 1 -1 0 -1 -1 1
    
            //  1  0 -1  0 -1 -2 -1
    //               1  1  0  1 self(1);
            
            //  0 -1 1 1 -1
    
            // -1 1 0 1 -1
    
            // 1 -1 1 -1 0
            return 0;
        }

全部评论

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务