답안 #847528

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
847528 2023-09-09T19:27:23 Z Urvuk3 메기 농장 (IOI22_fish) C++17
3 / 100
341 ms 175160 KB
#include "fish.h"

#include <bits/stdc++.h>

using namespace std;

#define ll long long
const int INF=1e9;
const ll LINF=1e18;
#define fi first
#define se second
#define pii pair<int,int>
#define mid ((l+r)/2)
#define sz(a) (int((a).size()))
#define all(a) a.begin(),a.end()
#define endl "\n"
#define pb push_back

void PRINT(int x) {cerr << x;}
void PRINT(ll x) {cerr << x;}
void PRINT(double x) {cerr << x;}
void PRINT(char x) {cerr << '\'' << x << '\'';}
void PRINT(string x) {cerr << '\"' << x << '\"';}
void PRINT(bool x) {cerr << (x ? "true" : "false");}

template<typename T,typename V>
void PRINT(pair<T,V>& x){
    cerr<<"{";
    PRINT(x.fi);
    cerr<<",";
    PRINT(x.se);
    cerr<<"}";
}
template<typename T>
void PRINT(T &x){
    int id=0;
    cerr<<"{";
    for(auto _i:x){
        cerr<<(id++ ? "," : "");
        PRINT(_i);
    }
    cerr<<"}";
}
void _PRINT(){
    cerr<<"]\n";
}
template<typename Head,typename... Tail>
void _PRINT(Head h,Tail... t){
    PRINT(h);
    if(sizeof...(t)) cerr<<", ";
    _PRINT(t...);
}

#define Debug(x...) cerr<<"["<<#x<<"]=["; _PRINT(x)

const int mxM=3e5+1;
const int mxN=1e5+1;
const int mxC=6e6;

int N,M;
ll seg[mxC],_l[mxC],_r[mxC],roots[mxC];
int idxx;

void Update(int node,int l,int r,int idx,ll val){
    if(l==r){
        seg[node]+=val;
        return;
    }
    if(idx<=mid){
        if(!_l[node]) _l[node]=++idxx;
        Update(_l[node],l,mid,idx,val);
    }
    else{
        if(!_r[node]) _r[node]=++idxx;
        Update(_r[node],mid+1,r,idx,val);
    }
    seg[node]=(_l[node] ? seg[_l[node]] : 0)+(_r[node] ? seg[_r[node]] : 0);
}

ll Query(int node,int l,int r,int L,int R){
    if(L>R) return 0;
    if(L<=l && r<=R) return seg[node];
    ll ret=0;
    if(L<=mid && _l[node]) ret+=Query(_l[node],l,mid,L,R);
    if(R>mid && _r[node]) ret+=Query(_r[node],mid+1,r,L,R);
    return ret;
}

ll Query(int col,int L,int R){
    return Query(roots[col],0,N-1,L,R);
}

vector<int> piers[mxN];
vector<pair<int,ll>> w[mxN];
vector<ll> dp[2][mxN];
vector<ll> mx(mxN);

void MaxSelf(ll& x,ll v){
    x=max(x,v);
}

