hdu--4022--multimap<别人用快排+二分,没学好>

本来 我是想直接开2个计数数组 存下 行 列各自的元素个数的..

可是 数据达到了 10^9 但是数据个数 只有10^5 虽然可以考虑用 离散化...但我想先map试下 毕竟 离散化烦~

关于multimap的使用 和map还是有点差别的..但是 我们单纯地只是使用 stl中的函数的话 还是不存在什么难度吧 

听说 <<STL源码剖析>>不错...可是 不太适合初学者~ =_=   大师 经典..

我这题的wa错误 太难找了 厌死....

我因为一开始想使用数组的原因  多此一举地 将 c d中的d取 绝对值了 ..我也是醉了

还有一个错误...就是 待会在代码注释你们将会看到的

在输出 col[x] 与 row[x]后   将它们重置为0了  这是 致命的错误 =_= 因为我的If判断条件是 >=0 那么如果下次 又询问到它的时候 会导致重复计算该行 或 列上的点..

就会导致后续的错误.

 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4 
 5 multimap<int,int>rowMp;
 6 multimap<int,int>colMp;
 7 map<int,int>row;
 8 map<int,int>col;
 9 
10 int main()
11 {
12     int n , m , op , x , y;
13     while( ~scanf("%d%d",&n,&m) )
14     {
15         if(!n&&!m)
16             break;
17         row.clear();
18         rowMp.clear();
19         col.clear();
20         colMp.clear();
21         while( n-- )
22         {
23             scanf("%d%d",&x,&y);
24             col[x] ++;
25             row[y] ++;
26             colMp.insert( pair<int,int>(x,y) );
27             rowMp.insert( pair<int,int>(y,x) );
28         }
29         multimap<int,int>::iterator rowIt;
30         multimap<int,int>::iterator colIt;
31         while( m-- )
32         {
33             scanf("%d%d",&op,&x);
34             if( op )//y = d  清空行 
35             {
36                 if( row[x]>=0 )
37                 {
38                     printf("%d
",row[x]);
39                     //row[x] = 0;
40                     row[x] = -1;
41                     rowIt = rowMp.find( x );
42                     int num = rowMp.count( x );
43                     while(num--)
44                     {
45                         col[rowIt->second] --;
46                         rowIt ++;
47                     }
48                 }
49                 else
50                 {
51                     printf("0
");
52                 }
53             }
54             else //x = d清空 列 
55             {
56                 if( col[x]>=0 )
57                 {
58                     printf( "%d
",col[x] );
59                     //col[x] = 0;
60                     col[x] = -1;
61                     colIt = colMp.find( x );
62                     int num = colMp.count( x );
63                     while( num-- )
64                     {
65                         row[colIt->second] --;    
66                         colIt ++;            
67                     }
68                 }
69                 else
70                 {
71                     printf("0
");
72                 }
73             }
74         }
75         printf("
");
76     }
77     return 0;
78 }
View Code


我再去学习 人家用 快排+二分的做法.

today:

  我是个 得意忘形 的人

  

just follow your heart
原文地址:https://www.cnblogs.com/radical/p/4077961.html