Submission #1025455

#TimeUsernameProblemLanguageResultExecution timeMemory
1025455bachhoangxuanHexagonal Territory (APIO21_hexagon)C++17
Compilation error
0 ms0 KiB
#include "hexagon.h" #include <bits/stdc++.h> using namespace std; using i32 = int; #define int long long #define pii pair<int,int> #define fi first #define se second const int inf = 1e9; const int mod = 1e9+7; const int maxn = 2e5+5; const int inv2 = (mod+1)/2; const int inv3 = (mod+1)/3; int dx[]={0,0,1,1,0,-1,-1}, dy[]={0,1,1,0,-1,-1,0}; int S[maxn],T[maxn],p[maxn],d[maxn]; int f[maxn],mt[maxn],tp[maxn],lx[maxn],rx[maxn],ly[maxn],ry[maxn],cnt; vector<int> h[maxn],com; vector<pair<int,int>> g[maxn]; int dd[maxn],pos[maxn]; int get(int i,int x){ return p[i]+x*d[i]; } int X,Y; bool cmp(int i,int j){ int yi=get(i,X),yj=get(j,X); return (yi<yj) || (yi==yj && ((tp[i]==-1)==(tp[j]==-1) ? i!=j && (tp[i]==-1)^d[i]:i<j)); } struct cmp_t{ bool operator()(int i,int j){ return cmp(i,j); } }; set<int,cmp_t> ss; void add_edge(int u,int v){ //cout << "edge " << u << ' ' << v << '\n'; g[u].push_back(make_pair(v,X)); g[v].push_back(make_pair(u,X)); } void add(int l,int r){ if(tp[l]==-1 && tp[r]==-1){ auto it=ss.lower_bound(r); if(it==ss.end() || cmp(r,mt[*it])){ tp[l]=0,tp[r]=1; mt[l]=r,mt[r]=l; lx[cnt]=X; ly[cnt]=l; ry[cnt]=r; f[l]=f[r]=cnt++; ss.insert(r); } else{ int rt=*it,lt=mt[rt]; tp[l]=1,tp[r]=0; ss.insert(l); add_edge(f[lt],cnt); add_edge(f[lt],cnt+1); rx[f[lt]]=lx[cnt]=lx[cnt+1]=X; mt[l]=lt,mt[lt]=l; mt[r]=rt,mt[rt]=r; ly[cnt]=lt,ry[cnt]=l; ly[cnt+1]=r,ry[cnt+1]=rt; f[l]=f[lt]=cnt++; f[r]=f[rt]=cnt++; } } else if(tp[l]==0 && tp[r]==1){ ss.erase(r); tp[l]=tp[r]=-1; rx[f[l]]=X; } else if(tp[l]==1 && tp[r]==0){ ss.erase(l); int lt=mt[l],rt=mt[r]; tp[l]=tp[r]=-1; mt[lt]=rt,mt[rt]=lt; add_edge(f[l],cnt); add_edge(f[r],cnt); rx[f[l]]=rx[f[r]]=lx[cnt]=X; ly[cnt]=lt,ry[cnt]=rt; f[lt]=f[rt]=cnt++; } else{ if(tp[r]==-1) swap(l,r); if(tp[r]==1){ ss.erase(r); ss.insert(l); } int rt=mt[r]; swap(tp[l],tp[r]); mt[l]=rt,mt[rt]=l; add_edge(f[r],cnt); rx[f[r]]=lx[cnt]=X; ly[cnt]=l,ry[cnt]=rt; if(tp[l]) swap(ly[cnt],ry[cnt]); f[l]=f[rt]=cnt++; } } int dfs(int u,int par){ int res=0; int len=rx[u]-lx[u]+1,dl=get(ry[u],lx[u])-get(ly[u],lx[u])+1,dr=get(ry[u],rx[u])-get(ly[u],rx[u])+1; if(pos[u]==rx[u]) swap(dl,dr); res=((dl+dr)*len/2)%mod*dd[u]%mod; if(len>1){ int k=(dr-dl)/(len-1); res=(res+len*(len-1)/2%mod*dl%mod)%mod; res=(res+len*(len-1)/2%mod*(2*len-1)%mod*inv3%mod*(mod+k)%mod)%mod; } //cout << u << ' ' << dd[u] << ' ' << dl << ' ' << dr << ' ' << len << '\n'; //cout << res << '\n'; for(auto [v,x]:g[u]){ if(v==par) continue; pos[v]=x;dd[v]=dd[u]+abs(x-pos[u]); int l=max(get(ly[u],x),get(ly[v],x)); int r=min(get(ry[u],x),get(ry[v],x)); res=(res-(r-l+1)*dd[v]%mod+mod)%mod; //cout << "del " << (r-l+1)*dd[v]%mod << '\n'; res=(res+dfs(v,u))%mod; } return res; } int solve(int N,vector<i32> D,vector<i32> L){ for(int i=0;i<cnt;i++) g[i].clear(); int n=0;cnt=X=Y=0; for(int i=0;i<N;i++){ int nX=X+L[i]*dx[D[i]]; int nY=Y+L[i]*dy[D[i]]; if(X!=nX){ S[n]=min(X,nX); T[n]=max(X,nX); d[n]=(nY-Y)/(nX-X); p[n]=Y-X*d[n]; n++; } X=nX;Y=nY; } com.clear(); for(int i=0;i<n;i++) com.push_back(S[i]),com.push_back(T[i]); sort(com.begin(),com.end()); com.erase(unique(com.begin(),com.end()),com.end()); int sz=(int)com.size(); for(int i=0;i<sz;i++) h[i].clear(); for(int i=0;i<n;i++){ tp[i]=-1; h[lower_bound(com.begin(),com.end(),S[i])-com.begin()].push_back(i); h[lower_bound(com.begin(),com.end(),T[i])-com.begin()].push_back(i); } for(int i=0;i<sz;i++){ X=com[i]; sort(h[i].begin(),h[i].end(),cmp); for(int j=0;j<(int)h[i].size();j+=2) add(h[i][j],h[i][j+1]); } //for(int i=0;i<cnt;i++) cout << lx[i] << ' ' << rx[i] << ' ' << S[ly[i]] << ' ' << T[ly[i]] << ' ' << S[ry[i]] << ' ' << T[ry[i]] << '\n'; int rt=-1; for(int i=0;i<cnt;i++) if(lx[i]<=0 && 0<=rx[i] && p[ly[i]]<=0 && p[ry[i]]>=0){rt=i;break;} dd[rt]=pos[rt]=0; return dfs(rt,-1); } i32 draw_territory(i32 N, i32 A, i32 B, std::vector<i32> D, std::vector<i32> L) { int a=0,b=0;X=Y=0; for(int i=0;i<N;i++){ b+=L[i]; int nX=X+L[i]*dx[D[i]]; int nY=Y+L[i]*dy[D[i]]; a+=X*nY-Y*nX; X=nX;Y=nY; } a=(abs(a)+b)%mod; a=a*inv2%mod; a=(a+1)%mod; B=B*inv2%mod; int T=0; for(int k=0;k<3;k++){ T=(T+solve(N,D,L))%mod; for(int i=0;i<N;i++) D[i]=D[i]%6+1; } //cout << T << '\n'; return (a*A+T*B)%mod; } #undef int

