Submission #870846

#TimeUsernameProblemLanguageResultExecution timeMemory
870846HyojinWall (IOI14_wall)C++17
100 / 100
1213 ms104604 KiB
#include <bits/stdc++.h> using namespace std; #define bit(n,i) ((n>>i)&1) #define all(a) (a).begin(),(a).end() #define pb push_back #define ep emplace_back #define pii pair<int,int> #define piii pair<int,pii> #define fi first #define se second #define ll long long #define debug(x) cerr << #x << ' ' << x << '\n' #define dbg(x) cerr<<#x<<' '<<x<<' ' const int base=31; const int MOD=1e9+7; const int N=1e6+5; const int INF=1e9; const int mx=2e6; struct segtree{ int max1,max2,min1,min2; } st[mx*4+5]; int n,m,k; array<int,4>queries[N]; void pushMin(int id,int val) { if (st[id].min1>=val) { st[id]={val,-INF,val,INF}; } else if (val<st[id].max1) { if (st[id].min2==st[id].max1) st[id].min2=val; st[id].max1=val; } } void pushMax(int id,int val) { if (st[id].max1<=val) { st[id]={val,-INF,val,INF}; } else if (st[id].min1<val) { if (st[id].max2==st[id].min1) st[id].max2=val; st[id].min1=val; } } void up(int id) { st[id].max1=max(st[id<<1].max1,st[id<<1|1].max1); st[id].max2=max(st[id<<1].max2,st[id<<1|1].max2); st[id].min1=min(st[id<<1].min1,st[id<<1|1].min1); st[id].min2=min(st[id<<1].min2,st[id<<1|1].min2); if (st[id<<1].max1!=st[id].max1) st[id].max2=max(st[id].max2,st[id<<1].max1); if (st[id<<1|1].max1!=st[id].max1) st[id].max2=max(st[id].max2,st[id<<1|1].max1); if (st[id<<1].min1!=st[id].min1) st[id].min2=min(st[id].min2,st[id<<1].min1); if (st[id<<1|1].min1!=st[id].min1) st[id].min2=min(st[id].min2,st[id<<1|1].min1); } void down(int id) { pushMin(id<<1,st[id].max1); pushMin(id<<1|1,st[id].max1); pushMax(id<<1,st[id].min1); pushMax(id<<1|1,st[id].min1); } void updateMax(int id,int l,int r,int u,int v,int x) { if (v<l||r<u||x<=st[id].min1) return; if (u<=l&&r<=v&&x<st[id].min2) { pushMax(id,x); return; } int mid=l+r>>1; down(id); updateMax(id<<1,l,mid,u,v,x); updateMax(id<<1|1,mid+1,r,u,v,x); up(id); } void updateMin(int id,int l,int r,int u,int v,int x) { if (v<l||r<u||x>=st[id].max1) return; if (u<=l&&r<=v&&st[id].max2<x) { pushMin(id,x); return; } int mid=l+r>>1; down(id); updateMin(id<<1,l,mid,u,v,x); updateMin(id<<1|1,mid+1,r,u,v,x); up(id); } int get(int id,int l,int r,int x) { if (l==r) return st[id].max1; int mid=l+r>>1; down(id); if (x<=mid) return get(id<<1,l,mid,x); return get(id<<1|1,mid+1,r,x); } void build(int id,int l,int r) { if (l==r) { st[id]={0,-INF,0,INF}; return; } int mid=l+r>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r); up(id); } void buildWall(int n,int k,int op[],int left[],int right[],int height[],int finalHeight[]) { build(1,0,n-1); for (int i=0;i<k;i++) { if (op[i]==1) { updateMax(1,0,n-1,left[i],right[i],height[i]); } else updateMin(1,0,n-1,left[i],right[i],height[i]); } for (int i=0;i<n;i++) { finalHeight[i]=get(1,0,n-1,i); } } /* stuff you should look for * int overflow, array bounds * special cases (n=1?) * do smth instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH */

Compilation message (stderr)

wall.cpp: In function 'void updateMax(int, int, int, int, int, int)':
wall.cpp:74:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   74 |  int mid=l+r>>1;
      |          ~^~
wall.cpp: In function 'void updateMin(int, int, int, int, int, int)':
wall.cpp:88:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   88 |  int mid=l+r>>1;
      |          ~^~
wall.cpp: In function 'int get(int, int, int, int)':
wall.cpp:97:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   97 |  int mid=l+r>>1;
      |          ~^~
wall.cpp: In function 'void build(int, int, int)':
wall.cpp:109:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  109 |  int mid=l+r>>1;
      |          ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...