首页 > 代码库 > hdu--4022--multimap<别人用快排+二分,没学好>

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\n",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                 else50                 {51                     printf("0\n");52                 }53             }54             else //x = d清空 列 55             {56                 if( col[x]>=0 )57                 {58                     printf( "%d\n",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                 else70                 {71                     printf("0\n");72                 }73             }74         }75         printf("\n");76     }77     return 0;78 }
View Code


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

 

today:

  我是个 得意忘形 的人

  

 

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