• 【multimap的应用】D. Array Division


    http://codeforces.com/contest/808/problem/D

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 #include<cmath>
     7 #include<set>
     8 #include<map> 
     9 #include<utility>
    10 using namespace std;
    11 typedef long long ll;
    12 const int maxn=1e5+2;
    13 ll a[maxn];
    14 ll sum[maxn];
    15 multimap<ll,int> m;
    16 multimap<ll,int> ::iterator it;
    17 pair<multimap<ll,int>::iterator,multimap<ll,int>::iterator> pos; 
    18 int main()
    19 {
    20     int n;
    21     scanf("%d",&n);
    22     memset(sum,0,sizeof(sum));
    23     for(int i=1;i<=n;i++)
    24     {
    25         scanf("%lld",&a[i]);
    26         m.insert(make_pair(a[i],i)); 
    27         sum[i]=sum[i-1]+a[i];
    28     }
    29     if(sum[n]%2==1)
    30     {
    31         printf("NO
    ");
    32         return 0;
    33     }
    34     ll half=sum[n]/2;
    35     for(int i=1;i<=n;i++)
    36     {
    37         ll s=sum[i]-half;
    38         if(s==0)
    39         {
    40             printf("YES
    ");
    41             return 0;
    42         }
    43         else if(s>0)
    44         {
    45             pos=m.equal_range(s);
    46             while(pos.first!=pos.second)    
    47             {
    48                 if(pos.first->second<=i)
    49                 {
    50                     printf("YES
    ");
    51                     return 0;
    52                 }
    53                 pos.first++;
    54             }
    55         }
    56         else 
    57         {
    58             s=-s;
    59             pos=m.equal_range(s);
    60             while(pos.first!=pos.second)
    61             {
    62                 if(pos.first->second>i)
    63                 {
    64                     printf("YES
    ");
    65                     return 0;
    66                 }
    67                 pos.first++;
    68             }
    69         }
    70     }
    71     printf("NO
    ");
    72     
    73     return 0;
    74 }
    View Code

    equal_range的用法:

     //定义pair 对象position; pair数据类型是 2个 multimap<string,string>::iterator 指针。
        pair<multimap<string, string>::iterator, multimap<string, string>::iterator> position;
        //如果键存在,函数返回2个指针,第一个指针指向键第一个匹配的元素
        //第二个指针指向键最后一个匹配的元素的下一位置
        position = author.equal_range(search_item);
        while (position.first != position.second)
        {
            cout << position.first->first << "  " << position.first->second << " ";
            position.first++;
        }
        cout << endl;

    map的find函数只能找key,所以需要把a[i]作为key,但同一个数可以出现多次,所以需要用multimap,multimap内容根据key排序后,equal_range函数key出现的区间。

  • 相关阅读:
    一个实现编译次数记录的jsfl
    特殊的RSS图标设置,您可以免费使用
    jquery实现的视差滚动教程(视差大背景效果)
    40个免费的wordpress主题推荐
    php+mysql方便的查询
    jQuery 简单实现select二级联动
    我对Oracle的刷未提交数据到文件的学习体会
    dbms_output.put_line的小例子
    isqlplus 的 define 与 pl/sql 的 &
    PLSQL 的 for循环的小例子
  • 原文地址:https://www.cnblogs.com/itcsl/p/6870278.html
Copyright © 2020-2023  润新知