Submission #794261

#TimeUsernameProblemLanguageResultExecution timeMemory
794261I_Love_EliskaM_삶의 질 (IOI10_quality)C++14
80 / 100
2925 ms262144 KiB
#include "quality.h"
#include <bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0;i<n;++i)
#define pb push_back
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define f first 
#define s second

struct query {
   int i,j,l,r;
   query(int i, int j, int l, int r) {
      this->i=i,this->j=j,this->l=l,this->r=r;
   }
};
struct query2 {
   int x,y,i;
};

set<int> f,s;

struct BIT {

   vector<vector<int>> t;
   int n,m;
   BIT(int n, int m) {
      this->n=n, this->m=m;
      t.assign(n,vector<int>(m,0));
   }
   void add(int i, int j, int x) {
      for(;i<n;i=i|(i+1)) {
         for(int j2=j;j2<m;j2=j2|(j2+1)) t[i][j2]+=x;
      }
   }

   int sum(int a, int b) {
      int q=0;
      for(;a>=0;a=(a&(a+1))-1) {
         for(int r=b;r>=0;r=(r&(r+1))-1) {
            q+=t[a][r];
         }
      }
      return q;
   }
   int sum(int a, int b, int c, int d) {
      return sum(c,d) - sum(a-1,d) - sum(c,b-1) + sum(a-1,b-1);
   }

};

int rectangle(int n, int m, int x, int y, int a[][3001]) {
   int d=x*y/2;
      
   vector<pi> pos(n*m+1);
   forn(i,n) forn(j,m) pos[a[i][j]]={i,j};

   vector<query> q;
   for(int i=0; i+x<=n; ++i) {
      for (int j=0; j+y<=m; ++j) {
         q.pb({i,j,1,n*m});
      }
   }

   vector<vector<query2>> s(n*m+1);
   vector<int> sz(n*m+1,0);
   BIT ft(n,m);
   forn(it,24) {

      forn(i,q.size()) {
         int mid=(q[i].l+q[i].r)>>1;
         if (s[mid].size()>sz[mid]) {
            s[mid][sz[mid]]={q[i].i,q[i].j,i};
         } else {
            s[mid].pb({q[i].i,q[i].j,i});
         }
         sz[mid]++;
      }

      for (int i=1; i<=n*m; ++i) {
         ft.add(pos[i].f,pos[i].s,1);
         for(int t=0;t<sz[i];++t) {
            auto k=s[i][t];
            int z=ft.sum(k.x,k.y,k.x+x-1,k.y+y-1);
            if (z>=d+1) q[k.i].r=i;
            else q[k.i].l=i+1; 
         }
         sz[i]=0;
      }
      for (int i=1; i<=n*m; ++i) {
         ft.add(pos[i].f,pos[i].s,-1);
      }

   }

   int ans=n*m;
   forn(i,q.size()) ans=min(ans,q[i].r);
   return ans;

}

Compilation message (stderr)

quality.cpp: In function 'int rectangle(int, int, int, int, int (*)[3001])':
quality.cpp:4:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for(int i=0;i<n;++i)
......
   70 |       forn(i,q.size()) {
      |            ~~~~~~~~~~           
quality.cpp:70:7: note: in expansion of macro 'forn'
   70 |       forn(i,q.size()) {
      |       ^~~~
quality.cpp:72:27: warning: comparison of integer expressions of different signedness: 'std::vector<query2>::size_type' {aka 'long unsigned int'} and '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} [-Wsign-compare]
   72 |          if (s[mid].size()>sz[mid]) {
quality.cpp:4:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for(int i=0;i<n;++i)
......
   97 |    forn(i,q.size()) ans=min(ans,q[i].r);
      |         ~~~~~~~~~~              
quality.cpp:97:4: note: in expansion of macro 'forn'
   97 |    forn(i,q.size()) ans=min(ans,q[i].r);
      |    ^~~~
#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...