제출 #991199

#제출 시각아이디문제언어결과실행 시간메모리
991199tosivanmak자리 배치 (IOI18_seats)C++17
100 / 100
2628 ms196436 KiB
#include <bits/stdc++.h>
#include "seats.h"
using namespace std;
#define ll long long
#define pb push_back
#include <cstdio>
#include <cstdlib>
#include <vector>
const ll inf=1e9;
struct node{
    ll val=0,freq=0;
    node operator+(node n){
        if(val==n.val) return {val,freq+n.freq};
        if(val<n.val) return {val,freq};
        return {n.val,n.freq};
        
    }
};
struct SEG{
  vector<node>seg;
    vector<ll>lz;
    void init(ll n){
       seg.resize(4*n+5);
       lz.resize(4*n+5,0);
    }
    void build(ll l, ll r, ll id){
        seg[id].freq=r-l+1;
        if(l==r)return;
        ll mid=(l+r)>>1;
        build(l,mid,id*2),build(mid+1,r,id*2+1);
    }
    void push(ll l, ll r, ll id){
        seg[id].val+=lz[id];
        if(l!=r){
           for(int i=0;i<2;i++){
               lz[id*2+i]+=lz[id];
           }
        }
        lz[id]=0;
    }
    void upd(ll ul, ll ur, ll l, ll r, ll val, ll id){
        push(l,r,id);
        if(ul>ur)return;
        if(l>ur||r<ul){
            return;
        }
        if(l>=ul&&r<=ur){
            lz[id]=val;
            push(l,r,id);
            return;
        }
        ll mid=(l+r)>>1;
        upd(ul,ur,l,mid,val,id*2),upd(ul,ur,mid+1,r,val,id*2+1);
        seg[id]=seg[id*2]+seg[id*2+1];
    }
    ll ans(){
        if(seg[1].val==4)return seg[1].freq;
        return 0;
    }
    void output(ll l, ll r, ll id){
        cout<<l<<" "<<r<<" "<<id<<" "<<seg[id].val<<" "<<seg[id].freq<<'\n';
        if(l==r){
            return;
        }
        ll mid=(l+r)>>1;
        output(l,mid,id*2),output(mid+1,r,id*2+1);
    }
}st;
int h,w,n;
vector<int>r,c;
vector<vector<int> >grid;
vector<pair<int,int> >pos;

int get(int rr, int cc){
    if(rr==-1||cc==-1||rr==h||cc==w)return n;
    return grid[rr][cc];
}
void upd(vector<int>v, ll val){
    st.upd(v[0]+1,v[1],1,n,val,1);
    st.upd(v[2]+1,v[3],1,n,val*inf,1);
}

void change(ll i, ll j, ll val){
            vector<int>v;
            v.pb(get(i-1,j-1));
            v.pb(get(i-1,j));
            v.pb(get(i,j-1));
            v.pb(get(i,j));
            sort(v.begin(),v.end());
            upd(v,val);
}
void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C){
    h=H,w=W,r=R,c=C;
    n=h*w;
    grid.resize(h+5);
    pos.resize(n+5);
    st.init(n);
    st.build(1,n,1);
    for(int i=0;i<h+5;i++){
        grid[i].resize(w+5);
    }
    for(int i=0;i<n;i++){
        grid[r[i]][c[i]]=i;
        pos[i]={r[i],c[i]};
    }
    for(int i=0;i<=h;i++){
        for(int j=0;j<=w;j++){
            change(i,j,1);
        }
    }
}
int swap_seats(int a, int b){
    pair<int,int>one=pos[a],two=pos[b];
    vector<pair<int,int> >ppp;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            ppp.pb({one.first+i,one.second+j});
            ppp.pb({two.first+i,two.second+j});
        }
    }
    sort(ppp.begin(),ppp.end());
    ppp.erase(unique(ppp.begin(),ppp.end()),ppp.end());
    for(int i=0;i<ppp.size();i++){
        change(ppp[i].first,ppp[i].second,-1);
    }
    swap(grid[one.first][one.second],grid[two.first][two.second]);
    r[a]=two.first,c[a]=two.second;
    r[b]=one.first,c[b]=one.second;
    swap(pos[a],pos[b]);
    for(int i=0;i<ppp.size();i++){
        change(ppp[i].first,ppp[i].second,1);
    }
    return st.ans();
}

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

seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:123:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |     for(int i=0;i<ppp.size();i++){
      |                 ~^~~~~~~~~~~
seats.cpp:130:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  130 |     for(int i=0;i<ppp.size();i++){
      |                 ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...