Submission #1208490

#TimeUsernameProblemLanguageResultExecution timeMemory
1208490mychecksedadArranging Tickets (JOI17_arranging_tickets)C++20
65 / 100
6087 ms6340 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;


int n, m, T[N], lazy[N];
array<int, 3> a[N];


void build(int l, int r ,int k){
  T[k] = 0;
  lazy[k] = 0;
  if(l == r){
    return;
  }
  int mid = l+r>>1;
  build(l, mid, k<<1);
  build(mid+1, r, k<<1|1);
}
void push(int k){
  lazy[k<<1] += lazy[k];
  lazy[k<<1|1] += lazy[k];
  T[k<<1|1] += lazy[k];
  T[k<<1] += lazy[k];
  lazy[k] = 0;
}
void add(int l, int r, int ql, int qr, int k, int val){
  if(ql > r || l > qr) return;
  if(ql <= l && r <= qr){
    T[k] += val;
    lazy[k] += val;;
    return;
  }
  int mid = l+r>>1;
  push(k);
  add(l, mid, ql, qr, k<<1, val);
  add(mid+1, r, ql, qr, k<<1|1, val);
  T[k] = max(T[k<<1], T[k<<1|1]);
}

int get(int l, int r, int ql, int qr, int k){
  if(ql > r || l > qr) return 0;
  if(ql <= l && r <= qr){
    return T[k];
  }
  int mid = l+r>>1;
  push(k);
  return max(get(l, mid, ql, qr, k<<1), get(mid+1, r, ql, qr, k<<1|1));
}

void solve(){
  cin >> n >> m;
  build(1, n, 1);
  for(int i = 1; i <= m; ++i){
    cin >> a[i][0] >> a[i][1] >> a[i][2];
    if(a[i][1] < a[i][0]) swap(a[i][0], a[i][1]);
    add(1, n, a[i][0], a[i][1] - 1, 1, 1);
  }
  // sort(a+1, a+1+m, [&](const array<int, 3> &x, const array<int, 3> &y){
  //   return get(x[0], x[1]) < get(y[0], y[1]);
  // });
  // for(int i = 1; i <= m; ++i){
  //   cerr << get(a[i][0], a[i][1]) << ' ';
  //   // cerr << a[i][0] << ' ' << a[i][1] << '\n';
  // }
  vector<int> rem;
  for(int i = 1; i <= m; ++i){
    rem.pb(i);
  }
  int ans = m;
  // for(int i = 1; i <= n; ++i){
  //   cerr << fw.get(i) - fw.get(i-1) << '\n';
  // }
  for(int k = 0; k <= m; ++k){
    ans = min(get(1, n, 1, n, 1), ans);
    // cerr << ans << '\n';
    if(k==m) break;
    // cerr << "crap\n";

    int best = 0;
    int val = MOD;
    for(int i = 0; i < rem.size(); ++i){
      int l = a[rem[i]][0];
      int r = a[rem[i]][1];
      int vall = max(max(get(1, n, r, n, 1), get(1, n, 1, l - 1, 1)) + 1, get(1, n, l, r - 1, 1) - 1);
      if(val > vall || (val == vall && a[rem[best]][0] >= a[rem[i]][0])) val = vall, best = i;
    }
    // cerr << rem[best] << " wtf\n";
    add(1, n, a[rem[best]][0], a[rem[best]][1] - 1, 1, -1);
    add(1, n, 1, a[rem[best]][0] - 1, 1, 1);
    add(1, n, a[rem[best]][1], n, 1, 1);
    rem.erase(rem.begin() + best);

    // for(int i = 1; i <= n; ++i){
    //   cerr << fw.get(i) - fw.get(i-1) << ' ';
    // }
    // en;
  }
  cout << ans;
}


int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
    en;
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  return 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...