Submission #86285

#TimeUsernameProblemLanguageResultExecution timeMemory
86285nikolapesic2802Zagrade (COI17_zagrade)C++14
40 / 100
3071 ms286528 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>

#define ll long long
#define pb push_back
#define sz(x) (int)(x).size()
#define mp make_pair
#define all(x) x.begin(), x.end()

using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;

template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>; ///find_by_order(),order_of_key()
template<class T1, class T2> ostream& operator<<(ostream& os, const pair<T1,T2>& a) { os << '{' << a.f << ", " << a.s << '}'; return os; }
template<class T> ostream& operator<<(ostream& os, const vector<T>& a) {
	os << '{';
	for(int i=0;i<sz(a);i++)
	{
		if(i>0&&i<sz(a)-1)
			os << ", ";
		os << a[i];
	}
	os << '}';
    return os;
}
const int N=3e5+5;
ll cnt=0;
int sta[N];
int sz[N];
vector<vector<int> > graf(N);
void dfs(int tr,int par)
{
    sz[tr]=1;
    for(auto p:graf[tr])
    {
        if(p==par)
            continue;
        dfs(p,tr);
        sz[tr]+=sz[p];
    }
}
struct str{
    set<pair<int,int> > set1;
    int delta;
    void insert(int i,int p=1)
    {
        i-=delta;
        if(set1.lower_bound({i,0})==set1.end())
        {
            set1.insert({i,p});
            return;
        }
        pair<int,int> a=*set1.lower_bound({i,0});
        if(a.first==i)
        {
            set1.erase(a);
            a.second+=p;
            set1.insert(a);
        }
        else
        {
            set1.insert({i,p});
        }
    }
    int count(int i)
    {
        i-=delta;
        if(set1.lower_bound({i,0})==set1.end())
            return 0;
        pair<int,int> a=*set1.lower_bound({i,0});
        if(a.first==i)
            return a.second;
        return 0;
    }
    int size()
    {
        return set1.size();
    }
    void erase(int i,int p=1)
    {
        i-=delta;
        pair<int,int> a=*set1.lower_bound({i,0});
        if(a.first==i)
        {
            set1.erase(a);
            a.second-=p;
            if(a.second>0)
                set1.insert(a);
        }
        else
        {
            assert(0);
        }
    }
    int erase()
    {
        int obr=0;
        int c=0;
        while(set1.size()&&(*set1.begin()).first+delta<0){
            assert((*set1.begin()).first+delta==-1);
            obr=((*set1.begin()).second);
            set1.erase(set1.begin());
            assert(c==0);
            c++;
        }
        return obr;
    }
    vector<pair<int,int> > all_elements()
    {
        vector<pair<int,int> > al;
        for(auto p:set1)
        {
            al.pb(mp(p.first+delta,p.second));
        }
        return al;
    }
} e;
vector<str> pocetak,kraj;
str poc,krj;
pair<int,int> solve(int tr,int par)
{
    //if(tr%100==0)
    //printf("%i %i %i %i\n",tr,par,poc.size(),krj.size());
    //printf("%i: %lld\n",tr,cnt);
    if(graf[tr].size()==1&&tr!=0)
    {
        //printf("Usao!\n");
        if(sta[tr]==0)
            cnt+=krj.count(1);
        else
            cnt+=poc.count(1);
        pocetak.pb(e);
        kraj.pb(e);
        if(sta[tr]==0)
            pocetak.back().insert(1);
        else
            kraj.back().insert(1);
        return mp(pocetak.size()-1,kraj.size()-1);
    }
    int obr;
    if(sta[tr]==0)
    {
        cnt+=krj.count(1);
        poc.delta++;
        krj.delta--;
        obr=krj.erase();
    }
    else
    {
        cnt+=poc.count(1);
        poc.delta--;
        krj.delta++;
        obr=poc.erase();
    }
    //printf("Prosao!\n");
    vector<pair<int,int> > ind;
    for(auto p:graf[tr])
    {
        if(p==par)
            continue;
        ind.pb({sz[p],p});
    }
    sort(ind.begin(),ind.end());
    vector<pair<int,int> > dodao,dodaok;
    for(int i=0;i<(int)ind.size()-1;i++)
    {
        pair<int,int> tren=solve(ind[i].second,tr);
        //printf("%i: %i %i %i\n",tr,tren.first,tren.second,ind.size());
        if(sta[tr]==0)
        {
            cnt+=kraj[tren.second].count(1);
            pocetak[tren.first].delta++;
            kraj[tren.second].delta--;
            kraj[tren.second].erase();
        }
        else
        {
            cnt+=pocetak[tren.first].count(1);
            pocetak[tren.first].delta--;
            kraj[tren.second].delta++;
            pocetak[tren.first].erase();
        }
        vector<pair<int,int> > al=pocetak[tren.first].all_elements();
        for(auto p:al)
        {
            //printf("%i: Dodao: %i\n",tr,p);
            dodao.pb(p);
            poc.insert(p.first,p.second);
        }
        al=kraj[tren.second].all_elements();
        for(auto p:al)
        {
            //printf("%i: Dodaokraj: %i\n",tr,p);
            dodaok.pb(p);
            krj.insert(p.first,p.second);
        }
    }
    pair<int,int> tren=solve(ind[ind.size()-1].second,tr);
    if(sta[tr]==0)
    {
        cnt+=kraj[tren.second].count(1);
        pocetak[tren.first].delta++;
        kraj[tren.second].delta--;
        kraj[tren.second].erase();
        pocetak[tren.first].insert(1);
    }
    else
    {
        cnt+=pocetak[tren.first].count(1);
        pocetak[tren.first].delta--;
        kraj[tren.second].delta++;
        pocetak[tren.first].erase();
        kraj[tren.second].insert(1);
    }
    for(auto p:dodao)
    {
        //printf("%i: brisem %i\n",tr,p);
        poc.erase(p.first,p.second);
        pocetak[tren.first].insert(p.first,p.second);
    }
    for(auto p:dodaok)
    {
        //printf("%i: brisem kraj %i\n",tr,p);
        krj.erase(p.first,p.second);
        kraj[tren.second].insert(p.first,p.second);
    }
    if(sta[tr]==0)
    {
        if(obr)
            krj.insert(-1,obr);
        poc.delta--;
        krj.delta++;
    }
    else
    {
        if(obr)
            poc.insert(-1,obr);
        poc.delta++;
        krj.delta--;
    }
    return tren;
}
int main()
{
    FILE *f;
    //f=fopen("zagrade.in.3e","r");
    e.set1.clear();
    e.delta=0;
    int n;
    //fscanf(f,"%i",&n);
    //printf("%i\n",n);
    scanf("%i",&n);
    string s;
    char cc[n];
    //fscanf(f,"%s",cc);
    //s=cc;
    cin >> s;
    //printf("Uradio!\n");
    for(int i=0;i<n;i++)
    {
        sta[i]=s[i]==')';
    }
    for(int i=1;i<n;i++)
    {
        int x,y;
        //fscanf(f,"%i %i",&x,&y);
        scanf("%i %i",&x,&y);
        x--;
        y--;
        graf[x].pb(y);
        graf[y].pb(x);
    }
    solve(0,-1);
    printf("%lld\n",cnt);
    return 0;
}

Compilation message (stderr)

zagrade.cpp: In function 'int main()':
zagrade.cpp:248:11: warning: unused variable 'f' [-Wunused-variable]
     FILE *f;
           ^
zagrade.cpp:257:10: warning: unused variable 'cc' [-Wunused-variable]
     char cc[n];
          ^~
zagrade.cpp:255:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%i",&n);
     ~~~~~^~~~~~~~~
zagrade.cpp:270:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%i %i",&x,&y);
         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...