Compilation message (stderr)

In file included from /usr/include/c++/10/map:60,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:81,
                 from hexagon.cpp:2:
/usr/include/c++/10/bits/stl_tree.h: In instantiation of 'static const _Key& std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_S_key(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Link_type) [with _Key = long long int; _Val = long long int; _KeyOfValue = std::_Identity<long long int>; _Compare = cmp_t; _Alloc = std::allocator<long long int>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Link_type = const std::_Rb_tree_node<long long int>*]':
/usr/include/c++/10/bits/stl_tree.h:1935:36:   required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_lower_bound(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Base_ptr, const _Key&) [with _Key = long long int; _Val = long long int; _KeyOfValue = std::_Identity<long long int>; _Compare = cmp_t; _Alloc = std::allocator<long long int>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree<long long int, long long int, std::_Identity<long long int>, cmp_t, std::allocator<long long int> >::iterator; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type = std::_Rb_tree_node<long long int>*; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Base_ptr = std::_Rb_tree_node_base*]'
/usr/include/c++/10/bits/stl_tree.h:1277:30:   required from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = long long int; _Val = long long int; _KeyOfValue = std::_Identity<long long int>; _Compare = cmp_t; _Alloc = std::allocator<long long int>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree<long long int, long long int, std::_Identity<long long int>, cmp_t, std::allocator<long long int> >::iterator; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::key_type = long long int]'
/usr/include/c++/10/bits/stl_set.h:830:32:   required from 'std::set<_Key, _Compare, _Alloc>::iterator std::set<_Key, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = long long int; _Compare = cmp_t; _Alloc = std::allocator<long long int>; std::set<_Key, _Compare, _Alloc>::iterator = std::_Rb_tree<long long int, long long int, std::_Identity<long long int>, cmp_t, std::allocator<long long int> >::const_iterator; std::set<_Key, _Compare, _Alloc>::key_type = long long int]'
hexagon.cpp:45:33:   required from here
/usr/include/c++/10/bits/stl_tree.h:780:8: error: static assertion failed: comparison object must be invocable as const
  780 |        is_invocable_v<const _Compare&, const _Key&, const _Key&>,
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~