流水依依

希望朋友们有个好的身体,开开心心工作与学习。

博客园 首页 新随笔 联系 订阅 管理

Hyperspace

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)

Problem Description
The great Mr.Smith has invented a hyperspace particle generator. The device is very powerful. The device can generate a hyperspace. In the hyperspace, particle may appear and disappear randomly. At the same time a great amount of energy was generated.
However, the device is in test phase, often in a unstable state. Mr.Smith worried that it may cause an explosion while testing it. The energy of the device is related to the maximum manhattan distance among particle.
Particles may appear and disappear any time. Mr.Smith wants to know the maxmium manhattan distance among particles when particle appears or disappears.
 

 

Input
The input contains several test cases, terminated by EOF.
In each case: In the first line, there are two integer q(number of particle appear and disappear event, ≤60000) and k(dimensions of the hyperspace that the hyperspace the device generated, ≤5). Then follows q lines. In each line, the first integer ‘od’ represents the event: od = 0 means this is an appear
event. Then follows k integer(with absolute value less then 4 × 107). od = 1 means this is an disappear event. Follows a integer p represents the disappeared particle appeared in the pth event.
 

 

Output
Each test case should contains q lines. Each line contains a integer represents the maximum manhattan distance among paticles.
 

 

Sample Input
10 2
0 208 403
0 371 -180
1 2
0 1069 -192
0 418 -525
1 5
1 1
0 2754 635
0 -2491 961
0 2954 -2516
 
Sample Output
0
746
0
1456
1456
1456
0
2512
5571
8922

 

Source
 
题意: 
       有N个操作。 2种操作:
             1、 增加一个K维的点
             2 、删除低pth次操作的那个点
       并且每次输出点集的最大曼哈顿距离。
思路:在N维最大曼哈顿距离的基础上改变而来,其实这种每次删除询问基本上就是堆的维护或者其他数据结构,这个题目是同时维护一个大根堆与一个小根堆,删除的点
      的维护只需要加一个小小的标记。 
N维最大曼哈顿距离算法(这是NOI国家集训队的一篇论文)讲解(网上写的有点难懂,我在网加上详细的说明):
   

   求最大曼哈顿距离,对于一个n维的空间,其中两点的曼哈顿距离为:|x1-y1|+|x2-y2|+|x3-y3|+|x4-y4|+……+|xn-yn|     

 (两点的坐标分别为(x1,x2,……,xn)、(y1,y2,……,yn))

   以下以二维平面为例研究:        

   设距离最远的两点为i,j,可知所求的最大距离必定有以下四种形式之一:

    |X1-Y1|+|X2-Y2|+...的最大值必然是±(X1-Y1)±(X2-Y2)±..之一

   假如只有2个点 :坐标为 (x11 ,x12) (x21 ,x22) 

      Answer=Max{

       (x11+x12)-(y21+y22)      , 

       (-x11+x12)-(-y21+y22)     ,

       (x11-x12)-(y21-y22)      ,

       (-x11-x12)-(-y21-y22)      ,

     }

   假如有3个点 : (x11 ,x12) (x21 ,x22)  (x31, x32)

 

  Answer=Max{

       (x11+x12)-(y21+y22)      ,    (x11+x12)-(y31+y32)      , ..........

       (-x11+x12)-(-y21+y22)     ,  (-x11+x12)-(-y31+y32)   ,............

       (x11-x12)-(y21-y22)      ,     (x11-x12)-(y31-y32)  ,...............

       (-x11-x12)-(-y21-y22)      ,  (-x11-x12)-(-y31-y32)  ,...............

     }

由此,可以发现一个规律,即去绝对值之后把同一点的坐标放在一起,对应坐标的符号总是相同的

假如我们用0表示负号,1表示正号,则(-xi+yi)与(xj-yj)两个括号内的符号可以表示为:01和10       

当你多举几个例子之后,就会发现,对于一个确定的维数D,符号转化成的二进制数,它们的和总是一个定值,即2^d-1,        这就说明了,当我们知道了前一个点去绝对值之后的符号,就可以知道第二个点去绝对值后的符号是怎样的

