제출 #679170

#제출 시각아이디문제언어결과실행 시간메모리
679170cadmiumskyRectangles (IOI19_rect)C++14
0 / 100
1 ms596 KiB
#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()

using namespace std;
using ll = long long;

#define sz(x) (int)(x).size()

using pii = pair<int,int>;
using tii = tuple<int,int,int>;

#warning Schimba
const int nmax = 5 + 5, inf = 1e9 + 5;

int n, m;

int dirx[4] = {1, -1, 0, 0};
int diry[4] = {0, 0, 1, -1};
vector<vector<int>> mat, tmp;
vector<int> lst;
vector<bitset<nmax>> blst;
bitset<nmax> online[nmax][nmax];

void addline(int line) {
  
  for(int i = 1; i <= m; i++)
    lst[i] = max(lst[i], mat[line][i]),
    blst[i] = blst[i] & online[line][i];
}


long long count_rectangles(std::vector<std::vector<int> > initmat) {

 
  n = initmat.size();
  m = initmat[0].size();
  
  mat.resize(n + 2, vector<int>(m + 2, inf));
  
  for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= m; j++) {
      mat[i][j] = initmat[i - 1][j - 1];
    }
  }
  
  for(int i = 2; i < n; i++) {
    vector<int> st;
    for(int j = 1; j <= m; j++) {
      online[i][j + 1] = online[i][j];
      while(!st.empty() && mat[i][st.back()] <= mat[i][j])
	online[i][j + 1][st.back()] = 0,
	st.pop_back();
      online[i][j + 1][j] = 1;
      online[i][j][j - 1] = 0;
      //for(auto x : st)
	//cerr << x << ' ';
      cerr << online[i][j];
      cerr << "  ";
      st.push_back(j);
    }
    cerr << '\n';
  }
  
  ll total = 0;
  
  for(int i1 = 1; i1 <= n; i1++) {
    lst.clear();
    blst.clear();
    lst.resize(m + 2, 0);
    blst.resize(m + 2, 0);
    for(auto &x : blst)
      x.set();
    addline(1 + 1);
    for(int i2 = i1 + 2; i2 <= n; i2++) {
      int lastbad = 1;
      for(int j = 2; j <= m; j++) {
	//cerr << lastbad << ' ' << i1 << ' ' << i2 << '\t' << blst[j] << ' ' << (blst[j] >> lastbad).count() << '\n';
	total += (blst[j] >> lastbad).count();
	if(lst[j] >= mat[i1][j] || lst[j] >= mat[i2][j])
	  lastbad = j;
      }
      addline(i2);
    }
  }
  
  //for(auto v : mat) {
    //for(auto x : v)
      //cerr << x << ' ';
    //cerr << '\n';
  //}
  //ll total = 0;
  
  //for(int u = 0; u < 1; u++) { // a se schimba la <= maxv
    //total += countforlim(u);
  //}
  return total;
}

컴파일 시 표준 에러 (stderr) 메시지

rect.cpp:12:2: warning: #warning Schimba [-Wcpp]
   12 | #warning Schimba
      |  ^~~~~~~
#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...