제출 #1290724

#제출 시각아이디문제언어결과실행 시간메모리
1290724enzyRectangles (IOI19_rect)C++20
컴파일 에러
0 ms0 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#include "rect.h"
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=702;
const int maxk=11;
set<int>col[maxn], lin[maxn];
int v[maxn][maxn], val[maxn][maxn], sp[maxn][maxn], ma_lin_dir[maxn][maxn][maxk], ma_lin_esq[maxn][maxn][maxk], ma_col_dir[maxn][maxn][maxk], ma_col_esq[maxn][maxn][maxk];
ll count_rectangles(vector<vector<int> > a){
	int n=a.size(), m=a[0].size();
	vector<pair<int,pair<int,int>>>process;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			val[i+1][j+1]=a[i][j];
			col[j+1].insert(i+1);
			lin[i+1].insert(j+1);
			col[j+1].insert(0); col[j+1].insert(maxn);
			lin[i+1].insert(0); lin[i+1].insert(maxn);
			process.push_back({a[i][j],{i+1,j+1}});
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ma_lin_dir[i][j][0]=val[i][j+1];
			ma_lin_esq[i][j][0]=val[i][j-1];
			ma_col_dir[j][i][0]=val[i+1][j];
			ma_col_esq[j][i][0]=val[i-1][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int k=1;k<maxk;k++){
			for(int j=1;j<=m;j++){
				int l=max(1,j-(1<<(k-1))), r=min(m,j+(1<<(k-1)));
				ma_lin_dir[i][j][k]=max(ma_lin_dir[i][j][k-1],ma_lin_dir[i][r][k-1]);
				ma_lin_esq[i][j][k]=max(ma_lin_esq[i][j][k-1],ma_lin_esq[i][l][k-1]);
			}
		}
	}
	for(int j=1;j<=m;j++){
		for(int k=1;k<maxk;k++){
			for(int i=1;i<=n;i++){
				int l=max(1,i-(1<<(k-1))), r=min(n,i+(1<<(k-1)));
				ma_col_dir[j][i][k]=max(ma_col_dir[j][i][k-1],ma_col_dir[j][r][k-1]);
				ma_col_esq[j][i][k]=max(ma_col_esq[j][i][k-1],ma_col_esq[j][l][k-1]);
			}
		}
	}
	sort(process.begin(),process.end()); reverse(process.begin(),process.end());
	ll resp=0;
	while(process.size()){
		unordered_set<ll>ans;
		int at=process.back().first;
		vector<pair<int,int>>aux;
		vector<int>att;
		while(process.size()&&process.back().first==at){
			pair<int,int>p=process.back().second;
			aux.push_back(p);
			v[p.first][p.second]++;
			att.push_back(p.first);
			lin[p.first].erase(p.second); col[p.second].erase(p.first);
			process.pop_back();
		}
		for(int x : att)
			for(int i=1;i<=m;i++) sp[x][i]=sp[x][i-1]+v[x][i];
		for(pair<int,int> p : aux){
			int x=p.first, y=p.second;
			ll l1, l2, c1, c2;
			auto f=lin[x].upper_bound(y), g=col[y].upper_bound(x);
			l2=*g; c2=*f;
		 	f--; g--;
			l1=*g; c1=*f;
			if(l1==0||c1==0||l2==maxn||c2==maxn) continue;
			l1++; c1++; l2--; c2--;
			bool ok=true;
			int qtd=c2-c1+1, alt=l2-l1+1;
			int k1=0, k2=0;
			while((1<<k1)<=qtd) k1++;
			while((1<<k2)<=alt) k2++;
			k1--; k2--;
			for(int i=l1;i<=l2;i++){
				if(sp[i][c2]-sp[i][c1-1]!=qtd) ok=false;
				int at=max(ma_lin_dir[i][c1-1][k1],ma_lin_esq[i][c2+1][k1]);
				if(at>=min(val[i][c1-1],val[i][c2+1])) ok=false;
			}
			for(int i=c1;i<=c2;i++){
				int at=max(ma_col_dir[i][l1-1][k2],ma_col_esq[i][l2+1][k2]);
				if(at>=min(val[l1-1][i],val[l2+1][i])) ok=false;
			}
			if(ok) ans.insert(l1+maxn*c1+maxn*maxn*l2+maxn*maxn*maxn*c2);
		}
		resp+=ans.size();
	}
	return resp;
}

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

In file included from /usr/include/c++/13/vector:63,
                 from rect.h:5,
                 from rect.cpp:3:
/usr/include/c++/13/bits/allocator.h: In destructor 'constexpr std::_Rb_tree<int, int, std::_Identity<int>, std::less<int>, std::allocator<int> >::_Rb_tree_impl<std::less<int>, true>::~_Rb_tree_impl()':
/usr/include/c++/13/bits/allocator.h:184:7: error: inlining failed in call to 'always_inline' 'constexpr std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = std::_Rb_tree_node<int>]': target specific option mismatch
  184 |       ~allocator() _GLIBCXX_NOTHROW { }
      |       ^
In file included from /usr/include/c++/13/map:62,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:152,
                 from rect.cpp:4:
/usr/include/c++/13/bits/stl_tree.h:662:16: note: called from here
  662 |         struct _Rb_tree_impl
      |                ^~~~~~~~~~~~~