题解

49 条题解

  • -1
    @ 2009-06-05 21:50:34

    是啊...

    O(n)的就可以了.

  • -1
    @ 2009-06-05 21:48:56

    楼下繁了

    1KB的程序

    >K就转成1

    <K就转成-1

    计和

    枚举起点扫描一遍就行了

    O(N)

  • -1
    @ 2009-06-05 22:02:53

    AC过的题,现在在外地,没程序,等回来再传吧……

    提示一下:先列出一个满足要求的子序列所需满足的不等式,再用线段树统计个数

    p.s. 原来我做的那题没说是一个排列……不过楼下的方法还是很巧妙(奇偶要分开讨论吧?)

  • -2
    @ 2017-07-17 11:05:48

    假的hash表hhh其实就是桶???表示不会hash,反正勉强做到o(n),但为啥还是好慢2333

    #include<iostream>
    #include<set>
    using namespace std;
    set<int>hashName;
    int data[100000];
    int hashTableR[200000];
    int hashTableL[200000];
    int main(void){
        int n,b,temp,pos;
        cin>>n>>b;
        for(int i=0;i<n;i++){
            cin>>temp;
            if(temp<b){
                data[i]=-1;
            }
            else if(temp>b){
                data[i]=1;
            }
            else{
                data[i]=0;
                pos=i;
            }
        }
        int Count=0;
        for(int i=1;i<=pos;i++){
            Count+=data[pos-i];
            hashTableL[Count+100000]++;
            hashName.insert(Count+100000);
        }
        Count=0;
        for(int i=1;i<n-pos;i++){
            Count+=data[pos+i];
            hashTableR[Count+100000]++;
        }
        int sum=0;
        for(const auto i:hashName){
            sum+=hashTableL[i]*hashTableR[200000-i];
        }
        sum+=hashTableL[100000]+hashTableR[100000];
        cout<<sum+1<<endl;
    } 
    
  • -2
    @ 2012-07-16 21:23:08

    顾名思义,就是要b的数的个数 

    b序列中的位置为p

    如果a[i]>b 就定义 a[i]=1

    如果a[i]

  • -2
    @ 2009-11-09 14:07:37

    啥叫水啊

    • @ 2015-04-03 12:54:45

      就是简单的意思

  • -2
    @ 2009-11-05 20:04:22

    虽然想到了怎么做,但是还是觉得是道好题

  • -2
    @ 2009-11-02 22:00:43

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var i,n,b,xx,yy,j,x,w:longint;

    a:array[0..100003]of longint;

    f1,f2:array[-100002..100002]of longint;

    begin

    readln(n,b);

    for i:=1 to n do read(a[i]);

    for i:=1 to n do

    if a[i]=b then

    begin

    x:=0;

    xx:=0;

    yy:=0;

    for j:=i-1 downto 1 do

    begin

    if a[j]

  • -2
    @ 2009-06-11 21:12:28

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    一遍AC,庆祝一下。

    这道题如果有思路了,就是个水题了,思路呢,不是很难。

    读入时预处理一下,比b大的记为1,比b小的记为-1,这样能简化统计。p是b位置,即a[p]:=b;

    数组s记录的是从p向两边倒i处的和

    for i:=p-1 downto 1 do

    s[i]:=s+a[i];

    for i:=p+1 to n do

    s[i]:=s+a[i];

    这样就剩下最后一步了,求出s数组中p左右两边和为0的个数,这个就不说了,大家都有自己的做法,但一定要是O(n)的复杂度。这样全题的复杂度是O(n)仔细点就是

    O(3n)

信息

ID
1549
难度
5
分类
模拟 | 数据结构 | Hashing 点击显示
标签
递交数
1611
已通过
520
通过率
32%
被复制
4
上传者