Submission #1360773

#TimeUsernameProblemLanguageResultExecution timeMemory
1360773settopSeats (IOI18_seats)C++20
0 / 100
366 ms36508 KiB
#include "seats.h"
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define sz(x) (int)x.size()
#define F first
#define S second
const int MAXN=1e6+10;

typedef tuple<int,int,int> trio;
typedef pair<int,int> pii;

struct node{
  int mn,freq;
  node operator+(const node&nd){
    node c;
    c.mn=min(this->mn,nd.mn);
    c.freq=0;
    if(c.mn==this->mn) c.freq+=this->freq;
    if(c.mn==nd.mn)c.freq+=nd.freq;
    return c;
  };
};

int n,lz[4*MAXN];
vector<int> v;
node seg[4*MAXN];

void unlz(int ind,int l,int r){
  seg[ind].mn+=lz[ind];
  if(l!=r){
    lz[2*ind]+=lz[ind];
    lz[2*ind+1]+=lz[ind];
  }
  lz[ind]=0;
}

void build(int ind=1,int l=0,int r=n-1){
  seg[ind].freq=r-l+1;
  if(l==r)return;
  int m=(l+r)>>1;
  build(2*ind,l,m); build(2*ind+1,m+1,r);
}

void updt(int ind,int l,int r,int a,int b,int val){
  unlz(ind,l,r);
  if(a>r || l>b)return;
  if(a<=l && b>=r){
    lz[ind]+=val;
    unlz(ind,l,r);
    return;
  }
  int m=(l+r)>>1;
  updt(2*ind,l,m,a,b,val); updt(2*ind+1,m+1,r,a,b,val);
  seg[ind]=seg[2*ind]+seg[2*ind+1];
}

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
    v.resize(W*H);
    fall(i,0,W*H-1) v[i]=C[i]; 
    n=H*W; 
    build();
    updt(1,0,n-1,v[0],n-1,1); updt(1,0,n-1,v.back(),n-1,1);
    fall(i,1,n-1){
      updt(1,0,n-1,min(v[i],v[i-1]),max(v[i],v[i-1])-1,1);
    }
    return;
  }

int swap_seats(int a, int b){
  if(a>b) swap(a,b);
    if(a) updt(1,0,n-1,min(v[a],v[a-1]),max(v[a],v[a-1])-1,-1);
    else updt(1,0,n-1,v[a],n-1,-1);
    if(b!=n-1) updt(1,0,n-1,min(v[b],v[b+1]),max(v[b],v[b+1])-1,-1);
    else updt(1,0,n-1,v[b],n-1,-1);
    updt(1,0,n-1,min(v[b],v[b-1]),max(v[b],v[b-1])-1,-1);
    if(a+1!=b) updt(1,0,n-1,min(v[a],v[a+1]),max(v[a],v[a+1])-1,-1);

    swap(v[a],v[b]);


    if(a) updt(1,0,n-1,min(v[a],v[a-1]),max(v[a],v[a-1])-1,1);
    else updt(1,0,n-1,v[a],n-1,1);
    if(b!=n-1) updt(1,0,n-1,min(v[b],v[b+1]),max(v[b],v[b+1])-1,1);
    else updt(1,0,n-1,v[b],n-1,1);
    updt(1,0,n-1,min(v[b],v[b-1]),max(v[b],v[b-1])-1,1);
    if(a+1!=b) updt(1,0,n-1,min(v[a],v[a+1]),max(v[a],v[a+1])-1,1);
    return seg[1].freq;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...