【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\n");
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\n");
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\n");
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\n");
65                     return 0;
66                 }
67                 pos.first++;
68             }
69         }
70     }
71     printf("NO\n");
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 << "\n";
        position.first++;
    }
    cout << endl;

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

posted @ 2017-05-18 00:17  shulin15  阅读(239)  评论(0编辑  收藏  举报