Submission #274982

#TimeUsernameProblemLanguageResultExecution timeMemory
274982MasterdanWall (IOI14_wall)C++14
0 / 100
452 ms11608 KiB
#include "wall.h" #include <bits/stdc++.h> #define MAX 1e9+7 #define MIN -1 #define F first #define S second #define pb push_back #define mk make_pair #define all(a) a.begin (), a.end () #define mem(a, c) memset(a, c, sizeof(a)) using namespace std; typedef long long int ll; typedef pair<int, int> ii; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; const int N=1e5+10; int tree[N*4]; void upd(int node, int in, int fin, int l, int r, int val, int sw){ //cout<<node<<" "<<in<<" "<<fin<<endl; if(in>r || fin<l )return; if(in>=l && fin<=r){ if(sw==1){ tree[node]=max(tree[node], val); }else{ tree[node]=min(tree[node], val); } return; } int mid=(in+fin)/2; upd(2*node+1, in, mid, l, r, val, sw); upd(2*node+2, mid+1, fin, l, r, val, sw); } int query(int node, int in, int fin, int pos, int val, int sw){ //cout<<node<<" "<<in<<" "<<fin<<endl; //cout<<val<<endl; if(pos>fin || pos<in){ if(sw==1)return 0; else return MAX; } if(in==fin){ if(sw==1)return max(val, tree[node]); else return min(val, tree[node]); } if(sw==1)val=max(val, tree[node]); else val=min(val, tree[node]); int mid=(in+fin)/2; if(sw==1)return max(query(2*node+1, in, mid, pos, val, sw), query(2*node+2, mid+1, fin, pos, val, sw)); else return min(query(2*node+1, in, mid, pos, val, sw), query(2*node+2, mid+1, fin, pos, val, sw)); } void buildWall(int n, int k, int op[], int l[], int r[], int h[], int finalHeight[]){ mem(tree, 0); int c=0; for(int i=0;i<k;i++){ if(op[i]==2)break; else c++; } for(int i=0;i<c;i++){ upd(0, 0, n-1, l[i], r[i], h[i], 1); } vi v; for(int i=0;i<n;i++){ v.pb(query(0, 0, n-1, i, 0, 1)); //if(finalHeight[i]==MAX)finalHeight[i]=0; } // for(int i=0;i<n;i++)cout<<v[i]<<" "; // cout<<endl; for(int i=0;i<=N;i++)tree[i]=MAX; for(int i=0;i<n;i++){ upd(0, 0, n-1, i, i, v[i], 2); } //for(int i=0;i<=50;i++)cout<<tree[i]<<" "; //cout<<endl; for(int i=c;i<k;i++){ upd(0, 0, n-1, l[i], r[i], h[i], 2); } // for(int i=0;i<50;i++)cout<<tree[i]<<" "; // cout<<endl; for(int i=0;i<n;i++){ finalHeight[i]=query(0, 0,n-1, i, MAX, 2); } }/* int main() { int n; int k; int i, j; int status = 0; status = scanf("%d%d", &n, &k); assert(status == 2); int* op = (int*)calloc(sizeof(int), k); int* left = (int*)calloc(sizeof(int), k); int* right = (int*)calloc(sizeof(int), k); int* height = (int*)calloc(sizeof(int), k); int* finalHeight = (int*)calloc(sizeof(int), n); for (i = 0; i < k; i++){ status = scanf("%d%d%d%d", &op[i], &left[i], &right[i], &height[i]); assert(status == 4); } buildWall(n, k, op, left, right, height, finalHeight); for (j = 0; j < n; j++) cout<<finalHeight[j]<<endl; } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...