답안 #411694

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
411694 2021-05-25T18:17:16 Z AugustinasJucas Regions (IOI09_regions) C++14
4 / 100
2801 ms 64752 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("avx2")
using namespace std;
struct medis{
    struct node{
        int l, r, val = 0;
    };
    vector<node> tree;
    int n;
    int dbInd = 0;
    void build(int v){
        if(v >= n){
            tree[v].l = tree[v].r = dbInd++;
        }else{
            build(v*2); build(v*2+1);
            tree[v].l = tree[v*2].l;
            tree[v].r = tree[v*2+1].r; 
        }
    }
    medis(int dd){
        n = dd;
        tree.resize(n * 2 + 1);
    }
    void change(int v, int l, int r, int x){
        if(l <= tree[v].l && tree[v].r <= r){
            tree[v].val = x;
        }else if(r < tree[v].l || tree[v].r < l){
        
        }else{
            change(v*2, l, r, x);
            change(v*2+1, l, r, x);
            tree[v].val = tree[v*2].l + tree[v*2+1].r;
        }
    }
    int get(int v, int l, int r){
        if(l <= tree[v].l && tree[v].r <= r){
            return tree[v].val;
        }else if(r < tree[v].l || tree[v].r < l){
            return 0;
        }else{
            return get(v*2, l, r) + get(v*2+1, l, r);
        }
    }
};
const int dydis = 2e5 + 10;
int n, r, q;
vector<int> dideli; // regionai
vector<int> regs[dydis];
int tevas[dydis];
vector<int> gr[dydis];
unordered_map<long long, long long > rem;
int sm[dydis];
int val[dydis];
int kam[dydis];
int sq;
int dbInd = 0;
int kelint[dydis];
int enter[dydis], leave[dydis];
long long dideliuMem1[450][20001], dideliuMem2[450][20001];
medis tree(dydis);
void dfs1(int v, int came){
	enter[v] = dbInd++;
	for(auto x : gr[v]){
		if(x == came) continue;
		dfs1(x, v);
	}
	leave[v] = dbInd;
}
bool isAnc(int a, int b){
	return enter[a] <= enter[b] && leave[b] <= leave[a];
}
int kek = 0;
int prm = 0;
void dfs(int v){
//		cout << "v = " << v << endl;
	sm[v] = val[v];
	for(auto x : gr[v]){
		if(x == tevas[v]) continue;
		kek += val[v];
        dfs(x);
        kek -= val[v];
		sm[v] += sm[x];
	}
 
	if(!val[v]){
//		cout << "rem[" << prm+1 << "][" << v+1 << "(" << kam[v]+1 << ")] += " << kek << "\n";
//		cout << "rem[" << v+1 << "(" << kam[v]+1 << ")][" << prm+1 << "] += " << sm[v] << "\n"
		dideliuMem1[prm][kam[v]] += kek;
		dideliuMem2[prm][kam[v]] += sm[v];
	}
}
int dbIndd = 0;
void calc(int ind){
	kelint[ind] = dbIndd++;
//	cout << "nuo " << ind+1 << endl;
	for(int i = 0; i < n; i++) sm[i] = val[i] = 0;
	for(auto x : regs[ind]){
		val[x] = 1;
	}
    kek = 0;
    prm = dbIndd-1;
	dfs(0);
}
long long f(int a, int b){
	if((int)regs[a].size() >= sq){
		int sk = kelint[a];
		return dideliuMem1[sk][b];
	}
	if((int)regs[b].size() >= sq){
		int sk = kelint[b];
		return dideliuMem2[sk][a];
	}
	if(rem.count(a*dydis+b)) {
		return rem[a*dydis+b] ;
	}
	long long ret = 0;
	for(auto x : regs[b]){
	    tree.change(1, enter[x], enter[x], 1);
    }
    for(auto x : regs[a]){
        ret += tree.get(1, enter[x], leave[x]);
    }
    for(auto x : regs[b]){
	    tree.change(1, enter[x], enter[x], 0);
    }
	return rem[a*dydis+b] = ret;
}
int main(){
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> n >> r >> q;
	for(int i = 0; i < n; i++){
		int par = -1, reg;
		if(i == 0) cin >> reg;
		else cin >> par >> reg;
		par--; reg--;
		regs[reg].push_back(i);
		if(par != -2){
			gr[i].push_back(par);
			gr[par].push_back(i);
		}
		tevas[i] = par;
		kam[i] = reg;
	}
	dfs1(0, -1);
	sq = sqrt(n)-15;
	for(int i = 0; i < r; i++){
		if((int)regs[i].size() >= sq){
			calc(i);
			dideli.push_back(i);
		}
	}
	while(q--){
		int a, b; cin >> a >> b; a--; b--;
		cout << f(a, b) << endl;
	}
	return 0;
}