long long max_weights(int N1,int M1,vector<int> X,vector<int> Y,vector<int> W){
    N=N1; M=M1;
    for(int i=0;i<M;i++){
        if(X[i]-1>=0) piers[X[i]-1].pb(Y[i]+1);
        if(X[i]+1<N) piers[X[i]+1].pb(Y[i]+1);
        w[X[i]].pb({Y[i],W[i]});
    }
    for(int i=0;i<N;i++){
        sort(all(piers[i]));
        piers[i].resize(distance(piers[i].begin(),unique(all(piers[i]))));
        sort(all(w[i]));
        roots[i]=++idxx;
        if(w[i].empty()) Update(roots[i],0,N-1,0,0);
        for(auto p:w[i]){
            Update(roots[i],0,N-1,p.fi,p.se);
        }
        dp[0][i].resize(sz(piers[i]));
        dp[1][i].resize(sz(piers[i]));
    }
    for(int i=0;i<N;i++){
        if(i){
            if(i>=3){
                for(int j=0;j<sz(piers[i]);j++){
                    int p=piers[i][j];
                    dp[0][i][j]=mx[i-3]+Query(i-1,0,p-1);
                }
            }
            else if(i>=2){
                int j1=-1;
                for(int j=0;j<sz(piers[i]);j++){
                    int p=piers[i][j];
                    while(j1+1<sz(piers[i-2]) && piers[i-2][j1+1]<=p){
                        dp[0][i][j]=max(dp[0][i][j],max(dp[0][i-2][j1+1],dp[1][i-2][j1+1])+Query(i-1,0,p-1));
                        j1++;
                    }
                }
                j1=sz(piers[i-2]);
                for(int j=sz(piers[i])-1;j>=0;j--){
                    int p=piers[i][j];
                    while(j1-1>=0 && piers[i-2][j1-1]>p){
                        dp[0][i][j]=max(dp[0][i][j],max(dp[0][i-2][j1-1],dp[1][i-2][j1-1])+Query(i-1,0,piers[i-2][j1-1]-1));
                        j1--;
                    }
                }
            }
            else{
                for(int j=0;j<sz(piers[i]);j++){
                    int p=piers[i][j];
                    dp[0][i][j]=Query(0,0,p-1);
                }
            }
            int j1=-1;
            for(int j=0;j<sz(piers[i]);j++){
                int p=piers[i][j];
                while(j1+1<sz(piers[i-1]) && piers[i-1][j1+1]<=p){
                    dp[0][i][j]=max(dp[0][i][j],dp[0][i-1][j1+1]+Query(i-1,piers[i-1][j1+1],p-1));
                    j1++;
                }
            }
            j1=sz(piers[i-1]);
            for(int j=sz(piers[i])-1;j>=0;j--){
                int p=piers[i][j];
                while(j1-1>=0 && piers[i-1][j1-1]>p){
                    dp[1][i][j]=max(dp[1][i][j],max(dp[0][i-1][j1-1],dp[1][i-1][j1-1])+Query(i,p,piers[i-1][j1-1]-1));
                    j1--;
                }
            }
        }
        if(i+1<N){
            for(int j=0;j<sz(piers[i]);j++){
                int p=piers[i][j];
                mx[i]=max(mx[i],max(dp[0][i][j],dp[1][i][j])+Query(i+1,0,p-1));
            }
            if(i) mx[i]=max(mx[i],mx[i-1]);
        }
    }
    ll res=mx[N-2];
    for(int j=0;j<sz(piers[N-1]);j++){
        res=max(res,max(dp[0][N-1][j],dp[1][N-1][j]));
    }
    return res;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 64 ms 46528 KB Output is correct
2 Correct 78 ms 53444 KB Output is correct
3 Correct 18 ms 42004 KB Output is correct
4 Correct 23 ms 42068 KB Output is correct
5 Correct 247 ms 86528 KB Output is correct
6 Correct 341 ms 175160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 13656 KB Output is correct
2 Incorrect 142 ms 57952 KB 1st lines differ - on the 1st token, expected: '40604614618209', found: '40479197388443'
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 41984 KB Output is correct
2 Correct 18 ms 42072 KB Output is correct
3 Incorrect 60 ms 47956 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '20883902549126'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 13816 KB Output is correct
2 Correct 3 ms 13660 KB Output is correct
3 Correct 3 ms 13660 KB Output is correct
4 Correct 3 ms 13660 KB Output is correct
5 Correct 3 ms 13660 KB Output is correct
6 Correct 3 ms 13660 KB Output is correct
7 Correct 3 ms 13660 KB Output is correct
8 Correct 4 ms 13660 KB Output is correct
9 Incorrect 4 ms 13660 KB 1st lines differ - on the 1st token, expected: '216624184325', found: '214600562274'
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 13816 KB Output is correct
2 Correct 3 ms 13660 KB Output is correct
3 Correct 3 ms 13660 KB Output is correct
4 Correct 3 ms 13660 KB Output is correct
5 Correct 3 ms 13660 KB Output is correct
6 Correct 3 ms 13660 KB Output is correct
7 Correct 3 ms 13660 KB Output is correct
8 Correct 4 ms 13660 KB Output is correct
9 Incorrect 4 ms 13660 KB 1st lines differ - on the 1st token, expected: '216624184325', found: '214600562274'
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 13816 KB Output is correct
2 Correct 3 ms 13660 KB Output is correct
3 Correct 3 ms 13660 KB Output is correct
4 Correct 3 ms 13660 KB Output is correct
5 Correct 3 ms 13660 KB Output is correct
6 Correct 3 ms 13660 KB Output is correct
7 Correct 3 ms 13660 KB Output is correct
8 Correct 4 ms 13660 KB Output is correct
9 Incorrect 4 ms 13660 KB 1st lines differ - on the 1st token, expected: '216624184325', found: '214600562274'
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 41984 KB Output is correct
2 Correct 18 ms 42072 KB Output is correct
3 Incorrect 60 ms 47956 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '20883902549126'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 64 ms 46528 KB Output is correct
2 Correct 78 ms 53444 KB Output is correct
3 Correct 18 ms 42004 KB Output is correct
4 Correct 23 ms 42068 KB Output is correct
5 Correct 247 ms 86528 KB Output is correct
6 Correct 341 ms 175160 KB Output is correct
7 Correct 3 ms 13656 KB Output is correct
8 Incorrect 142 ms 57952 KB 1st lines differ - on the 1st token, expected: '40604614618209', found: '40479197388443'
9 Halted 0 ms 0 KB -