답안 #286619

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
286619 2020-08-30T15:32:32 Z ACmachine 다리 (APIO19_bridges) C++17
44 / 100
3000 ms 7984 KB
#include <bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T, typename U> using ordered_map = tree<T, U, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long ll;
typedef long double ld;
typedef double db;
typedef string str;

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

typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<str> vstr;

#define FOR(i,j,k,in) for(int i=(j); i < (k);i+=in)
#define FORD(i,j,k,in) for(int i=(j); i >=(k);i-=in)
#define REP(i,b) FOR(i,0,b,1)
#define REPD(i,b) FORD(i,b,0,1)
#define pb push_back 
#define mp make_pair
#define ff first
#define ss second
#define all(x) begin(x), end(x)
#define rsz resize 

const double EPS = 1e-9;
const int MOD = 1e9+7; // 998244353;
const ll INFF = 1e18;
const int INF = 1e9;
const ld PI = acos((ld)-1);
const vi dy = {1, 0, -1, 0, -1, 1, 1, -1};
const vi dx = {0, 1, 0, -1, -1, 1, -1, 1};

#ifdef DEBUG
#define DBG if(1)
#else
#define DBG if(0)
#endif

#define dbg(x) cout << "(" << #x << " : " << x << ")" << endl;
// ostreams
template <class T, class U>
ostream& operator<<(ostream& out, const pair<T, U> &par) {out << "[" << par.first << ";" << par.second << "]"; return out;}
template <class T>
ostream& operator<<(ostream& out, const set<T> &cont) { out << "{"; for( const auto &x:cont) out << x << ", "; out << "}"; return out; }
template <class T, class U>
ostream& operator<<(ostream& out, const map<T, U> &cont) {out << "{"; for( const auto &x:cont) out << x << ", "; out << "}"; return out; }
template<class T>
ostream& operator<<(ostream& out, const vector<T> &v){ out << "[";  REP(i, v.size()) out << v[i] << ", ";  out << "]"; return out;}
// istreams
template<class T>
istream& operator>>(istream& in, vector<T> &v){ for(auto &x : v) in >> x; return in; }
template<class T, class U>
istream& operator>>(istream& in, pair<T, U> &p){ in >> p.ff >> p.ss; return in; }
//searches
template<typename T, typename U>
T bsl(T lo, T hi, U f){ hi++; T mid; while(lo < hi){ mid = (lo + hi)/2; f(mid) ? hi = mid : lo = mid+1; } return lo; }
template<typename U>
double bsld(double lo, double hi, U f, double p = 1e-9){ int r = 3 + (int)log2((hi - lo)/p); double mid; while(r--){ mid = (lo + hi)/2; f(mid) ? hi = mid : lo = mid; } return (lo + hi)/2; }
template<typename T, typename U>
T bsh(T lo, T hi, U f){ lo--; T mid; while(lo < hi){ mid = (lo + hi + 1)/2; f(mid) ? lo = mid : hi = mid-1; } return lo; }
template<typename U>
double bshd(double lo, double hi, U f, double p = 1e-9){ int r = 3+(int)log2((hi - lo)/p); double mid; while(r--){ mid = (lo + hi)/2; f(mid) ? lo = mid : hi = mid; } return (lo + hi)/2; }
// some more utility functions
template<typename T>
pair<T, int> get_min(vector<T> &v){ typename vector<T> :: iterator it = min_element(v.begin(), v.end()); return mp(*it, it - v.begin());}
template<typename T>
pair<T, int> get_max(vector<T> &v){ typename vector<T> :: iterator it = max_element(v.begin(), v.end()); return mp(*it, it - v.begin());}        
template<typename T> bool ckmin(T& a, const T& b){return b < a ? a = b , true : false;}
template<typename T> bool ckmax(T& a, const T& b){return b > a ? a = b, true : false;}

//practically constant time - dsu with path compression
// if(e[x] < 0) e[x] is root and size is -e[x] else e[x] is parent of x;
// kactl icpc notebook
struct dsu_save{
    int v, rnkv, u, rnku;
};
struct dsu{
    vector<int> e;
    stack<dsu_save> rb;
    dsu(){};
    dsu(int n){
        e.resize(n, -1);
    }
    int find(int x){ return (e[x] < 0 ? x : find(e[x])); }
    int size(int x){ return -e[find(x)]; }
    int sameSet(int a, int b){ return find(a) == find(b); }
    bool join(int a, int b){
        a = find(a); b = find(b);
        if(a == b) return false;
        if(e[a] > e[b]) swap(a, b);
        rb.push({a, e[a], b, e[b]});
        e[a] += e[b]; e[b] = a;
        return true;
    }
    void rollback(){
        if(rb.empty()) return;
        dsu_save last = rb.top();
        rb.pop();
        e[last.v] = last.rnkv;
        e[last.u] = last.rnku;
    }
};