Compilation message

regions.cpp:3:28: warning: bad option '-favx2' to pragma 'optimize' [-Wpragmas]
    3 | #pragma GCC optimize("avx2")
      |                            ^
regions.cpp:12:21: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   12 |     void build(int v){
      |                     ^
regions.cpp:21:17: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   21 |     medis(int dd){
      |                 ^
regions.cpp:25:43: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   25 |     void change(int v, int l, int r, int x){
      |                                           ^
regions.cpp:36:32: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   36 |     int get(int v, int l, int r){
      |                                ^
regions.cpp:62:26: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   62 | void dfs1(int v, int came){
      |                          ^
regions.cpp:70:24: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   70 | bool isAnc(int a, int b){
      |                        ^
regions.cpp:75:15: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   75 | void dfs(int v){
      |               ^
regions.cpp:94:18: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
   94 | void calc(int ind){
      |                  ^
regions.cpp:105:25: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
  105 | long long f(int a, int b){
      |                         ^
regions.cpp:129:10: warning: bad option '-favx2' to attribute 'optimize' [-Wattributes]
  129 | int main(){
      |          ^
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14408 KB Output is correct
2 Correct 10 ms 14408 KB Output is correct
3 Correct 10 ms 14536 KB Output is correct
4 Correct 14 ms 14664 KB Output is correct
5 Incorrect 15 ms 14792 KB Output isn't correct
6 Incorrect 26 ms 14536 KB Output isn't correct
7 Incorrect 48 ms 14536 KB Output isn't correct
8 Incorrect 35 ms 14652 KB Output isn't correct
9 Incorrect 59 ms 15272 KB Output isn't correct
10 Incorrect 108 ms 15256 KB Output isn't correct
11 Incorrect 150 ms 15552 KB Output isn't correct
12 Incorrect 189 ms 16268 KB Output isn't correct
13 Incorrect 160 ms 16228 KB Output isn't correct
14 Incorrect 285 ms 17348 KB Output isn't correct
15 Incorrect 191 ms 20168 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1042 ms 21096 KB Output isn't correct
2 Incorrect 1341 ms 20720 KB Output isn't correct
3 Incorrect 1551 ms 24760 KB Output isn't correct
4 Incorrect 361 ms 19392 KB Output isn't correct
5 Incorrect 388 ms 19008 KB Output isn't correct
6 Incorrect 847 ms 26308 KB Output isn't correct
7 Incorrect 849 ms 28348 KB Output isn't correct
8 Incorrect 1429 ms 42572 KB Output isn't correct
9 Incorrect 1582 ms 29052 KB Output isn't correct
10 Incorrect 2707 ms 64752 KB Output isn't correct
11 Incorrect 2801 ms 35272 KB Output isn't correct
12 Incorrect 970 ms 28408 KB Output isn't correct
13 Incorrect 1307 ms 30664 KB Output isn't correct
14 Incorrect 2072 ms 36952 KB Output isn't correct
15 Incorrect 2383 ms 37068 KB Output isn't correct
16 Incorrect 2656 ms 44228 KB Output isn't correct
17 Incorrect 2525 ms 49256 KB Output isn't correct