Submission #1025456

# Submission time Handle Problem Language Result Execution time Memory
1025456 2024-07-17T03:50:37 Z bachhoangxuan Hexagonal Territory (APIO21_hexagon) C++17
Compilation error
0 ms 0 KB
#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()(const int &i,const 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

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&>,
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~