답안 #557730

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
557730 2022-05-06T01:11:13 Z HunterXD Regions (IOI09_regions) C++17
80 / 100
8000 ms 81640 KB
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
typedef pair<int,int> ii;
typedef vector <int> vi;
typedef vector <ll> vl;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector <char> vc;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<vc> vvc;
typedef vector<vs> vvs;
typedef pair<ll,ll> pl;
typedef double dou;
typedef vector<pl> vpl;
typedef unsigned long long ull;
typedef uint64_t i64;
typedef vector<ull> vull;

#define f first 
#define s second 
#define pb push_back 
#define sz(x) int((x).size())
#define all(x) begin(x), end(x)
#define ts to_string
#define lb lower_bound 
#define ub upper_bound
#define yes cout<<'Y'<<'E'<<'S'<<endl
#define no cout<<'N'<<'O'<<endl
#define nd "\n"

void setIO(string name=""){ios_base::sync_with_stdio(0);cin.tie(0);if(sz(name)){freopen((name+".in").c_str(),"r",stdin);freopen((name+".out").c_str(),"w",stdout);}}
 
ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);}
ll mcm(ll a, ll b) {return (a * b) / gcd(a, b);}
bool prime(ll n) {for(int i=2; i<=sqrt(n); i++) if(n%i==0) return false; return true;}
struct compii{bool operator()(const ii &a, const ii &b){if(a.f==a.s)return a.s<b.s;return a.f>b.f;}};
bool comp(int a, int b) {return a>b;}
ll binpow(ll n, ll x){ll ans=1; while(x){if(x&1){ans*=n;}n*=n; x>>=1;} return ans;}

namespace operators {
template<typename T1, typename T2>istream& operator>>(istream& in, pair<T1, T2>& x){in >> x.first >> x.second;return in;}
template<typename T1, typename T2>ostream& operator<<(ostream& out, pair<T1, T2> x){out << x.first << " " << x.second;return out;}
template<typename T1>istream& operator>>(istream& in, vector<T1>& x) {for (auto& i : x) in >> i;return in;}
template<typename T1>ostream& operator<<(ostream& out, vector<T1>& x) {for (auto& i : x) out << i << " ";return out;}
template<typename T1, typename T2>ostream& operator<<(ostream& out, vector<pair <T1,T2>>& x) {for (auto& i : x) out << i.f << " "<<i.s;return out;}
template<typename T1, typename T2>istream& operator>>(istream& in, vector<pair <T1,T2>>& x) {for (auto& i : x) in >> i.f >>i.s;return in;}
}

using namespace operators;

int dx[]= {1,0,-1,0};
int dy[]= {0,1,0,-1};

const int pmod = 998244353;
const int mod = 1e9+7;
const ll inf=1e9;

ll sum(ll a, ll b){
  return (( (a+mod) %mod) + ((b+mod)%mod))%mod;
}

ll multi(ll a, ll b){
  return (((a+mod) %mod) * ((b+mod)%mod))%mod;
}

///

vector< vector<ll> > tree, res;
vector< vector<ll> > home, tour;
vector<ll> ini, fini;
vector<ll> h;

void dfs1(ll u, ll t, ll s){
  res[t][h[u]]+= s;
  if(h[u] == t) s++;
  for(auto v: tree[u]){
    dfs1(v, t, s);
  }
};

ll tiempo = 1;
void tourdfs(ll u){
  ini[u] = tiempo;
  tour[ h[u] ].pb(tiempo++);
  for(auto v: tree[u]){
    tourdfs(v);
  }
  fini[u] = tiempo;
  tour[ h[u] ].pb(tiempo++);
};


