Submission #1298176

#TimeUsernameProblemLanguageResultExecution timeMemory
1298176mohammadsamArranging Tickets (JOI17_arranging_tickets)C++20
65 / 100
3081 ms668 KiB
/*
    in the name of god
*/
//#pragma GCC optimize("Ofast,O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native")

#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll ;

#define File          freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define all(V)        V.begin(),V.end()
#define setprec(x)    fixed << setprecision(x)
#define Mp(a,b)       make_pair(a,b)
#define len(V)        (int)(V.size())
#define sep           ' '
#define endl          '\n'
#define pb            push_back
#define fi            first
#define sec           second
#define popcount(x)   __builtin_popcount(x)
#define lid           u<<1
#define rid           (lid)|1
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll N = 3e3 + 10,SQ=320,LOG=31;
const ll inf = 2e9 , MD = 1e9 + 7;

inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);}
int n , m ;
vector<int> L[N];
multiset<int> s1,s2;
inline bool can(int f,int k){
    s1.clear();
    s2.clear();
    int num = 0;
    for(int i = 1;i <= n;i++){
        for(auto h : L[i]) s1.insert(h);
        if((*s1.begin()) == i) s1.erase(*s1.begin());
        if((*s2.begin()) == i) s2.erase(*s2.begin());
        while(f - len(s2) + len(s1) > k){
            int x = *s1.rbegin();
            s1.erase(s1.find(x));
            s2.insert(x);
            num++;
            if(num > f) return 0;
        }
    }
    return 1;
}
bool check(int k){
    for(int f = 0 ;f <= k;f++){
        if(can(f,k)) return 1;
    }
    return 0;
}
int32_t main() {
    ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0);
    
    cin >> n >> m ;
    for(int i = 1;i <= m;i++){
        int a,b,c;
        cin >> a >> b >> c ;
        if(a > b) swap(a,b);
        L[a].pb(b);
    }    
    int l = 0,r= m;
    while(r-l>1){
        int mid = (l+r)>>1;
        if(check(mid)) r = mid;
        else l = mid;
    }
    cout << r << endl;
    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...