답안 #411695

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
411695 2021-05-25T18:18:36 Z AugustinasJucas Regions (IOI09_regions) C++14
1 / 100
2646 ms 64848 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]-1);
    }
    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);
	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 Incorrect 9 ms 14408 KB Output isn't correct
3 Incorrect 11 ms 14408 KB Output isn't correct
4 Incorrect 14 ms 14408 KB Output isn't correct
5 Incorrect 16 ms 14596 KB Output isn't correct
6 Incorrect 36 ms 14536 KB Output isn't correct
7 Incorrect 38 ms 14536 KB Output isn't correct
8 Incorrect 53 ms 14576 KB Output isn't correct
9 Incorrect 50 ms 15040 KB Output isn't correct
10 Incorrect 84 ms 15304 KB Output isn't correct
11 Incorrect 75 ms 15700 KB Output isn't correct
12 Incorrect 170 ms 16244 KB Output isn't correct
13 Incorrect 183 ms 16396 KB Output isn't correct
14 Incorrect 178 ms 16932 KB Output isn't correct
15 Incorrect 265 ms 20032 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1128 ms 21036 KB Output isn't correct
2 Incorrect 1060 ms 20744 KB Output isn't correct
3 Incorrect 1390 ms 24920 KB Output isn't correct
4 Incorrect 290 ms 17464 KB Output isn't correct
5 Incorrect 225 ms 18944 KB Output isn't correct
6 Incorrect 743 ms 26496 KB Output isn't correct
7 Incorrect 1139 ms 28408 KB Output isn't correct
8 Incorrect 1264 ms 42700 KB Output isn't correct
9 Incorrect 1729 ms 29048 KB Output isn't correct
10 Incorrect 2358 ms 64848 KB Output isn't correct
11 Incorrect 2541 ms 35468 KB Output isn't correct
12 Incorrect 1285 ms 28484 KB Output isn't correct
13 Incorrect 1623 ms 30524 KB Output isn't correct
14 Incorrect 1932 ms 37160 KB Output isn't correct
15 Incorrect 2039 ms 37044 KB Output isn't correct
16 Incorrect 2429 ms 44004 KB Output isn't correct
17 Incorrect 2646 ms 49056 KB Output isn't correct