(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #296979

#TimeUsernameProblemLanguageResultExecution timeMemory
296979daniel920712Seats (IOI18_seats)C++14
100 / 100
3093 ms169072 KiB
#include "seats.h" #include <stdio.h> #include <algorithm> using namespace std; int N,H,W; pair < int , int > all[1000005]; vector < vector < int > > what; vector < int > tt; int how1[1000005]={0}; int how2[1000005]={0}; int xx[5]; struct A { int l,r; int nxl,nxr; int small1,small2,con; int add1,add2; }Node[4000005]; int now=1; void UPD(int here) { Node[Node[here].nxl].add1+=Node[here].add1; Node[Node[here].nxl].small1+=Node[here].add1; Node[Node[here].nxr].add1+=Node[here].add1; Node[Node[here].nxr].small1+=Node[here].add1; Node[here].add1=0; Node[Node[here].nxl].add2+=Node[here].add2; Node[Node[here].nxl].small2+=Node[here].add2; Node[Node[here].nxr].add2+=Node[here].add2; Node[Node[here].nxr].small2+=Node[here].add2; Node[here].add2=0; } void build(int l,int r,int here) { Node[here].l=l; Node[here].r=r; Node[here].small1=0; Node[here].small2=0; Node[here].add1=0; Node[here].add2=0; if(l==r) { Node[here].small1=how1[l]; Node[here].small2=how2[l]; Node[here].con=1; return; } Node[here].nxl=now++; Node[here].nxr=now++; build(l,(l+r)/2,Node[here].nxl); build((l+r)/2+1,r,Node[here].nxr); Node[here].con=0; Node[here].small1=min(Node[Node[here].nxl].small1,Node[Node[here].nxr].small1); Node[here].small2=min(Node[Node[here].nxl].small2,Node[Node[here].nxr].small2); if(Node[Node[here].nxl].small1==Node[here].small1&&Node[Node[here].nxl].small2==Node[here].small2) Node[here].con+=Node[Node[here].nxl].con; if(Node[Node[here].nxr].small1==Node[here].small1&&Node[Node[here].nxr].small2==Node[here].small2) Node[here].con+=Node[Node[here].nxr].con; //printf() } void cha(int l,int r,int x,int con,int here) { if(l>r) return; if(l==Node[here].l&&r==Node[here].r) { if(x==0) { Node[here].add1+=con; Node[here].small1+=con; } else { Node[here].add2+=con; Node[here].small2+=con; } return; } UPD(here); if(r<=(Node[here].l+Node[here].r)/2) cha(l,r,x,con,Node[here].nxl); else if(l>(Node[here].l+Node[here].r)/2) cha(l,r,x,con,Node[here].nxr); else { cha(l,(Node[here].l+Node[here].r)/2,x,con,Node[here].nxl); cha((Node[here].l+Node[here].r)/2+1,r,x,con,Node[here].nxr); } Node[here].con=0; Node[here].small1=min(Node[Node[here].nxl].small1,Node[Node[here].nxr].small1); Node[here].small2=min(Node[Node[here].nxl].small2,Node[Node[here].nxr].small2); if(Node[Node[here].nxl].small1==Node[here].small1&&Node[Node[here].nxl].small2==Node[here].small2) Node[here].con+=Node[Node[here].nxl].con; if(Node[Node[here].nxr].small1==Node[here].small1&&Node[Node[here].nxr].small2==Node[here].small2) Node[here].con+=Node[Node[here].nxr].con; } void F(int x,int y,int t) { int xx[5]={what[x][y],what[x+1][y],what[x][y+1],what[x+1][y+1]}; sort(xx,xx+4); if(t==-2) { if(xx[1]>xx[0]) { how1[xx[0]]++; how1[xx[1]]--; } if(xx[3]>xx[2]) { how2[xx[2]]++; how2[xx[3]]--; } return ; } cha(xx[0],xx[1]-1,0,t,0); cha(xx[2],xx[3]-1,1,t,0); } void give_initial_chart(int H,int W,vector<int> R,vector<int> C) { int i,j; N=H*W; ::H=H; ::W=W; for(j=0;j<=W+1;j++) tt.push_back(N); for(i=0;i<=H+1;i++) what.push_back(tt); for(i=0;i<N;i++) { R[i]++; C[i]++; all[i]=make_pair(R[i],C[i]); what[R[i]][C[i]]=i; } for(i=0;i<=H;i++) for(j=0;j<=W;j++) F(i,j,-2); for(i=1;i<N;i++) how1[i]+=how1[i-1]; for(i=1;i<N;i++) how2[i]+=how2[i-1]; build(0,N-1,0); } int swap_seats(int a, int b) { int x1,y1,x2,y2,ans=0; x1=all[a].first; y1=all[a].second; x2=all[b].first; y2=all[b].second; F(x1-1,y1-1,-1); F(x1-1,y1,-1); F(x1,y1-1,-1); F(x1,y1,-1); F(x2-1,y2-1,-1); F(x2-1,y2,-1); F(x2,y2-1,-1); F(x2,y2,-1); swap(all[a],all[b]); swap(what[x1][y1],what[x2][y2]); F(x1-1,y1-1,1); F(x1-1,y1,1); F(x1,y1-1,1); F(x1,y1,1); F(x2-1,y2-1,1); F(x2-1,y2,1); F(x2,y2-1,1); F(x2,y2,1); return Node[0].con; }

Compilation message (stderr)

seats.cpp: In function 'int swap_seats(int, int)':
seats.cpp:138:21: warning: unused variable 'ans' [-Wunused-variable]
  138 |     int x1,y1,x2,y2,ans=0;
      |                     ^~~
#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...