Submission #1213434

#TimeUsernameProblemLanguageResultExecution timeMemory
1213434Ak_16Mosaic (IOI24_mosaic)C++20
100 / 100
97 ms29252 KiB
#include <iostream>
#include <vector>
#include "mosaic.h"
#define ll long long
using namespace std;

int r1[200005];
int r2[200005];
int c1[200005];
int c2[200005];
ll r1psum[400005];
ll r2psum[400005];
ll c1psum[400005];
ll c2psum[400005];
ll psum[400005];
ll spsum[400005];
int fin[400005];
int n;

ll getsm(int to, int bo, int le, int ri){
  to++;
  bo++;
  le++;
  ri++;
  ll sm = 0LL;
  
  if(to==1){
    sm += r1psum[ri] - r1psum[le-1];
    to++;
    if(bo==1){return sm;}
  }
  
  if(to==2){
    sm += r2psum[ri] - r2psum[le-1];
    to++;
    if(bo==2){return sm;}
  }
  
  if(le==1){
    sm += c1psum[bo] - c1psum[to-1];
    le++;
    if(ri==1){return sm;}
  }
  
  if(le==2){
    sm += c2psum[bo] - c2psum[to-1];
    le++;
    if(ri==2){return sm;}
  }
  
  int n1 = min(ri-le+1, bo-to+1);
  int n2 = max(ri-le+1, bo-to+1);
  
  int st = n + to - ri;
  int en = n + bo - le;
  
  sm += spsum[st+n1-2] - spsum[st-1];
  sm -= (psum[st+n1-2] - psum[st-1]) * 1LL * (st-1);
  
  sm -= (spsum[en] - spsum[en+1-n1]);
  sm += (psum[en] - psum[en+1-n1]) * 1LL * (en+1);
  
  sm += (psum[en+1-n1] - psum[st+n1-2]) * 1LL * n1;
  
  return sm;
  
  
}

vector<ll> mosaic(vector<int> x, vector<int> y, vector<int> t, vector<int> b, vector<int> l, vector<int> r){
  
  n = x.size();
  
  for(int i=0; i<n; i++){
    r1[i+1] = x[i];
  }
  
  for(int i=0; i<n; i++){
    c1[i+1] = y[i];
  }
  
  r1psum[0] = 0LL;
  for(int i=1; i<=n; i++){
    r1psum[i] = r1psum[i-1] + r1[i] * 1LL;
  }
  
  c1psum[0] = 0LL;
  for(int i=1; i<=n; i++){
    c1psum[i] = c1psum[i-1] + c1[i] * 1LL;
  }
  
  if(n>1){
    r2[1] = c1[2];
    c2[1] = r1[2];
  }
  
  for(int i=2; i<=n; i++){
    r2[i] = (1-r2[i-1]) * (1-r1[i]);
    c2[i] = (1-c2[i-1]) * (1-c1[i]);
  }
  
  if(n>=2){
    r2psum[0] = 0LL;
  for(int i=1; i<=n; i++){
    r2psum[i] = r2psum[i-1] + r2[i] * 1LL;
  }
  
  c2psum[0] = 0LL;
  for(int i=1; i<=n; i++){
    c2psum[i] = c2psum[i-1] + c2[i] * 1LL;
  }
    
  }
  
  if(n>=3){
    fin[n] = (1-r2[3]) * (1-c2[3]);
    
    for(int i=n-1; i>=3; i--){
      fin[i] = (1-fin[i+1]) * (1-r2[n+3-i]);
    }
    
    for(int i=n+1; i<=2*n-3; i++){
      fin[i] = (1-fin[i-1]) * (1-c2[i+3-n]);
    }
    
    psum[2] = 0LL;
    for(int i=3; i<=2*n-3; i++){
      psum[i] = psum[i-1] + fin[i] * 1LL;
    }
    spsum[2] = 0LL;
    for(int i=3; i<=2*n-3; i++){
      spsum[i] = spsum[i-1] + fin[i] * 1LL * i;
    }
    
  }
  
  vector<ll> vec;
  int q = t.size();
  
  for(int i=0; i<q; i++){
    vec.push_back(getsm(t[i], b[i], l[i], r[i]));
  }
  
  
  return vec;
}
#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...