template<typename T>
struct edge{
    int src;
    int dest;
    T cost;
};
template<typename T>
class graph{
    public: 
    vector<edge<T>> edges;
    vector<vector<int>> adj;
    int n;
    graph(){};
    graph(int _n){
        n = _n;
        adj.resize(n);
    }
};


template<typename T>
class undigraph : public graph<T>{
    public:
        using graph<T>::edges;
        using graph<T>::adj;
        using graph<T>::n;
        undigraph() : graph<T>(){};
        undigraph(int _n) : graph<T>(_n){};

        int add_edge(int src, int dest, T cost = 1){
            int id = edges.size();
            edges.push_back({src, dest, cost});
            adj[src].push_back(id);
            adj[dest].push_back(id);
            return id;
        }
};
bool operator<(edge<int> lhs, edge<int> rhs){
    return make_tuple(lhs.cost, lhs.src, lhs.dest) < make_tuple(rhs.cost, rhs.src, rhs.dest);
}
struct query{
    int t, a, b;   
};

struct AcAutomaton{
    int UPD = 1;
    int ASK = 2;
    int n, m, q; 
    vector<query> queries;
    vector<pair<edge<int>, int>> edges;
    vi out;
    void read_in(){
		cin >> n >> m;
        REP(i, m){
            int u, v, c; cin >> u >> v >> c; --u; --v;
            edge<int> e = {u ,v, c};
            edges.pb(mp(e, i));
        }
        cin >> q;
        out.rsz(q, -1);
        REP(i, q){
            int t, a, b; cin >> t >> a >> b; 
            --a;
            queries.pb({t, a, b});
        }
	}
    // viac verzii jednej hrany
    void solve_bucket(int l, int r){
        vector<pair<query, int>> questions;
        vector<bool> affected(m+5, false);
        vi qry_edg;
        map<int, vpii> verzie;
        FOR(i, l, r, 1){
            if(queries[i].t == ASK){
                questions.pb(mp(queries[i], i));  
            }
            else{
                affected[queries[i].a] = true;
                if(verzie.find(queries[i].a) == verzie.end()){
                    verzie[queries[i].a].pb(mp(edges[queries[i].a].ff.cost, -1));
                }
                verzie[queries[i].a].pb(mp(queries[i].b, i));
            }
        }
        vector<edge<int>> sorted_edges;
        for(auto x : edges){
            if(!affected[x.ss]) sorted_edges.pb(x.ff);
        }
        sort(all(sorted_edges)); reverse(all(sorted_edges));
        sort(all(questions), [](pair<query,int> lhs, pair<query, int> rhs){return lhs.ff.b < rhs.ff.b;}); reverse(all(questions));
        int pp = 0;
        dsu d(n+5);
        int cnt = 0;
        REP(i, questions.size()){
            cnt = 0;
            while(pp < sorted_edges.size() && sorted_edges[pp].cost >= questions[i].ff.b){
                d.join(sorted_edges[pp].src, sorted_edges[pp].dest);
                ++pp;
            }    
            for(auto vv : verzie){
                pii maxi = {-2, -2};
                for(auto pr : vv.ss){
                    if(pr.ss > maxi.ss && pr.ss < questions[i].ss) maxi = pr;
                }
                int id = vv.ff;
                if(maxi.ff >= questions[i].ff.b){
                    if(d.join(edges[id].ff.src, edges[id].ff.dest)) ++cnt;
                }
            }
            /* REP(j, qry_edg.size()){ */
            /*     if(qry_edg[j] < questions[i].ss){ */ 
            /*         query que = queries[qry_edg[j]]; */
            /*         if(que.b >= questions[i].ff.b){ */
            /*             if(d.join(edges[que.a].ff.src, edges[que.a].ff.dest)) ++cnt; */  
            /*         } */
            /*     } */
            /*     else{ */
            /*         query que = queries[qry_edg[j]]; */
            /*         if(edges[que.a].ff.cost >= questions[i].ff.b){ */
            /*             if(d.join(edges[que.a].ff.src, edges[que.a].ff.dest)) ++cnt; */
            /*         } */ 
            /*     } */ 
            /* } */
            out[questions[i].ss] = d.size(questions[i].ff.a);
            REP(j, cnt) d.rollback(); 
        }
        for(auto vv : verzie){
            edges[vv.ff].ff.cost = vv.ss[vv.ss.size()-1].ff;
        }
        /* REP(i, qry_edg.size()){ */
        /*     edges[queries[qry_edg[i]].a].ff.cost = queries[qry_edg[i]].b; */
        /* } */
    }
	void solve(){ 
        int bucketsize = 800; 
        FOR(i, 0, q, bucketsize){
            solve_bucket(i, min(q,i+bucketsize));  
        }
        REP(i,q){
            if(queries[i].t == ASK) cout << out[i] << "\n";
        } 
	}
};
    
int main(){
 	ios_base::sync_with_stdio(false);
 	cin.tie(NULL); cout.tie(NULL);
	int tcase = 1;
	while(tcase--){
		AcAutomaton solver;
		solver.read_in();
		solver.solve();
	}
    return 0;
}

Compilation message

bridges.cpp: In member function 'void AcAutomaton::solve_bucket(int, int)':
bridges.cpp:26:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<query, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 | #define FOR(i,j,k,in) for(int i=(j); i < (k);i+=in)
      |                                        ^
bridges.cpp:28:18: note: in expansion of macro 'FOR'
   28 | #define REP(i,b) FOR(i,0,b,1)
      |                  ^~~
bridges.cpp:210:9: note: in expansion of macro 'REP'
  210 |         REP(i, questions.size()){
      |         ^~~
bridges.cpp:212:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  212 |             while(pp < sorted_edges.size() && sorted_edges[pp].cost >= questions[i].ff.b){
      |                   ~~~^~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 130 ms 896 KB Output is correct
4 Correct 5 ms 832 KB Output is correct
5 Correct 57 ms 832 KB Output is correct
6 Correct 37 ms 832 KB Output is correct
7 Correct 53 ms 768 KB Output is correct
8 Correct 41 ms 832 KB Output is correct
9 Correct 47 ms 768 KB Output is correct
10 Correct 45 ms 832 KB Output is correct
11 Correct 42 ms 832 KB Output is correct
12 Correct 43 ms 832 KB Output is correct
13 Correct 58 ms 836 KB Output is correct
14 Correct 56 ms 836 KB Output is correct
15 Correct 44 ms 844 KB Output is correct
16 Correct 46 ms 768 KB Output is correct
17 Correct 46 ms 744 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2820 ms 6268 KB Output is correct
2 Correct 2904 ms 7304 KB Output is correct
3 Execution timed out 3043 ms 7160 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2309 ms 4788 KB Output is correct
2 Correct 1847 ms 4092 KB Output is correct
3 Correct 2536 ms 5972 KB Output is correct
4 Correct 2256 ms 6120 KB Output is correct
5 Correct 44 ms 3576 KB Output is correct
6 Correct 2366 ms 5996 KB Output is correct
7 Correct 2101 ms 5996 KB Output is correct
8 Correct 1975 ms 6028 KB Output is correct
9 Correct 1298 ms 6120 KB Output is correct
10 Correct 1216 ms 6248 KB Output is correct
11 Correct 1300 ms 5996 KB Output is correct
12 Correct 1235 ms 5992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2495 ms 7240 KB Output is correct
2 Correct 42 ms 3576 KB Output is correct
3 Correct 267 ms 6192 KB Output is correct
4 Correct 250 ms 6068 KB Output is correct
5 Correct 2517 ms 7628 KB Output is correct
6 Correct 2452 ms 7700 KB Output is correct
7 Correct 2522 ms 7748 KB Output is correct
8 Correct 1181 ms 5732 KB Output is correct
9 Correct 1185 ms 5664 KB Output is correct
10 Correct 1180 ms 5636 KB Output is correct
11 Correct 1859 ms 6848 KB Output is correct
12 Correct 1830 ms 6868 KB Output is correct
13 Correct 1854 ms 6832 KB Output is correct
14 Correct 2405 ms 7536 KB Output is correct
15 Correct 2508 ms 7832 KB Output is correct
16 Correct 2480 ms 7700 KB Output is correct
17 Correct 2478 ms 7704 KB Output is correct
18 Correct 2525 ms 7672 KB Output is correct
19 Correct 2511 ms 7984 KB Output is correct
20 Correct 2152 ms 7268 KB Output is correct
21 Correct 2172 ms 6968 KB Output is correct
22 Correct 2431 ms 7416 KB Output is correct
23 Correct 2093 ms 7164 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2820 ms 6268 KB Output is correct
2 Correct 2904 ms 7304 KB Output is correct
3 Execution timed out 3043 ms 7160 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 130 ms 896 KB Output is correct
4 Correct 5 ms 832 KB Output is correct
5 Correct 57 ms 832 KB Output is correct
6 Correct 37 ms 832 KB Output is correct
7 Correct 53 ms 768 KB Output is correct
8 Correct 41 ms 832 KB Output is correct
9 Correct 47 ms 768 KB Output is correct
10 Correct 45 ms 832 KB Output is correct
11 Correct 42 ms 832 KB Output is correct
12 Correct 43 ms 832 KB Output is correct
13 Correct 58 ms 836 KB Output is correct
14 Correct 56 ms 836 KB Output is correct
15 Correct 44 ms 844 KB Output is correct
16 Correct 46 ms 768 KB Output is correct
17 Correct 46 ms 744 KB Output is correct
18 Correct 2820 ms 6268 KB Output is correct
19 Correct 2904 ms 7304 KB Output is correct
20 Execution timed out 3043 ms 7160 KB Time limit exceeded
21 Halted 0 ms 0 KB -