void solve(){
  ll n, r, q; 
  cin >> n >> r >> q;
  
  h.assign(n+1, 0);
  tree.assign(n+1, vector<ll>());
  home.assign(r+1, vector<ll>());
  res.assign(r+1, vector<ll>());
  tour.assign(r+1, vector<ll>());
  ini.assign(n+1, 0);
  fini = ini;


  ll s;
  cin >> h[1];
  home[ h[1] ].pb(1);

  for(ll i = 2; i <= n; i++){
    cin >> s >> h[i];
    tree[s].pb(i); 
    home[ h[i] ].pb(i);
  }

  ll nr = 0;

  while(nr*nr <= n) nr++;
  nr--;
  nr/= 6;

  for(ll i = 1; i <= r; i++){
    if(home[i].size() > nr){
      res[i].assign(r+1, 0);
      dfs1(1, i, 0);
    }
  }

  tourdfs(1);

  vector<ll>::iterator it_ini, it_fini;

  ll r1, r2;
  for(ll i = 0; i < q; i++){
    cin >> r1 >> r2;
    if(home[r1].size() > nr){
      cout << res[r1][r2] << endl << flush;
    }
    else{
      ll res_temp = 0;
      for(auto v: home[r1]){
        it_ini = lower_bound(tour[r2].begin(), tour[r2].end(), ini[v]);
        it_fini = upper_bound(tour[r2].begin(), tour[r2].end(), fini[v]);

        if(it_ini != tour[r2].end()){
          if(*it_ini <= fini[v]){
            it_fini--;
            res_temp+= it_fini-it_ini+1;
          }
        }
      }
      res_temp/= 2;
      cout << res_temp << endl << flush;
    }
  }

}

int main (){
  setIO("");

  int t=1;
  while(t-->0) solve();
  return 0;
}

Compilation message

regions.cpp: In function 'void solve()':
regions.cpp:126:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'int'} [-Wsign-compare]
  126 |     if(home[i].size() > nr){
      |        ~~~~~~~~~~~~~~~^~~~
regions.cpp:139:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'int'} [-Wsign-compare]
  139 |     if(home[r1].size() > nr){
      |        ~~~~~~~~~~~~~~~~^~~~
regions.cpp: In function 'void setIO(std::string)':
regions.cpp:34:88: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 | void setIO(string name=""){ios_base::sync_with_stdio(0);cin.tie(0);if(sz(name)){freopen((name+".in").c_str(),"r",stdin);freopen((name+".out").c_str(),"w",stdout);}}
      |                                                                                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:34:128: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 | void setIO(string name=""){ios_base::sync_with_stdio(0);cin.tie(0);if(sz(name)){freopen((name+".in").c_str(),"r",stdin);freopen((name+".out").c_str(),"w",stdout);}}
      |                                                                                                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 2 ms 208 KB Output is correct
4 Correct 5 ms 336 KB Output is correct
5 Correct 6 ms 336 KB Output is correct
6 Correct 15 ms 464 KB Output is correct
7 Correct 27 ms 464 KB Output is correct
8 Correct 34 ms 592 KB Output is correct
9 Correct 56 ms 1232 KB Output is correct
10 Correct 166 ms 1736 KB Output is correct
11 Correct 178 ms 1832 KB Output is correct
12 Correct 267 ms 3184 KB Output is correct
13 Correct 282 ms 2488 KB Output is correct
14 Correct 257 ms 3056 KB Output is correct
15 Correct 255 ms 5944 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 972 ms 7316 KB Output is correct
2 Correct 1025 ms 6300 KB Output is correct
3 Correct 1384 ms 9640 KB Output is correct
4 Correct 271 ms 4872 KB Output is correct
5 Correct 429 ms 12880 KB Output is correct
6 Correct 542 ms 6856 KB Output is correct
7 Correct 873 ms 11808 KB Output is correct
8 Correct 1420 ms 28484 KB Output is correct
9 Correct 6746 ms 50696 KB Output is correct
10 Correct 3386 ms 79972 KB Output is correct
11 Execution timed out 8025 ms 75724 KB Time limit exceeded
12 Execution timed out 8052 ms 41220 KB Time limit exceeded
13 Execution timed out 8023 ms 55392 KB Time limit exceeded
14 Execution timed out 8009 ms 51772 KB Time limit exceeded
15 Correct 5946 ms 81640 KB Output is correct
16 Correct 3861 ms 77112 KB Output is correct
17 Correct 3673 ms 67744 KB Output is correct