Submission #1192126

#TimeUsernameProblemLanguageResultExecution timeMemory
1192126NotLinuxMosaic (IOI24_mosaic)C++20
100 / 100
135 ms42740 KiB
#include "mosaic.h" #include <bits/stdc++.h> using namespace std; #define sz(x) (int)x.size() #define all(x) x.begin() , x.end() vector<long long> mosaic(vector<int> X, vector<int> Y,vector<int> T, vector<int> B,vector<int> L, vector<int> R) { int n = sz(X); if(n == 1){ int k = sz(T); vector<long long>cevap(k); for(int i = 0;i<k;i++){ cevap[i] = X[0]; } return cevap; } else if(n == 2){ int k = sz(T); vector<long long>cevap(k); int grid[2][2]; grid[0][0] = X[0]; grid[0][1] = X[1]; grid[1][0] = Y[1]; grid[1][1] = !grid[0][1] and !grid[1][0]; // cout << grid[0][0] << " " << grid[0][1] << endl; // cout << grid[1][0] << " " << grid[1][1] << endl; for(int i = 0;i<k;i++){ for(int j = T[i];j<=B[i];j++){ for(int j2 = L[i];j2<=R[i];j2++){ cevap[i] += grid[j][j2]; } } } return cevap; } vector<vector<int>>grid(n); grid[0] = vector<int>(n); grid[1] = vector<int>(n); grid[2] = vector<int>(n); for(int i = 3;i<n;i++){ grid[i] = vector<int>(3); } for(int i = 0;i<n;i++){ grid[0][i] = X[i]; grid[i][0] = Y[i]; } // cout << "flag0" << endl; // ilk iki satiri simule et ve prefix sum yap vector<int> presat(n); presat[0] = Y[2]; for(int i = 1;i<n;i++){ grid[1][i] = !grid[1][i-1] and !grid[0][i]; grid[2][i] = !grid[2][i-1] and !grid[1][i]; presat[i] = grid[2][i] + presat[i-1]; } vector<long long>presat2(n);// n n-1 n-2 ile carpilmis presum presat2[0] = grid[2][0] * n; for(int i = 1;i<n;i++){ presat2[i] = presat2[i-1] + grid[2][i] * (n - i); } // cout << "flag1" << endl; // ilk iki sutunu simule et ve prefix sum yap vector<int> presut(n); presut[0] = X[2]; for(int i = 1;i<n;i++){ grid[i][1] = !grid[i-1][1] and !grid[i][0]; grid[i][2] = !grid[i-1][2] and !grid[i][1]; presut[i] = grid[i][2] + presut[i-1]; } vector<long long>presut2(n);// n n-1 n-2 ile carpilmis presum presut2[0] = grid[0][2] * n; for(int i = 1;i<n;i++){ presut2[i] = presut2[i-1] + grid[i][2] * (n - i); } // gridi pref sumla vector<vector<int>>gridsum = grid; for(int i = 0;i<n;i++){ for(int j = 0;j<sz(grid[i]);j++){ if(i)gridsum[i][j] += gridsum[i-1][j]; if(j)gridsum[i][j] += gridsum[i][j-1]; if(i and j)gridsum[i][j] -= gridsum[i-1][j-1]; } } auto getsum = [&](int x , int y){ if(x < 0 or y < 0)return 0ll; // cout << "getsum : " << x << " " << y << endl; long long ret = 0; // ilk sutun ve satir ret += gridsum[min(x,1)][y]; ret += gridsum[x][min(y,1)]; ret -= gridsum[min(x,1)][min(y,1)]; // cout << "ret1 : " << ret << endl; if(x > 1 and y > 1){ // satir { int diff = max(0 , y - x); long long term1 = presat2[y] - presat2[diff+1]; long long term2 = (long long)(presat[y] - presat[diff+1]) * (long long)(n - y - 1); ret += term1 - term2; // cout << "term1 - term2 : " << term1 - term2 << endl; long long term3 = (long long)(presat[diff+1] - presat[1]) * (long long)(min(x,y) - 1); ret += term3; // cout << "term3 : " << term3 << endl; // cout << "ret2 : " << ret << endl; } // sutun { int diff = max(0 , x - y); long long term1 = presut2[x] - presut2[diff+1]; long long term2 = (long long)(presut[x] - presut[diff+1]) * (long long)(n - x - 1); ret += term1 - term2; long long term3 = (long long)(presut[diff+1] - presut[1]) * (long long)(min(x,y) - 1); ret += term3; // cout << "ret3 : " << ret << endl; } ret -= (long long)grid[2][2] * (long long)(min(x,y) - 1); } // cout << "ret : " << ret << endl; return ret; }; auto getrect = [&](int lx , int rx , int ly , int ry){ return getsum(rx,ry) - getsum(lx-1,ry) - getsum(rx,ly-1) + getsum(lx-1,ly-1); }; int k = sz(T); vector<long long>cevap(k); for(int i = 0;i<k;i++){ cevap[i] = getrect(T[i] , B[i] , L[i] , R[i]); } return cevap; }
#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...