답안 #596021

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
596021 2022-07-14T09:21:31 Z 조영욱(#8444) Bodyguard (JOI21_bodyguard) C++17
13 / 100
5493 ms 401476 KB
#include <bits/stdc++.h>
using namespace std;

int n,q;
vector<long long> px;
vector<long long> py;
typedef pair<long long,long long> P;
typedef pair<P,P> PP;
typedef pair<PP,int> PPi;
vector<PPi> v;
int arr[5600][5600][2]; //0:x�� 1:y��
long long dp[5600][5600];

struct Node {
    P line;
    int l,r;
};

const long long INF=2e9+7;
vector<Node> seg;
Node emp={P(0,-2*INF*INF),-1,-1};

long long f(P a,long long x) {
    return a.first*x+a.second;
}

void insert(P x,int node=0,long long nodel=-INF,long long noder=INF){
    P low=seg[node].line;
    P high=x;
    long long mid=(nodel+noder)/2;
    if (f(low,nodel)>f(high,nodel)) {
        swap(low,high);
    }
    if (f(high,noder)>=f(low,noder)) {
seg[node].line=high;
        return;
    }
    if (f(low,mid)>=f(high,mid)) {
        seg[node].line=low;
        if (seg[node].l==-1) {
            seg[node].l=seg.size();
            seg.push_back(emp);
        }
        insert(high,seg[node].l,nodel,mid);
    }
    else {
        seg[node].line=high;
        if (seg[node].r==-1) {
            seg[node].r=seg.size();
            seg.push_back(emp);
        }
        insert(low,seg[node].r,mid+1,noder);
    }
}

long long gety(long long x){
    int node=0;
    int nodel=-INF;
    int noder=INF;
    long long ret=-8e18;
    while (node!=-1) {
        ret=max(ret,f(seg[node].line,x));
        long long mid=(nodel+noder)/2;
        if (x<=mid){
            node=seg[node].l;
            noder=mid;
        }
        else {
            node=seg[node].r;
            nodel=mid+1;
        }
    }
    return ret;
}

P query[3000000];
long long ret[3000000];
typedef pair<P,int> Pi;
vector<Pi> vec;

bool comp(Pi a,Pi b) {
    if (a.first.second==b.first.second) {
        if (a.first.first==b.first.first){
            return a.second<b.second;
        }
        return a.first.first<b.first.first;
    }
    return a.first.second<b.first.second;
}


int main() {
    scanf("%d %d",&n,&q);
    for(int i=0;i<n;i++) {
        long long t,a,b,c;
        scanf("%lld %lld %lld %lld",&t,&a,&b,&c);
        long long x1=t+a;
        long long y1=t-a;
        long long x2=t+abs(b-a)+b;
        long long y2=t+abs(b-a)-b;
        c/=2;
        v.push_back(PPi(PP(P(x1,y1),P(x2,y2)),c));
        px.push_back(x1);
        px.push_back(x2);
        py.push_back(y1);
        py.push_back(y2);
    }
    sort(px.begin(),px.end());
    px.erase(unique(px.begin(),px.end()),px.end());
    sort(py.begin(),py.end());
    py.erase(unique(py.begin(),py.end()),py.end());
    for(int i=0;i<n;i++) {
        v[i].first.first.first=lower_bound(px.begin(),px.end(),v[i].first.first.first)-px.begin();
        v[i].first.first.second=lower_bound(py.begin(),py.end(),v[i].first.first.second)-py.begin();
        v[i].first.second.first=lower_bound(px.begin(),px.end(),v[i].first.second.first)-px.begin();
        v[i].first.second.second=lower_bound(py.begin(),py.end(),v[i].first.second.second)-py.begin();
        if (v[i].first.first.second==v[i].first.second.second) {
            for(int j=v[i].first.first.first;j<v[i].first.second.first;j++) {
                arr[j][v[i].first.first.second][0]=max(arr[j][v[i].first.first.second][0],v[i].second);
            }
        }
        else {
            for(int j=v[i].first.first.second;j<v[i].first.second.second;j++) {
                arr[v[i].first.first.first][j][1]=max(arr[v[i].first.first.first][j][1],v[i].second);
            }
        }
    }
    for(int i=px.size()-1;i>=0;i--) {
        for(int j=py.size()-1;j>=0;j--) {
            if (i+1<px.size()) {
                dp[i][j]=max(dp[i][j],dp[i+1][j]+1LL*arr[i][j][0]*(px[i+1]-px[i]));
            }
            if (j+1<py.size()) {
                dp[i][j]=max(dp[i][j],dp[i][j+1]+1LL*arr[i][j][1]*(py[j+1]-py[j]));
            }
        }
    }
    for(int i=0;i<q;i++) {
        int t,pos;
        scanf("%d %d",&t,&pos);
        int x=t+pos;
        int y=t-pos;
        query[i]=P(x,y);
        int xind=lower_bound(px.begin(),px.end(),x)-px.begin();
        int yind=lower_bound(py.begin(),py.end(),y)-py.begin();
        if (xind==px.size()||yind==py.size()) {
            ret[i]=0;
            continue;
        }
        vec.push_back(Pi(P(xind,yind),i));
        ret[i]=dp[xind][yind];
    }
    sort(vec.begin(),vec.end());
    reverse(vec.begin(),vec.end());
    int ind=0;
    for(int i=px.size()-1;i>0;i--) {
        seg.clear();
        seg.push_back(emp);
        int pr=py.size();
        while (ind<vec.size()&&vec[ind].first.first==i) {
            for(int j=pr-1;j>=vec[ind].first.second;j--) {
                insert(P(-arr[i-1][j][0],1LL*arr[i-1][j][0]*px[i]+dp[i][j]));
                //printf(".%d %lld\n",-arr[i-1][j][0],1LL*arr[i-1][j][0]*px[i]+dp[i][j]);
            }
            pr=vec[ind].first.second;
            int now=vec[ind].second;
//printf("%d %lld\n",now,gety(query[now].first));
            ret[now]=max(ret[now],gety(query[now].first));
            ind++;
        }
    }
    sort(vec.begin(),vec.end(),comp);
    reverse(vec.begin(),vec.end());
    ind=0;
    for(int i=py.size()-1;i>0;i--) {
        seg.clear();
        seg.push_back(emp);
        int pr=px.size();
        while (ind<vec.size()&&vec[ind].first.second==i) {
            for(int j=pr-1;j>=vec[ind].first.first;j--) {
                insert(P(-arr[j][i-1][1],1LL*arr[j][i-1][1]*py[i]+dp[j][i]));
                //printf("%lld %lld\n",-arr[j][i-1][1],1LL*arr[j][i-1][1]*py[i]+dp[j][i]);
            }
            pr=vec[ind].first.first;
            int now=vec[ind].second;
            ret[now]=max(ret[now],gety(query[now].second));
            ind++;
        }
    }
    for(int i=0;i<q;i++) {
        printf("%lld\n",ret[i]);
    }
    return 0;
}

Compilation message

bodyguard.cpp: In function 'int main()':
bodyguard.cpp:130:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  130 |             if (i+1<px.size()) {
      |                 ~~~^~~~~~~~~~
bodyguard.cpp:133:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |             if (j+1<py.size()) {
      |                 ~~~^~~~~~~~~~
bodyguard.cpp:146:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |         if (xind==px.size()||yind==py.size()) {
      |             ~~~~^~~~~~~~~~~
bodyguard.cpp:146:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |         if (xind==px.size()||yind==py.size()) {
      |                              ~~~~^~~~~~~~~~~
bodyguard.cpp:160:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  160 |         while (ind<vec.size()&&vec[ind].first.first==i) {
      |                ~~~^~~~~~~~~~~
bodyguard.cpp:179:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  179 |         while (ind<vec.size()&&vec[ind].first.second==i) {
      |                ~~~^~~~~~~~~~~
bodyguard.cpp:93:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |     scanf("%d %d",&n,&q);
      |     ~~~~~^~~~~~~~~~~~~~~
bodyguard.cpp:96:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |         scanf("%lld %lld %lld %lld",&t,&a,&b,&c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bodyguard.cpp:140:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |         scanf("%d %d",&t,&pos);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5003 ms 322832 KB Output is correct
2 Correct 5493 ms 324068 KB Output is correct
3 Correct 2426 ms 205968 KB Output is correct
4 Correct 1732 ms 132264 KB Output is correct
5 Correct 1687 ms 401476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 301 ms 278888 KB Output is correct
2 Correct 259 ms 278476 KB Output is correct
3 Correct 284 ms 275548 KB Output is correct
4 Correct 4 ms 852 KB Output is correct
5 Correct 293 ms 218340 KB Output is correct
6 Correct 238 ms 195404 KB Output is correct
7 Correct 273 ms 218380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 301 ms 278888 KB Output is correct
2 Correct 259 ms 278476 KB Output is correct
3 Correct 284 ms 275548 KB Output is correct
4 Correct 4 ms 852 KB Output is correct
5 Correct 293 ms 218340 KB Output is correct
6 Correct 238 ms 195404 KB Output is correct
7 Correct 273 ms 218380 KB Output is correct
8 Incorrect 657 ms 279212 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 301 ms 278888 KB Output is correct
2 Correct 259 ms 278476 KB Output is correct
3 Correct 284 ms 275548 KB Output is correct
4 Correct 4 ms 852 KB Output is correct
5 Correct 293 ms 218340 KB Output is correct
6 Correct 238 ms 195404 KB Output is correct
7 Correct 273 ms 218380 KB Output is correct
8 Incorrect 657 ms 279212 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5003 ms 322832 KB Output is correct
2 Correct 5493 ms 324068 KB Output is correct
3 Correct 2426 ms 205968 KB Output is correct
4 Correct 1732 ms 132264 KB Output is correct
5 Correct 1687 ms 401476 KB Output is correct
6 Correct 301 ms 278888 KB Output is correct
7 Correct 259 ms 278476 KB Output is correct
8 Correct 284 ms 275548 KB Output is correct
9 Correct 4 ms 852 KB Output is correct
10 Correct 293 ms 218340 KB Output is correct
11 Correct 238 ms 195404 KB Output is correct
12 Correct 273 ms 218380 KB Output is correct
13 Incorrect 657 ms 279212 KB Output isn't correct
14 Halted 0 ms 0 KB -