于是只要对所有的点(xi,yi),依次计算出(xi+yi),(xi-yi),(-xi+yi),(-xi-yi)这四种形式,然后把每个点i算出来的这四种情况的最大值分别记录到一个数组max[]中,然后枚举每一种去绝对值的组合,组合后的最大值即为answer

 
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <set>
#include <limits.h>
#include <fstream>
#include <map>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
const int size=60008 ;
struct Me{
   int N ,K ;
   bool used[size] ;
   struct Node{
       int id ;
       int num ;
       Node(){}
       Node(int i ,int n):id(i),num(n){}
       friend bool operator <(const Node A ,const Node B){
          return A.num<B.num ;
       }
   };
   struct Node2{
       int id ;
       int num ;
       Node2(){}
       Node2(int i ,int n):id(i),num(n){}
       friend bool operator <(const Node2 A ,const Node2 B){
          return A.num>B.num ;
       }
   };
   priority_queue<Node>big[1<<5] ;
   priority_queue<Node2>small[1<<5] ;
   Me(){}
   Me(int n, int k):N(n),K(k){}
   int get_max(){
      int ans=0 ,Max_num ,Min_num;
      for(int i=0;i<(1<<K);i++){
         Max_num=Min_num=0 ;
         while(!big[i].empty()){
              Node now=big[i].top() ;
              if(used[now.id]){
                  big[i].pop() ;
                  continue ;
              }
              else{
                Max_num=now.num ;
                break ;
              }
         }
         while(!small[i].empty()){
              Node2 now=small[i].top() ;
              if(used[now.id]){
                  small[i].pop() ;
                  continue ;
              }
              else{
                Min_num=now.num;
                break ;
              }
         }
         ans=Max(ans,Max_num-Min_num) ;
      }
      return ans ;
   }
   void gao_qi(){
       memset(used,0,sizeof(used)) ;
       int kind ,id;
       int x[5] ;
       for(int pth=1;pth<=N;pth++){
          scanf("%d",&kind) ;
          if(kind==1){
              scanf("%d",&id) ;
              used[id]=1 ;
              printf("%d\n",get_max()) ;
          }
          else{
              for(int i=0;i<K;i++)
                 scanf("%d",&x[i]) ;
              int num ,sum;
              for(int i=0;i<(1<<K);i++){
                  num=i ;
                  sum=0 ;
                  for(int j=0;j<K;j++){
                      if(num&1)
                         sum-=x[j] ;
                      else
                         sum+=x[j] ;
                      num>>=1 ;
                  }
                  big[i].push(Node(pth,sum)) ;
                  small[i].push(Node2(pth,sum)) ;
              }
              printf("%d\n",get_max()) ;
          }
       }
   }
};
int main(){
  int n , k ;
  while(scanf("%d%d",&n,&k)!=EOF){
      Me me(n,k) ;
      me.gao_qi() ;
  }
  return 0 ;
}
Requirements
 
Time Limit: 5000MS   Memory Limit: 65536K
     

Description

An undergraduate student, realizing that he needs to do research to improve his chances of being accepted to graduate school, decided that it is now time to do some independent research. Of course, he has decided to do research in the most important domain: the requirements he must fulfill to graduate from his undergraduate university. First, he discovered (to his surprise) that he has to fulfill 5 distinct requirements: the general institute requirement, the writing requirement, the science requirement, the foreign-language requirement, and the field-of-specialization requirement. Formally, a requirement is a fixed number of classes that he has to take during his undergraduate years. Thus, for example, the foreign language requirement specifies that the student has to take 4 classes to fulfill this requirement: French I, French II, French III, and French IV. Having analyzed the immense multitude of the classes that need to be taken to fulfill the different requirements, our student became a little depressed about his undergraduate university: there are so many classes to take…

Dejected, the student began studying the requirements of other universities that he might have chosen after high school. He found that, in fact, other universities had exactly the same 5 requirements as his own university. The only difference was that different universities had different number of classes to be satisfied in each of the five requirement.

Still, it appeared that universities have pretty similar requirements (all of them require a lot of classes), so he hypothesized that no two universities are very dissimilar in their requirements. He defined the dissimilarity of two universities X and Y as |x1 − y1| + |x2 − y2| + |x3 − y3| + |x4 − y4| + |x5 − y5|, where an xi (yi) is the number of classes in the requirement i of university X (Y) multiplied by an appropriate factor that measures hardness of the corresponding requirement at the corresponding university.

Input

The first line of the input file contains an integer N (1 ≤ N ≤ 100 000), the number of considered universities. The following N lines each describe the requirements of a university. A university X is described by the five non-negative real numbers x1 x2 x3 x4 x5.

Output

On a single line, print the dissimilarity value of the two most dissimilar universities. Your answer should be rounded to exactly two decimal places.

Sample Input

3
2 5 6 2 1.5
1.2 3 2 5 4
7 5 3 2 5

Sample Output

12.80
 
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <queue>
#include <set>
#include <limits.h>
#include <fstream>
#include <map>
#include <math.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std ;
const int size=10008 ;
struct Me{
  int N ;
  double Max_ans[1<<5] ;
  double Min_ans[1<<5] ;
  Me(){}
  Me(int n):N(n){}
  double gao_qi(){
      double x[5] ,sum ,ans;
      int num;
      for(int cas=1;cas<=N;cas++){
        for(int i=0;i<5;i++)
            scanf("%lf",&x[i]) ;
        for(int i=0;i<(1<<5);i++){
            num=i ;
            sum=0 ;
            for(int j=0;j<5;j++){
                if(num&1)
                   sum+=x[j] ;
                else
                   sum-=x[j] ;
                num>>=1 ;
            }
            if(cas==1){
                Max_ans[i]=sum ;
                Min_ans[i]=sum ;
            }
            else{
                Max_ans[i]=Max(Max_ans[i],sum) ;
                Min_ans[i]=Min(Min_ans[i],sum) ;
            }
        }
      }
      ans=Max_ans[0]-Min_ans[0] ;
      for(int i=1;i<(1<<5);i++)
         ans=Max(ans,Max_ans[i]-Min_ans[i]) ;
      return ans ;
  }
};
int main(){
   int n ;
   while(cin>>n){
      Me me(n) ;
      printf("%.2lf\n",me.gao_qi()) ;
   }
   return 0 ;
}

 

posted on 2013-08-14 14:10  流水依依  阅读(259)  评论(0编辑  收藏  举报