Advertisement
Guest User

TCO 2012 Round 2C 550

a guest
May 11th, 2013
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <sstream>
  5. #include <cmath>
  6. #include <map>
  7. #include <set>
  8. #include <ctime>
  9. #include <algorithm>
  10. #include <memory.h>
  11.  
  12. using namespace std;
  13.  
  14. #define FOR(i,k,n) for(int i=(k); i<=(n); i++)
  15. #define DFOR(i,k,n) for(int i=(k); i>=(n); i--)
  16. #define SZ(a) (int)((a).size())
  17. #define FA(i,v) FOR(i,0,SZ(v)-1)
  18. #define RFA(i,v) DFOR(i,SZ(v)-1,0)
  19. #define CLR(a) memset(a, 0, sizeof(a))
  20. #define PB push_back
  21. #define MP make_pair
  22. #define LL long long
  23. #define o_O 1000000000
  24.  
  25. int tt[210][210];
  26. int dp[4][210][210];
  27. int sum[4][210][210];
  28. int dx[] = { -1, -1, 1, 1 };
  29. int dy[] = { -1, 1, -1, 1 };
  30.  
  31. void calc( int a, int b, int i )
  32. {
  33.     if (dp[i][a+dx[i]][b]==-1 || dp[i][a][b+dy[i]]==-1) dp[i][a][b] = -1;
  34.     else if (tt[a][b]>0)
  35.     {
  36.         if (tt[a][b] <= dp[i][a+dx[i]][b] || tt[a][b] <= dp[i][a][b+dy[i]]) dp[i][a][b] = -1;
  37.         else dp[i][a][b] = tt[a][b];
  38.     }
  39.     else dp[i][a][b] = max( dp[i][a+dx[i]][b], dp[i][a][b+dy[i]] ) + 1;
  40.    
  41.     if (dp[i][a][b]==-1) sum[i][a][b] = -1;
  42.     else sum[i][a][b] = sum[i][a+dx[i]][b] + sum[i][a][b+dy[i]] - sum[i][a+dx[i]][b+dy[i]] + dp[i][a][b];
  43. }
  44.  
  45. struct TheMountain
  46. {
  47.     int minSum(int n, int m, vector <int> X, vector <int> Y, vector <int> val)
  48.     {
  49.         FA(a,X) tt[X[a]+1][Y[a]+1] = val[a];
  50.        
  51.         FOR(a,1,n) FOR(b,1,m) calc( a, b, 0 );
  52.         FOR(a,1,n) DFOR(b,m,1) calc( a, b, 1 );
  53.         DFOR(a,n,1) FOR(b,1,m) calc( a, b, 2 );
  54.         DFOR(a,n,1) DFOR(b,m,1) calc( a, b, 3 );
  55.        
  56.         /*FOR(z,0,3)
  57.         {
  58.             FOR(a,1,n)
  59.             {
  60.                 FOR(b,1,m) cerr << dp[z][a][b] << " ";
  61.                 cerr << "\n";
  62.             }
  63.             cerr << "\n";
  64.         }*/
  65.        
  66.         int ans = o_O;
  67.        
  68.         FOR(a,1,n) FOR(b,1,m)
  69.         {
  70.             bool flag = true;
  71.             FOR(c,0,3) if (dp[c][a][b]==-1) flag = false;
  72.             if (flag)
  73.             {
  74.                 int tmp = 0;
  75.                 FOR(c,0,3) tmp += sum[c][a+dx[c]][b+dy[c]];
  76.                 FOR(c,1,a-1) tmp += max( dp[0][c][b], dp[1][c][b] );
  77.                 FOR(c,a+1,n) tmp += max( dp[2][c][b], dp[3][c][b] );
  78.                 FOR(c,1,b-1) tmp += max( dp[0][a][c], dp[2][a][c] );
  79.                 FOR(c,b+1,m) tmp += max( dp[1][a][c], dp[3][a][c] );
  80.                 tmp += max( max(dp[0][a][b], dp[1][a][b]), max(dp[2][a][b], dp[3][a][b]) );
  81.                 ans = min( ans, tmp );
  82.             }
  83.         }
  84.        
  85.         if (ans==o_O) return -1;
  86.         return ans;
  87.     }
  88. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement