Submission #130163

# Submission time Handle Problem Language Result Execution time Memory
130163 2019-07-14T06:09:40 Z ae04071 Bridges (APIO19_bridges) C++11
13 / 100
3000 ms 5724 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define sz(x) ((int)(x).size())
using namespace std;
using lli = long long;
using pii = pair<int,int>;

struct edge{
    int u,v,w,i,c;
    int l,r;
    bool operator<(const edge &rhs)const {
        return w<rhs.w;
    }
}arr[200000];
struct qd{
    int t,a,b;
    bool operator<(const qd &rhs)const {
        return b<rhs.b;
    }
}qa[100000];

int n,m,q;

struct dsu{
    int pa[50001],sz[50001],tp[50001],ts[50001],tf[50001];
    int ti;
    void init() {
        for(int i=1;i<=n;i++) pa[i]=i, sz[i]=1, tf[i]=-1;
    }
    int find(int cur) {
        return cur==pa[cur] ? cur : pa[cur] = find(pa[cur]);
    }
    void merge(int u,int v) {
        u = find(u); v=find(v);
        if(u!=v) {
            pa[v]=u; sz[u]+=sz[v];
        }
    }
    inline void copy() {
        for(int i=1;i<=n;i++) tp[i] = pa[i], ts[i] = sz[i], tf[i] = ti;
    }
    void tcheck(int cur) {
        if(tf[cur]!=ti) tf[cur]=ti, tp[cur]=pa[cur], ts[cur]=sz[cur];
    }
    int tfind(int cur) {
        tcheck(cur);
        return cur==tp[cur] ? cur : tp[cur] = tfind(tp[cur]);
    }
    void tmerge(int u,int v) {
        u=tfind(u), v=tfind(v);
        if(u!=v) {
            tp[v]=u;
            ts[u] += ts[v];
        }
    }
    int tgetsz(int cur) {
        cur=tfind(cur);
        return ts[cur];
    }
}ds;
int ans[100000],pr[100000];
int main() {
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++) {
        scanf("%d%d%d",&arr[i].u,&arr[i].v,&arr[i].w);
        arr[i].w = -arr[i].w;
        arr[i].i = i; arr[i].c = -1;
    }

    scanf("%d",&q);
    for(int i=0;i<m;i++) arr[i].l=-1,arr[i].r=q, pr[i] = i;
    for(int i=0;i<q;i++) {
        scanf("%d%d%d",&qa[i].t,&qa[i].a,&qa[i].b);
        qa[i].b = -qa[i].b;
        if(qa[i].t==1) {
            qa[i].a--;

            int idx = pr[qa[i].a];
            arr[m] = arr[idx];
            arr[m].w = qa[i].b;
            arr[idx].r = i;
            arr[m].l = i;

            pr[qa[i].a] = m++;
        }
    }
    sort(arr,arr+m);

    const int B = 350;
    for(int bi=0;bi*B<q;bi++) {
        vector<pair<qd,int>> a2;
        vector<edge> a1;
        for(int i=bi*B;i<min(bi*B+B, q);i++) {
            if(qa[i].t==2) a2.push_back({qa[i], i});
        }
        sort(a2.begin(),a2.end());

        int s=bi*B, e=min(bi*B+B,q);
        for(int i=0;i<m;i++) {
            if((s<=arr[i].l && arr[i].l<e) || (s<=arr[i].r && arr[i].r<e)) arr[i].c=bi,a1.push_back(arr[i]);
        }

        int ei=0;
        ds.init();
        for(int i=0;i<sz(a2);i++) {
            ds.ti=i;
            for(;ei<m && arr[ei].w <= a2[i].fi.b; ei++) if(arr[ei].c!=bi && arr[ei].l<s && arr[ei].r>=e) {
                ds.merge(arr[ei].u, arr[ei].v);
            }
            ds.copy();
            for(int j=0;j<sz(a1);j++) {
                if(a1[j].l<=a2[i].se && a2[i].se<=a1[j].r && a1[j].w <= a2[i].fi.b) ds.tmerge(a1[j].u,a1[j].v); 
            }
            ans[a2[i].se] = ds.tgetsz(a2[i].fi.a);
        }
    }

    for(int i=0;i<q;i++) if(qa[i].t==2) printf("%d\n",ans[i]);
    
    return 0;
}

Compilation message

bridges.cpp: In function 'int main()':
bridges.cpp:64:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&m);
     ~~~~~^~~~~~~~~~~~~~
bridges.cpp:66:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d",&arr[i].u,&arr[i].v,&arr[i].w);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:71:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&q);
     ~~~~~^~~~~~~~~
bridges.cpp:74:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d",&qa[i].t,&qa[i].a,&qa[i].b);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 380 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 26 ms 756 KB Output is correct
4 Correct 7 ms 632 KB Output is correct
5 Correct 21 ms 812 KB Output is correct
6 Correct 17 ms 860 KB Output is correct
7 Correct 20 ms 792 KB Output is correct
8 Correct 22 ms 888 KB Output is correct
9 Correct 18 ms 812 KB Output is correct
10 Correct 22 ms 872 KB Output is correct
11 Correct 21 ms 860 KB Output is correct
12 Correct 22 ms 820 KB Output is correct
13 Correct 25 ms 784 KB Output is correct
14 Correct 24 ms 936 KB Output is correct
15 Correct 23 ms 888 KB Output is correct
16 Correct 18 ms 760 KB Output is correct
17 Correct 18 ms 760 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 3084 ms 5672 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3011 ms 4804 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3050 ms 5724 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3084 ms 5672 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 380 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 26 ms 756 KB Output is correct
4 Correct 7 ms 632 KB Output is correct
5 Correct 21 ms 812 KB Output is correct
6 Correct 17 ms 860 KB Output is correct
7 Correct 20 ms 792 KB Output is correct
8 Correct 22 ms 888 KB Output is correct
9 Correct 18 ms 812 KB Output is correct
10 Correct 22 ms 872 KB Output is correct
11 Correct 21 ms 860 KB Output is correct
12 Correct 22 ms 820 KB Output is correct
13 Correct 25 ms 784 KB Output is correct
14 Correct 24 ms 936 KB Output is correct
15 Correct 23 ms 888 KB Output is correct
16 Correct 18 ms 760 KB Output is correct
17 Correct 18 ms 760 KB Output is correct
18 Execution timed out 3084 ms 5672 KB Time limit exceeded
19 Halted 0 ms 0 KB -