Submission #1238641

#TimeUsernameProblemLanguageResultExecution timeMemory
1238641matisitoMosaic (IOI24_mosaic)C++20
0 / 100
162 ms43132 KiB
#include "mosaic.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <numeric>
#include <vector>
#include <bitset>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <cassert>

using namespace std;
#define dbg(x) cerr<<#x<<": "<<x<<"\n";

/*  
ValeNotta lover
*/

vector<long long> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R) {
  int n=(int)X.size();
  vector<vector<long long>>dp(n+1);
  for(int i=0 ; i<=n ; i++) dp[0].push_back(0);
  for(int i=1 ; i<=n ; i++){
    dp[i].push_back(0);
    for(int j=1 ; j<=n ; j++){
      if(i==1) dp[i].push_back(X[j-1]);
      else if(j==1) dp[i].push_back(Y[i-1]);
      else{
        if(i>=4 && j>=4) break;
        if(dp[i-1][j]==0 && dp[i][j-1]==0) dp[i].push_back(1);
        else dp[i].push_back(0);
      }
      // dbg(dp[i].back())
    }
  }
  set<int>cast;
  for(int i=1 ; i<=n ; i++){
    for(int j=1 ; j<=n ; j++){
      if(i>=4 && j>=4) break;
      if(i==3 || j==3){
        if(dp[i][j]==1) cast.insert(i-j);
      }
      // cout<<dp[i][j]<<" ";
      dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
    }
    // cout<<"\n";
  }
  // cout<<"\n\n";
  vector<long long>pref;
  pref.push_back(0);
  for(int i=1-n ; i<=n-1 ; i++){
    if(cast.find(i)!=cast.end()) pref.push_back(pref.back()+1);
    else pref.push_back(pref.back());
  }
  int N=(int)T.size();
  vector<long long>ans(n, 0);
  for(int i=0 ; i<N ; i++){
    T[i]++; B[i]++; L[i]++; R[i]++;
    if(R[i]<=3 || B[i]<=3){
      ans[i]=dp[B[i]][R[i]]-dp[T[i]-1][R[i]]-dp[B[i]][L[i]-1]+dp[T[i]-1][L[i]-1];
    }else{
      if(L[i]<=3){
        ans[i]=dp[B[i]][3]-dp[T[i]-1][3]-dp[B[i]][L[i]-1]+dp[T[i]-1][L[i]-1];
        L[i]=4;
      }
      int r=T[i]-L[i], l=T[i]-R[i];
      ans[i]+=pref[r]-pref[l+n-1];
    }
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...