Sewaktu soal-soal babak final INC dibuat, saya adalah salah satu reviewer yang bertugas membuat alternate solutions dari beberapa soal tersebut.
Karena INC 2010 sudah berakhir, saya berpikir untuk merilis alternate solutions saya.
Selain itu, saya juga membuat 2 dari 9 soal (soal F dan soal G).
Saya berharap postingan saya ini bisa membantu para peserta INC untuk dapat belajar lebih banyak.
Pembahasan saya untuk setiap soal dapat dilihat dibawah.
Untuk melihat lebih banyak pembahasan dan cerita seputar INC 2010, bisa kunjungi blog Suhendry,
Eko Wibowo,
Tim Saklar Lhompat.
Kalau ada tambahan cerita dari tim lain, tolong kabari saya :)
Jika ada komentar/saran/pertanyaan singkat, bisa di-post di kotak abu-abu yang ada di kanan atas.
Jika ada pertanyaan yang panjang, lebih baik di-post di mailing list indo-algo@yahoogroups.com.
ACM-ICPC 2010 is drawing near and your university want to select three out of N students to form the best team. The university however, has a limited budget, so they can only afford to send one team. The coach wants his best team to be the best in term of compatibility. The compatibility of a team which member is student A, B and C is calculated by PA,B * PA,C * PB,C, where Pi,j is the compatibility of student i and student j.
Given Pi,j for all pair of students, calculate the highest compatibility value that can be achieved by any team of three students.
Input
The first line of input contains an integer T (1 ≤ T ≤ 100) the number of cases. Each case begins with an integer N (3 ≤ N ≤ 50) the number of students. The next N lines each contains N integers Pi,j (0 ≤ Pi,j ≤ 100). The ith line and jth integer denotes the compatibility of student i with student j. You may assume Pi,j = Pj,i and Pi,i = 0.
Output
For each test case, output in a line the highest compatibility value that can be achieved by any team of three students.
There are only three students so the coach has no choice but to select them.
Explanation for the 2nd sample input.
The best combination would be choosing student 1, 3 and 4.
Pembahasan Soal A - The Best Team
Untuk kasus terburuk dimana N = 50, banyaknya tim berbeda yang bisa dibentuk adalah nCk(50,3) = 50*49*48 / 1/2/3 = 19600 tim.
19600 tim termasuk angka yang sangat sedikit (dalam 2 detik, komputer juri dapat melakukan lebih dari 10 juta operasi),
sehingga kita dapat mengecek nilai kompatibilitas untuk setiap tim yang dapat dibentuk (brute-force).
Untuk implementasinya, bisa dilakukan 3 nested loop (untuk murid pertama, kedua, dan ketiga).
Untuk membentuk sebuah tim, ketiga murid ini haruslah orang yang berbeda.
Untuk setiap tim yang bisa dibentuk, kita tinggal menyimpan kompatibilitas tertinggi.
Berikut adalah contoh implementasinya.
#include <stdio.h>
#define REP(i,n) for (int i=0,_n=n; i<_n; i++)
int T,N,P[51][51];
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&N);
REP(i,N) REP(j,N) scanf("%d",&P[i][j]);
int res = 0;
REP(i,N) REP(j,N) REP(k,N)
if (i!=j && i!=k && j!=k)
res >?= P[i][j] * P[j][k] * P[k][i];
printf("%d\n",res);
}
}
Given a labeled complete k-ary tree, find the largest labeled common ancestor of two given nodes. In a complete k-ary tree, the node in the tree is labeled sequentially from the left most child to the right most child, level by level. Largest labeled common ancestor of A and B is defined as the largest labeled node in the tree which has both A and B as descendants. A node is a descendant of itself.
For example, given a k-ary tree with k = 3, the largest labeled common ancestor of node 42 and 7 is node 2 (see the picture below).
Input
The first line of input contains an integer T (1 ≤ T ≤ 100) the number of cases. Each case contains three integers K, A and B (2 ≤ K ≤ 100; 1 ≤ A, B ≤ 2,000,000,000).
Output
For each test case, output in a line the largest labeled common ancestor node.
Sample Input
Output for Sample Input
4
3 42 7
2 2 6
2 1 105
4 10 13
2
1
1
3
Pembahasan Soal B - Largest Labeled Common Ancestor
Misalkan:
p(N) adalah parent dari node N, dan
f(A,B) = X, dimana X adalah node dengan label terbesar yang merupakan ancestor dari node A dan B.
Maka bisa dibuktikan bahwa:
jika A > B, maka f(A,B) = f(p(A),B),
jika A < B, maka f(A,B) = f(A,p(B)), dan
jika A = B, maka f(A,B) = X
Apakah ada yang ingin mencoba membuktikan hal ini?
Jika anda bisa membuktikan hal diatas, maka implementasinya akan sangat mudah, seperti dibawah ini.
#include <stdio.h>
#define p(N) ((N-2)/K + 1)
int K;
int f(int A, int B){
if (A > B) return f(p(A),B);
if (A < B) return f(A,p(B));
return A; // A = B = X
}
int main(){
int T,A,B;
scanf("%d",&T);
while (T--){
scanf("%d %d %d",&K,&A,&B);
printf("%d\n",f(A,B));
}
}
Push an element into stack. This operation is denoted by a command string "+?" where ? is any alphabet 'a'-'z' or 'A'-'Z', it means append a character ? into stack.
Reverse all element in stack. This operation is denoted by a command string "^". It will reverse all elements in stack, do nothing if the stack is empty.
For example, command string "+a+b+c+d^" means: push a, push b, push c, push d and reverse. After "+a+b+c+d^" executed, the stack contains "dcba". Write a program which take the command string as the input and output the stack's content after the command is executed.
Input
The first line of input contains an integer T (1 ≤ T ≤ 1,000) the number of cases. Each case contains a string S denoting the command string as described above. S will be between 1 and 100 characters long.
Output
For each test case, output in a line the content of the stack after the command is executed.
Sample Input
Output for Sample Input
2
+a+b
+A+B^+c^
ab
cAB
Pembahasan Soal C - Stack Machine Simulator
Soal ini bisa diselesaikan dengan mengikuti langkah-langkah yang diminta.
Penggunaan STL sangat membantu untuk melakukan operasi reverse.
Berikut adalah contoh implementasinya.
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;
char s[1000];
int T;
int main(){
scanf("%d",&T);
while (T--){
scanf("%s",s);
string r = "";
for (int i=0; s[i]; i++){
if (s[i]=='+') r += s[++i];
else reverse(r.begin(),r.end());
}
puts(r.c_str());
}
}
Given three sets of integers of the same size: A, B and C. Your task is to calculate how many triplet {i, j, k} such that A i + B j + C k = 0.
Input
The first line of input contains an integer T (1 ≤ T ≤ 100) the number of cases. Each case begins with an integer N (1 ≤ N ≤ 2,000) the size of each set of integer. The next three lines each contains N integers range from -1,000,000,000 to 1,000,000,000. Each line represent A, B and C respectively.
Output
For each test case, output in a line the number of different triplets.
Sample Input
Output for Sample Input
2
2
0 3
-1 5
0 1
4
2 7 -3 9
-1 -5 4 6
-2 -7 8 -3
1
3
Explanation for the 1st sample input.
There is only one triplet that sums to zero: {0, 0, 1} which corresponds to 0 + (-1) + 1 = 0.
Explanation for the 2nd sample input.
There are three triplets that sum to zero:
{1, 1, 0} which corresponds to 7 + (-5) + (-2) = 0.
{2, 1, 2} which corresponds to (-3) + (-5) + 8 = 0.
{2, 3, 3} which corresponds to (-3) + 6 + (-3) = 0.
Pembahasan Soal D - Sum to Zero
Misalkan kita mempunyai 2 sorted array: B dan C yang masing-masing berisi N bilangan.
Untuk mencari index b di array B dan index c di array C dimana B[b] + C[c] = x, dapat dilakukan dalam O(N) operasi.
Caranya adalah dengan menelusuri index b secara menaik (dari 0 sampai N-1) dan menelusuri index c secara menurun (dari N-1 sampai 0),
atau sebaliknya.
Illustrasinya ada di blog Suhendry.
Jika kita bisa memecahkan masalah diatas, maka cara mencari A[a] + B[b] + C[c] = 0 adalah sama dengan cara mencari B[b] + C[c] = -A[a].
Untuk setiap bilangan x di array A, kita cari apakah ada B[b] + C[c] = x.
Karena ada N bilangan di array A, total kompleksitasnya adalah O(N^2).
Untuk mencari banyaknya pasangan elemen (b,c) dimana B[b] + C[c] = x, kita bisa menghitung
berapa banyak elemen di B yang valuenya adalah B[b] (countB), dan berapa banyak elemen di C yang valuenya adalah C[c] (countC).
Maka banyaknya pasangan elemen (b,c) dimana B[b] + C[c] = x adalah countB * countC.
Dibawah ini adalah contoh implementasi O(N^2) untuk problem D.
#include <algorithm>
#define REP(i,n) for (int i=0,_n=n; i<_n; i++)
int T, N, A[2000], B[2000], C[2000];
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&N);
REP(i,N) scanf("%d",&A[i]);
REP(i,N) scanf("%d",&B[i]); std::sort(B,B+N);
REP(i,N) scanf("%d",&C[i]); std::sort(C,C+N);
long long res = 0;
REP(a,N){
int x = -A[a]; // kita ingin B[b] + C[c] == -A[a]
int b=0, c=N-1; // cari b dan c dimana B[b] + C[c] == x
while (b<N && c>=0){
int countB = 1;
while (b+1 < N && B[b] == B[b+1]) b++, countB++;
while (c>=0 && B[b] + C[c] > x) c--;
if (c<0) break;
if (B[b] + C[c] == x){
int countC = 1;
while (c>0 && C[c] == C[c-1]) c--, countC++;
res += countB * countC;
}
b++;
}
}
printf("%lld\n",res);
}
}
You may be don't know about this, but Ceemot does like to play with boxes during her free time. She has N different boxes in one pile. First, she splits them into two piles (not necessary the same size), then she picks one of the piles with at least two boxes and splits it into two again. She repeats this until each pile has only one box.
As a computer scientist, she wonders the number of different ways in which she can do this.
For example, if she begins with a pile of 3 boxes (A, B and C) then there are three ways to do her weird hobby:
Split ABC into A and BC, split BC into B and C.
Split ABC into B and AC, split AC into A and C.
Split ABC into C and AB, split AB into A and B.
If she begins with a pile of 4 boxes (A, B, C and D) then there are eighteen ways to do this:
Split ABCD into AB and CD, split AB into A and B, split CD into C and D.
Split ABCD into AB and CD, split CD into C and D, split AB into A and B.
Split ABCD into AC and BD, split AC into A and C, split BD into B and D.
...
Split ABCD into A and BCD, split BCD into B and CD, split CD into C and D.
Split ABCD into A and BCD, split BCD into C and BD, split BD into B and D.
Split ABCD into A and BCD, split BCD into D and BC, split BC into B and C.
...
Help her to count the number of different ways in which she can carry out this splitting procedure. As the number may be very big, modulo the output with 1,000,000,007.
Input
The first line of input contains an integer T (1 ≤ T ≤ 1,000) the number of cases. Each case begins with an integer N (2 ≤ N ≤ 100,000) the number of different boxes Ceemot has in one pile originally.
Output
For each test case, output in a line the number of different ways in which she can carry out her splitting procedure. Modulo this number with 1,000,000,007.
Sample Input
Output for Sample Input
3
3
4
7
3
18
56700
Pembahasan Soal E - Playing with Boxes
Bagi yang terlalu sering menggunakan top-down approach, soal ini akan menjadi sulit dipecahkan.
Misalkan f(N) adalah banyaknya cara kita memisahkan N kotak.
Maka banyaknya cara memisahkan kotak-kotak tersebut bisa dihitung secara rekursif:
f(N) = sum(nCk(N-1,i) * f(i+1) * f(N-(i+1)) * (N-2)! / i! / (N-(i+1)-1)!) dimana i = 0..N-1
Cara diatas hanya bisa digunakan untuk menyelesaikan untuk N <= 10.
Untuk menjawab N > 10, kita berharap bahwa jawabannya memiliki sebuah pola
(atau berpikir terbalik seperti yang dijelaskan di blog Suhendry).
Untuk mencari pola tersebut, pertama-tama kita jabarkan jawaban untuk N dari 1 sampai 10 menggunakan program berikut.
#include <stdio.h>
#define REP(i,n) for (int i=0,_n=n; i<_n; i++)
long long nCk(int n, int k){
long long ret = 1;
for (int i=1; i<=k; i++)
ret = ret * (n-i+1) / i;
return ret;
}
long long fac(int n){
if (n<=1) return 1;
return n * fac(n-1);
}
long long f(int N){
if (N<=2) return 1;
long long ret = 0;
REP(i,N-1){
ret += nCk(N-1,i) * f(i+1) * f(N-(i+1)) * fac(N-2) / fac(i) / fac(N-(i+1)-1);
}
return ret;
}
int main(){
// Generate the first 10 results
for (int i=1; i<=10; i++)
printf("%d = %lld\n",i,f(i));
/*
Hasilnya adalah:
1 = 1
2 = 1
3 = 3
4 = 18
5 = 180
6 = 2700
7 = 56700
8 = 1587600
9 = 57153600
10 = 2571912000
*/
}
Terlihat pola bahwa jawaban untuk f(N) ternyata adalah hasil dari perkalian f(N-1) dengan suatu bilangan.
Jika kita telusuri lebih dalam, kita bisa menemukan pola perkalian tersebut.
Sehingga kita bisa membuat solusi yang lebih simple dan cepat, seperti berikut ini.
#include <stdio.h>
int T,N,res[100001];
int main(){
res[1] = 1;
for (long long i=2,a=1,b=2; i<=100000; i++, a+=b, b++)
res[i] = res[i-1] * a % 1000000007;
scanf("%d",&T);
while (T--){
scanf("%d",&N);
printf("%d\n",res[N]);
}
}
Given a rooted tree which contains N nodes numbered from 0 to N-1 with node 0 as the root. Each node has a distinct value assigned to it. You have to write a program that can find the kth smallest value in the subtree of a given node Xi.
Input
The first line of input contains an integer T (1 ≤ T ≤ 20) the number of cases. Each case begins with two integers N and Q (1 ≤ N ≤ 100,000; 1 ≤ Q ≤ 10,000) denoting the number of nodes and queries respectively. The next line contains N integers Vi (0 ≤ Vi ≤ 231-1) denoting the value assigned to ith node. The next line contains N integers Pi (0 ≤ Pi < N) denoting the parent of ith node. Parent of node 0 will be 0. The next Q lines each contains two integers ki and Xi (1 ≤ ki ≤ sizeof-subtree; 0 ≤ Xi < N).
Output
For each test case, output "Case #X:" (without quotes) where X is the case number starting with 1. Answer each query of the cases in a separate line.
Dibawah ini adalah contoh implementasi yang dijelaskan
di blog Suhendry.
Implementasi dalam C/C++ bisa dilakukan tanpa menggunakan pointer.
Untuk membuat node baru, kita tinggal meminta index dari kumpulan node yang bebas.
Untuk menghapus node, kita tinggal kembalikan index dari node yang dihapus ke dalam kumpulan node bebas.
Catatan: implementasi dibawah ini bukan AVL tree, tetapi tree buatan saya sendiri :P.
Semua queries untuk sub-tree tertentu bisa dikumpulkan terlebih dahulu dan kemudian dijawab sekaligus saat kita membangun tree.
Solusi alternatif menggunakan Segment-tree dijelaskan di
blog Eko.
Solusi Segment-tree tersebut memerlukan O(N log N) space, sedangkan tree saya hanya membutuhkan O(N) space.
#include <stdio.h>
#include <vector>
using namespace std;
#define REP(i,n) for (int i=0,_n=n; i<_n; i++)
#define H(r) ((r)==-1? 0 : node[r].height)
#define S(r) ((r)==-1? 0 : node[r].size)
#define MAXN 200000 // there can be up to 2 trees of size 100000
struct Node {
int label; // this node label (acquired from the input).
int size; // the size of this subtree (leaf's size is 1).
int height; // the height of this node (leaf's height is 1).
int L, R; // the index of the left and right child of this node.
} node[MAXN];
vector<int> fnode; // free node indices (no pointers needed :)
void update(int r){ // update node r's attributes based on its children
Node &n = node[r];
n.size = S(n.L) + S(n.R) + 1;
n.height = 1 + max(H(n.L), H(n.R));
}
void add(int &root, int label){ // insert a new node with the specified label
if (root==-1){
root = fnode.back(); fnode.pop_back(); // take a free node
node[root] = (Node){ label, 1, 1, -1, -1 }; // fill in the new node
} else {
Node &n = node[root];
if (n.label == label) return; // label already exists, ignore add
if (label < n.label){
add(n.L, label);
if (H(n.L) > H(n.R)+1){ // rotate right
int t = node[n.L].R;
node[n.L].R = root, root = n.L, n.L = t;
update(node[root].R);
}
} else if (label > n.label){
add(n.R, label);
if (H(n.L)+1 < H(n.R)){ // rotate left
int t = node[n.R].L;
node[n.R].L = root, root = n.R, n.R = t;
update(node[root].L);
}
}
update(root);
}
}
int kth(int root, int k){
Node &n = node[root];
if (S(n.L) > k) return kth(n.L, k);
if (S(n.L) == k) return n.label;
return kth(n.R, k - S(n.L) - 1);
}
void addAll(int r, int &to){ // add all nodes in 'r' to 'to'
if (r == -1) return;
addAll(node[r].L, to);
addAll(node[r].R, to);
add(to, node[r].label);
}
void removeAll(int r){ // free all nodes in 'r'
if (r == -1) return;
removeAll(node[r].L);
removeAll(node[r].R);
fnode.push_back(r); // r is free, claim back the index
}
vector<int> con[MAXN], qk[MAXN], qi[MAXN];
int T,N,Q,L,a,b,k,x, ans[MAXN], label[MAXN];
int dfs(int x){
int root = -1; // new tree
REP(i,con[x].size()) if (x || con[x][i]){ // avoid 0's parent
int r = dfs(con[x][i]);
if (S(root) < S(r)) swap(root,r); // pick the largest tree as the root
addAll(r, root); // transfer r's nodes to root's
removeAll(r); // delete unused tree
}
add(root,label[x]); // post order insert
REP(i,qk[x].size()) // answer all queries for node x (this node)
ans[qi[x][i]] = kth(root, qk[x][i] - 1);
return root;
}
int main(){
REP(i,MAXN) fnode.push_back(i); // setup free indices
scanf("%d",&T);
REP(t,T){
scanf("%d %d",&N,&Q);
REP(i,N) con[i].clear(), qk[i].clear(), qi[i].clear(), scanf("%d",&label[i]);
REP(a,N) scanf("%d",&b), con[b].push_back(a);
REP(i,Q) scanf("%d %d",&k,&x), qk[x].push_back(k), qi[x].push_back(i);
int root = dfs(0); // traverse tree, and answer queries
removeAll(root); // delete tree
printf("Case #%d:\n",t+1);
REP(i,Q) printf("%d\n",ans[i]);
}
}
Silcat has N songs in her digital library. Each song is described as a sequence of M melodies. A melody is an integer with value between 0 and 1,000,000.
Everytime Silcat hear an interesting sequence of melodies of length 10, Silcat always asks Sucat whether she has a song in her library which contains that melodies. A sequence of melodies S exists in a song if the song has a continuous subsequence of melodies S. Silcat has ensured that any sequence of melodies of length 10 does not exist in more than one song in her library, and occurs only once in a song.
Since Sucat is busy with his work today, he asks you to create a program to answer all Silcat's questions.
Input
The first line begins with two integers N and Q (1 ≤ N ≤ 2,000; 1 ≤ Q ≤ 20,000) the number of songs in her digital library and the number of questions Silcat will ask consecutively. The next N lines each begins with an integer Mi (10 ≤ Mi ≤ 1,000) the number of melodies in ith song, followed by Mi integers denoting the sequence of melodies in ith song. The next Q lines each will contain 10 integers denoting the sequence of melodies S that is asked by Silcat.
Output
Answer each question in a line. If S can be found in a song, output two numbers, the song number that contains S and the starting position of the sequence S in the song (starting with 1). If S can not be found, output "not found" (without quote).
Soal ini saya buat karena ter-inspirasi oleh Shazam.
Shazam adalah suatu applikasi iPhone yang dapat mengenali lagu yang sedang dimainkan dengan cara merekam
10 detik di bagian manapun dari lagu yang sedang dimainkan.
Rekaman 10 detik tersebut kemudian dikirim ke server Shazam dan servernya akan memberitahu nama lagu tersebut.
Shazam memiliki 20 ribu lagu dan hanya membutuhkan beberapa milisecond untuk pencariannya.
Soal ini adalah versi simplenya dari masalah yang dihadapi Shazam dan tentunya dapat diselesaikan dengan cara yang sama
dengan Shazam, yaitu menggunakan hash table.
Hash table ini akan diisi dengan potongan-potongan 10 detik dari semua bagian dari semua lagu yang ada.
Sehingga, kalau kita memiliki query yang berisi 10 detik potongan lagu, kita dapat mencari (lookup) nama lagu tersebut
dan posisi dimulainya potongan tersebut dari dalam hash table dalam O(1) expected.
Linear probing mungkin adalah cara termudah yang dapat digunakan untuk mengatasi hash collisions dimana ada dua melodi mempunyai hash value yang sama. Saya sengaja membuat soal ini untuk hanya bisa solve menggunakan hash table buatan sendiri atau dengan meng-override HashMap (bagi pengguna Java). Mereka yang menggunakan STL-map akan mendapatkan TLE karena STL-map di-implementasi menggunakan Red-Black tree yang membutuhkan O(log N) operasi untuk mengakses elemen di dalamnya. Berikut adalah contoh implementasinya.
#include <stdio.h>
#include <assert.h>
#define REP(i,n) for (int i=0,_n=n; i<_n; i++)
#define HSIZE 3000001
#define IS_EMPTY(key) (e[key].song == -1)
#define QLEN 10
struct Entry { short song, pos; } e[HSIZE];
int songs[2001][1001], query[10], N,Q,S;
bool equal(int *a, int *b){
REP(i,QLEN) if (a[i]!=b[i]) return false;
return true;
}
int lookup(int *melody){
unsigned int H = 0; // the hash of the melody
REP(i,QLEN) H += (H*13) ^ melody[i]; // simple hash function
REP(i,HSIZE){
int key = (H + i) % HSIZE; // http://en.wikipedia.org/wiki/Linear_probing
if (IS_EMPTY(key)) return -key;
int *this_melody = songs[e[key].song] + e[key].pos;
if (equal(melody, this_melody)) return key;
}
assert(false); // hash table is full!
}
int main(){
REP(i,HSIZE) e[i].song = -1; // set hash table to empty
scanf("%d %d",&N,&Q);
REP(i,N){
scanf("%d",&S);
REP(j,S) scanf("%d",&songs[i][j]);
REP(j,S-QLEN+1){
int key = -lookup(songs[i]+j); // expected O(1)
assert(key >= 0); // should have no duplicate!
e[key] = (Entry){i,j}; // insert into hash table
}
}
REP(i,Q){
REP(j,QLEN) scanf("%d",&query[j]);
int key = lookup(query); // expected O(1)
if (key < 0) puts("not found");
else printf("%d %d\n", e[key].song+1, e[key].pos+1);
}
}
Given an undirected connected simple graph of N nodes and E edges. There are up to Q nodes selected from N nodes that are special nodes. Suppose that R selected edges are destroyed, your task is to calculate how many pairs of node A-B where A and B belong to special nodes, are disconnected (there is no path from A to B or vice versa after R edges are destroyed).
Input
The first line of input contains an integer T (1 ≤ T ≤ 50) the number of cases. Each case begins with four integers N, E, Q and R (1 ≤ Q ≤ N ≤ 50,000; 0 ≤ R ≤ E ≤ 200,000) denoting the number of nodes, edges, special nodes, and destroyed edges respectively. The nodes are numbered from 1 to N. The next E line each contains two integers Ai and Bi (1 ≤ Ai, Bi ≤ N) representing an edge connecting node A and node B. The next line contains Q integers Pi (1 ≤ Pi ≤ N) denoting the selected special nodes. The next line contains R integers Ti (1 ≤ Ti ≤ E) denoting the edges that are destroyed (the edges are numbered from 1 to E based on input order).
Output
For each case, output in a single line a number denoting the number of disconnected pair of special nodes.
There 5 pair of special nodes that are disconnected: 1-2, 1-3, 1-4, 2-3 and 2-4.
Explanation for the 2nd sample input
There is only one special node, so we can't have any pair of them.
Pembahasan Soal H - Disconnected Graph
Soal ini bisa disederhanakan dengan membuang semua edge yang dihancurkan.
Dari graph yang ada, kita cari ada berapa banyak node yang spesial dalam suatu
komponen yang terhubung.
Suatu komponen yang terhubung bisa dicari dengan DFS atau disjoint set.
Setelah kita mengetahui banyaknya node yang special di dalam komponen-komponen terhubung yang ada,
untuk menghitung banyaknya pair antara 2 special node yang berada di komponen berbeda
dapat dilakukan dengan mengalikan banyaknya special node yang ada di dalam komponen dengan
banyaknya special node yang ada di luar komponen.
Berikut adalah contoh implementasi menggunakan disjoint set.
#include <stdio.h>
#define REP(i,n) for (int i=0,_n=(n); i<_n; i++)
int T,N,E,Q,R,a,b,P[50010],pset[50010],ea[200010],eb[200010],D[200010];
int findSet(int i){ return (pset[i]==i)? i : (pset[i] = findSet(pset[i])); }
void merge(int i, int j){ pset[findSet(i)] = findSet(j); }
int sameSet(int i, int j){ return findSet(i)==findSet(j); }
int main(){
scanf("%d",&T);
while (T--){
scanf("%d %d %d %d",&N,&E,&Q,&R);
REP(i,N+1) pset[i] = i, P[i] = 0;
REP(i,E) scanf("%d %d",&ea[i],&eb[i]), D[i] = 0;
REP(i,Q) scanf("%d",&a), P[a] = 1;
REP(i,R) scanf("%d",&a), D[a-1] = 1;
REP(i,E) if (!D[i] && !sameSet(ea[i],eb[i])){
a = P[findSet(ea[i])]; // a = banyaknya special node di komponen ea[i]
b = P[findSet(eb[i])]; // b = banyaknya special node di komponen eb[i]
merge(ea[i],eb[i]); // gabung komponen ea[i] dengan eb[i]
P[findSet(ea[i])] = a+b; // banyaknya special node gabungan adalah a+b
}
long long res = 0;
REP(i,N){
a = findSet(i+1); // a = komponen dari node i
b = P[a]; // b = banyaknya special node di komponen a
res += (Q-b)*b; // (banyaknya special node di luar komponen a) * b
P[a] = 0; // komponen a telah diprocess
}
printf("%lld\n",res/2); // double counting
}
}
Given a matrix A of size N x M, write a program to find p1, p2, ..., pn to maximize A[1][p1] + A[2][p2] + ... + A[n][pn]. You are only allowed to change pi no more than K times (changes occur when pi is not equal to pi-1). You may choose p1 anywhere from 1 to M and it will not be counted as a change.
For example, given a matrix of 7 x 4 as shown below and K = 3.
The maximum sum that you can get is 8 + 10 + 7 + 3 + 9 + 20 + 15 = 72. But if you are only allowed to make changes at most one time (K = 1), then the maximum sum that you can get is 59.
Input
The first line of input contains an integer T (1 ≤ T ≤ 100) the number of cases. Each case begins with three integers N, M and K (1 ≤ N ≤ 100; 1 ≤ M ≤ 10; 0 ≤ K < N). The next N lines each contains M integers representing the given matrix. Each integer in the matrix is between 1 and 1,000 inclusive.
Output
For each case, output in a single line the maximum sum that you can get from the matrix.
States dari dynamic programming nya adalah dp[n][m][k] seperti yang dijelaskan di blog
Suhendry dan
Eko.
Dalam implementasinya, kita hanya membutuhkan value dari dua state terakhir: dp[i] dan dp[i-1].
Sehingga kita dapat menghemat memory.
Banyak yang bilang ini adalah "dp terbang" atau "dp on the fly".
Berikut adalah contoh implementasinya.
#include <stdio.h>
#define REP(i,n) for (int i=0,_n=n; i<_n; i++)
int T,N,M,K,X,dp[2][102][102];
int main(){
scanf("%d",&T);
while (T--){
scanf("%d %d %d",&N,&M,&K);
REP(i,N) REP(j,M){
int (*c)[102] = dp[i%2];
int (*p)[102] = dp[1-(i%2)];
scanf("%d",&X);
if (i==0){
REP(k,K+1) c[j][k] = 0;
c[j][0] = X;
} else {
REP(k,K+1) c[j][k] = p[j][k] + X;
REP(k,K+1) REP(m,M)
c[j][k+(j==m?0:1)] >?= p[m][k] + X;
}
}
int res = 0;
REP(i,M) REP(j,K+1) res >?= dp[1-N%2][i][j];
printf("%d\n",res);
}
}
Rank
Team Name
Solved
Time
A
B
C
D
E
F
G
H
I
Total att/solv
1
Dongskar Pedongi II Institut Teknologi Bandung
9
1348
1/6
1/25
1/26
10/269
1/94
2/295
8/260
1/23
1/10
26/9
2
Eleazar University of Indonesia
8
876
1/5
1/54
1/10
5/183
1/72
2/--
1/146
4/193
2/53
18/8
3
Hope BINUS University
8
969
1/3
1/25
1/22
5/204
1/256
0/--
3/274
1/51
1/14
14/8
4
TePeBe Institut Teknologi Bandung
7
429
1/5
1/14
1/36
2/62
0/--
0/--
2/162
1/86
1/24
9/7
5
Saklar Lhompat University of Indonesia
6
233
1/9
1/25
1/7
6/--
1/75
1/--
6/--
3/52
1/25
21/6
6
lolypop STMIK Mikroskil
6
512
1/7
1/41
1/21
3/149
0/--
0/--
1/--
3/181
1/33
11/6
7
Faith BINUS University
6
588
1/5
1/72
1/19
9/--
1/281
0/--
0/--
4/113
2/18
19/6
8
TC Pacifista Institut Teknologi Sepuluh Nopember
6
705
1/6
1/54
1/20
1/--
4/182
0/--
2/--
3/113
2/210
15/6
9
H2S BINUS University
6
761
1/6
2/116
1/28
8/--
2/259
0/--
1/--
2/229
1/63
18/6
10
Deadlock BINUS University
5
393
1/33
1/58
1/43
2/--
1/160
0/--
0/--
11/--
1/99
18/5
11
ein Gadjah Mada University
5
405
1/5
1/55
1/19
2/--
5/174
0/--
1/--
6/--
1/72
18/5
12
ITT Vida Institut Teknologi Telkom
5
856
2/34
2/103
1/10
2/--
2/209
0/--
0/--
9/280
3/--
21/5
13
playfunfun BINUS University
4
319
2/35
2/92
2/10
1/--
0/--
0/--
0/--
8/--
1/122
16/4
14
Law Let Me AC BINUS University
4
332
1/18
6/147
1/27
1/--
0/--
0/--
0/--
8/--
1/40
18/4
15
wFa2.0 University of Indonesia
4
354
1/17
1/209
1/17
8/--
0/--
0/--
0/--
0/--
2/91
13/4
16
Autovajin Institut Teknologi Sepuluh Nopember
4
384
3/101
3/118
1/42
5/--
1/--
1/--
0/--
2/--
1/43
17/4
17
Coding's Angels University of Indonesia
4
423
1/18
2/125
1/48
1/--
0/--
0/--
0/--
0/--
1/212
6/4
18
KueKiaTheng BINUS University
4
446
1/16
2/163
2/103
1/--
0/--
1/--
0/--
3/--
1/124
11/4
19
ITT Guntur Institut Teknologi Telkom
4
520
2/74
1/119
1/53
1/--
1/254
0/--
0/--
0/--
0/--
6/4
20
inspanning Parahyangan University
4
531
1/52
3/184
1/22
1/--
0/--
1/--
1/--
1/--
4/173
13/4
21
ITT SOS Brigade Institut Teknologi Telkom
4
537
2/78
2/115
1/33
0/--
3/231
0/--
0/--
0/--
2/--
10/4
22
Padawan Institut Teknologi Sepuluh Nopember
4
539
2/42
3/130
1/10
1/--
2/277
0/--
2/--
0/--
0/--
11/4
23
ITT LUCKY Institut Teknologi Telkom
4
651
2/84
2/251
1/31
7/--
1/245
0/--
0/--
0/--
0/--
13/4
24
Ditolak jadi asdos programming University of Indonesia
4
789
8/172
2/163
1/100
2/--
0/--
0/--
0/--
0/--
1/194
14/4
25
ITT DividedByZero Institut Teknologi Telkom
4
932
4/280
1/244
1/19
3/--
6/229
0/--
4/--
0/--
0/--
19/4
26
ITT VCIOUS Institut Teknologi Telkom
4
1022
4/276
3/284
1/15
1/--
4/287
0/--
2/--
0/--
0/--
15/4
27
kulikoding Universitas Pelita Harapan
3
136
2/37
2/39
1/20
1/--
1/--
1/--
2/--
2/--
2/--
14/3
28
Joglosemar Institut Teknologi Bandung
3
148
1/73
1/30
1/45
2/--
0/--
0/--
0/--
0/--
3/--
8/3
29
ShadowEvil Sekolah Tinggi Teknik Surabaya
3
150
1/50
1/49
2/31
23/--
0/--
1/--
7/--
13/--
4/--
52/3
30
Nerd Sekolah Tinggi Teknik Surabaya
3
165
1/53
1/79
1/33
0/--
0/--
0/--
0/--
0/--
0/--
3/3
31
Numpang Ngoding University of Indonesia
3
182
1/33
2/88
1/41
3/--
0/--
0/--
0/--
0/--
0/--
7/3
32
Satijan University of Indonesia
3
184
1/13
2/109
1/42
3/--
0/--
0/--
1/--
0/--
0/--
8/3
33
CrossEdge Sekolah Tinggi Teknik Surabaya
3
196
1/110
1/51
1/35
0/--
0/--
0/--
0/--
0/--
0/--
3/3
34
Sphinx BINUS University
3
197
1/34
0/--
1/45
6/--
0/--
0/--
0/--
0/--
1/118
9/3
35
PlugNPlay Sekolah Tinggi Teknik Surabaya
3
199
2/76
1/80
1/23
0/--
0/--
4/--
6/--
3/--
0/--
17/3
36
yoonA Petra Christian University
3
204
1/46
3/97
1/21
2/--
2/--
0/--
0/--
2/--
1/--
12/3
37
TheLastCodeBlender University of Surabaya
3
220
1/25
4/85
1/50
2/--
0/--
0/--
5/--
0/--
3/--
16/3
38
DnD Parahyangan University
3
223
1/83
1/127
1/13
7/--
0/--
0/--
1/--
3/--
1/--
15/3
39
Legendroid Parahyangan University
3
238
1/74
1/103
2/41
1/--
0/--
0/--
0/--
0/--
4/--
9/3
40
almostGraduate University of Indonesia
3
240
5/62
1/69
1/29
1/--
0/--
0/--
0/--
5/--
0/--
13/3
41
HantuPuskom University of Sumatera Utara
3
283
1/34
0/--
1/56
5/--
1/193
0/--
1/--
0/--
0/--
9/3
42
10-2 Binus University
3
295
1/42
2/130
3/63
0/--
0/--
0/--
4/--
0/--
1/--
11/3
43
numpang_Makan University of Indonesia
3
310
3/92
1/142
1/36
5/--
0/--
0/--
4/--
0/--
0/--
14/3
44
JoRoGe Petra Christian University
3
315
2/40
4/163
1/32
4/--
0/--
0/--
5/--
6/--
0/--
22/3
45
HantuPuskom.Jr University of Sumatera Utara
3
318
1/30
3/--
1/44
1/--
4/184
0/--
1/--
0/--
0/--
11/3
46
Tpl08 University of Sumatera Utara
3
320
1/38
0/--
1/53
0/--
2/209
0/--
0/--
0/--
0/--
4/3
47
pssst... University of Sumatera Utara
3
343
1/44
5/166
2/33
0/--
0/--
0/--
0/--
0/--
0/--
8/3
48
kode racun University of Sumatera Utara
3
348
1/46
3/200
3/22
7/--
0/--
0/--
0/--
0/--
0/--
14/3
49
TouchEvent Sekolah Tinggi Teknik Surabaya
3
367
2/89
3/94
3/84
1/--
0/--
0/--
1/--
1/--
0/--
11/3
50
kulikodingHy Universitas Pelita Harapan
3
421
3/171
4/134
1/16
2/--
5/--
0/--
0/--
0/--
0/--
15/3
51
MCU_Bless Maranatha Christian University
3
425
1/37
6/261
1/27
1/--
4/--
0/--
0/--
0/--
8/--
21/3
52
winner Institut Teknologi Sepuluh Nopember
3
432
2/92
1/257
1/63
3/--
1/--
0/--
0/--
2/--
0/--
10/3
53
saigoNoChansu University of Indonesia
3
441
3/208
3/122
1/31
9/--
0/--
0/--
0/--
0/--
0/--
16/3
54
An-nahl University of Indonesia
3
448
4/200
1/115
1/73
4/--
0/--
0/--
0/--
0/--
0/--
10/3
55
kulikodingJr Universitas Pelita Harapan
3
448
1/185
2/156
1/87
3/--
0/--
0/--
0/--
0/--
0/--
7/3
56
moonlight University of Surabaya
3
456
1/90
4/262
1/44
1/--
0/--
0/--
1/--
0/--
0/--
8/3
57
zwei Gadjah Mada University
3
458
2/103
3/214
1/81
0/--
0/--
0/--
0/--
0/--
0/--
6/3
58
leciKW! Petra Christian University
3
459
4/188
2/142
2/29
3/--
2/--
0/--
7/--
2/--
3/--
25/3
59
Unduh University of Indonesia
3
472
4/212
1/118
2/62
0/--
1/--
0/--
1/--
4/--
0/--
13/3
60
namespace Satya Wacana Christian University
3
473
1/24
7/297
1/32
5/--
0/--
0/--
1/--
0/--
0/--
15/3
61
BLINK Institut Bisnis Dan Informatika Indonesia
3
508
3/135
3/221
1/72
5/--
0/--
0/--
4/--
0/--
0/--
16/3
62
c0123 BINUS University
3
513
1/149
4/149
4/95
1/--
0/--
0/--
0/--
0/--
1/--
11/3
63
runtime error Institut Teknologi Bandung
3
609
4/194
1/180
1/175
0/--
0/--
1/--
0/--
0/--
0/--
7/3
64
Binary Beats Institut Teknologi Bandung
3
613
2/297
1/23
5/193
2/--
0/--
0/--
0/--
0/--
0/--
10/3
65
HSBC University of Surabaya
3
648
2/252
1/297
1/79
1/--
0/--
0/--
0/--
0/--
0/--
5/3
66
happy3friends Petra Christian University
3
653
9/191
1/135
3/127
15/--
6/--
0/--
0/--
0/--
0/--
34/3
67
ITT Hysteria Institut Teknologi Telkom
3
703
2/243
1/248
2/172
8/--
2/--
0/--
0/--
0/--
0/--
15/3
68
newGen Satya Wacana Christian University
3
777
6/297
4/278
1/42
4/--
0/--
0/--
4/--
0/--
0/--
19/3
69
AD-Kodingan University of Indonesia
3
869
8/284
3/246
4/99
0/--
0/--
3/--
5/--
0/--
0/--
23/3
70
Fivian Petra Christian University
3
885
12/281
2/269
2/75
7/--
0/--
0/--
7/--
0/--
0/--
30/3
71
Cisituers Institut Teknologi Bandung
2
48
1/31
5/--
1/17
0/--
0/--
0/--
0/--
1/--
0/--
8/2
72
Big-O BINUS University
2
71
1/31
0/--
1/40
0/--
0/--
0/--
0/--
0/--
1/--
3/2
73
STMIKSBY2 STMIK Surabaya
2
107
1/50
4/--
1/57
4/--
0/--
0/--
0/--
0/--
0/--
10/2
74
Underdog Ciputra University
2
114
1/55
5/--
2/39
3/--
0/--
0/--
3/--
0/--
0/--
14/2
75
Invisible Ciputra University
2
116
1/62
0/--
1/54
8/--
3/--
0/--
0/--
0/--
0/--
13/2
76
Masih Muda Ciputra University
2
124
1/65
0/--
1/59
0/--
0/--
0/--
1/--
0/--
0/--
3/2
77
Nehemiaz Ciputra University
2
143
2/63
0/--
1/60
4/--
0/--
0/--
0/--
0/--
0/--
7/2
78
Babak Belur Ciputra University
2
158
1/105
3/--
1/53
4/--
0/--
0/--
4/--
0/--
0/--
13/2
79
Wish Accepted University of Surabaya
2
166
1/39
2/--
3/87
0/--
0/--
0/--
2/--
0/--
0/--
8/2
80
Emil ia Kontesa Ciputra University
2
167
1/77
0/--
2/70
4/--
0/--
0/--
2/--
0/--
0/--
9/2
81
Team X BINUS University
2
173
1/30
5/--
3/103
2/--
0/--
0/--
4/--
0/--
1/--
16/2
82
Indosmart BINUS University
2
197
1/73
0/--
1/124
0/--
0/--
0/--
0/--
0/--
0/--
2/2
83
koach Institut Teknologi Sepuluh Nopember
2
197
5/--
1/133
2/44
1/--
0/--
0/--
0/--
0/--
0/--
9/2
84
ModuloDiv BINUS University (International)
2
201
1/121
0/--
1/80
6/--
0/--
0/--
2/--
0/--
0/--
10/2
85
Timun Ciputra University
2
213
1/99
0/--
2/94
0/--
0/--
0/--
0/--
0/--
0/--
3/2
86
Terong Ciputra University
2
243
2/104
0/--
2/99
0/--
0/--
0/--
0/--
0/--
0/--
4/2
87
null Gadjah Mada University
2
247
2/154
1/--
1/73
4/--
1/--
0/--
2/--
0/--
0/--
11/2
88
NaDI UPM Paramadina University
2
248
1/194
1/--
1/54
2/--
0/--
0/--
0/--
0/--
0/--
5/2
89
D'Bodors Widyatama University
2
250
1/130
3/--
1/120
2/--
0/--
0/--
0/--
0/--
0/--
7/2
90
doaEmak Widyatama University
2
253
1/139
1/--
1/114
7/--
10/--
0/--
0/--
0/--
0/--
20/2
91
Infinite Ciputra University
2
308
1/137
0/--
2/151
4/--
3/--
0/--
0/--
0/--
1/--
11/2
92
UAJY_Meister Universitas Atma Jaya Yogyakarta
2
314
5/130
0/--
3/64
2/--
2/--
0/--
0/--
0/--
0/--
12/2
93
MangaFreax Widyatama University
2
328
3/169
0/--
2/99
2/--
1/--
0/--
0/--
0/--
0/--
8/2
94
MCU_Grace Maranatha Christian University
2
349
6/--
2/254
1/75
1/--
0/--
0/--
0/--
0/--
0/--
10/2
95
Tegg Institut Teknologi Sepuluh Nopember
2
359
1/71
3/248
3/--
2/--
0/--
0/--
0/--
0/--
0/--
9/2
96
MCU_Hope Maranatha Christian University
2
369
4/268
3/--
1/41
2/--
0/--
0/--
0/--
0/--
0/--
10/2
97
Integrated2010 Institut Teknologi Sepuluh Nopember
2
372
1/118
0/--
3/214
1/--
0/--
0/--
0/--
0/--
0/--
5/2
98
sion Widyatama University
2
390
1/192
0/--
2/178
1/--
0/--
0/--
0/--
0/--
0/--
4/2
99
STMIKSBY1 STMIK Surabaya
2
399
4/275
1/--
1/64
0/--
0/--
0/--
0/--
0/--
0/--
6/2
100
petagman STMIK Mikroskil
2
401
4/240
0/--
1/101
0/--
0/--
0/--
0/--
0/--
0/--
5/2
101
Guts BINUS University
2
406
1/268
5/58
8/--
1/--
0/--
0/--
0/--
0/--
0/--
15/2
102
STMIKSBY3 STMIK Surabaya
2
436
5/276
1/--
1/80
0/--
0/--
0/--
7/--
0/--
0/--
14/2
103
STMIKSBY5 STMIK Surabaya
2
436
6/271
9/--
1/65
0/--
0/--
0/--
1/--
0/--
0/--
17/2
104
MCU_Joy Maranatha Christian University
2
444
6/290
0/--
1/54
0/--
0/--
0/--
0/--
0/--
0/--
7/2
105
RES University of Surabaya
2
462
2/254
11/--
2/168
3/--
0/--
0/--
0/--
0/--
0/--
18/2
106
the one University of Surabaya
2
487
3/228
2/--
5/139
1/--
0/--
0/--
1/--
0/--
0/--
12/2
107
Garuda BINUS University
2
556
4/193
1/--
7/183
9/--
0/--
0/--
0/--
0/--
0/--
21/2
108
STMIKSBY6 STMIK Surabaya
2
607
14/281
0/--
1/66
2/--
0/--
0/--
2/--
0/--
0/--
19/2
109
Ace Petra Christian University
2
631
8/--
1/245
10/206
8/--
0/--
0/--
1/--
0/--
0/--
28/2
110
G.S.Chrome Sekolah Tinggi Teknik Surabaya
2
668
7/236
3/--
7/192
2/--
0/--
0/--
1/--
0/--
0/--
20/2
111
code warriors University of Surabaya
2
697
4/261
0/--
6/276
0/--
0/--
0/--
0/--
0/--
0/--
10/2
112
Rogue Binus University
1
43
4/--
0/--
1/43
2/--
0/--
0/--
0/--
0/--
0/--
7/1
113
Kamen Programmer H2S Petra Christian University
1
48
0/--
6/--
1/48
4/--
10/--
0/--
0/--
0/--
0/--
21/1
114
chi square Sekolah Tinggi Ilmu Statistik
1
60
1/60
0/--
1/--
2/--
0/--
0/--
0/--
0/--
0/--
4/1
115
Tempe Institut Teknologi Sepuluh Nopember
1
66
0/--
0/--
1/66
0/--
0/--
0/--
4/--
0/--
0/--
5/1
116
kolgomorov-smirnov Sekolah Tinggi Ilmu Statistik
1
67
1/67
0/--
0/--
1/--
0/--
0/--
1/--
0/--
0/--
3/1
117
varians Sekolah Tinggi Ilmu Statistik
1
70
1/70
0/--
1/--
0/--
0/--
0/--
0/--
0/--
0/--
2/1
118
MCU_Faith Maranatha Christian University
1
71
0/--
4/--
2/51
2/--
0/--
0/--
0/--
0/--
0/--
8/1
119
STMIKSBY4 STMIK Surabaya
1
71
0/--
1/--
1/71
0/--
0/--
0/--
0/--
0/--
0/--
2/1
120
binom Sekolah Tinggi Ilmu Statistik
1
76
1/76
0/--
0/--
1/--
0/--
0/--
0/--
0/--
1/--
3/1
121
fti-uksw-1 Satya Wacana Christian University
1
89
1/--
1/--
1/89
1/--
1/--
1/--
3/--
0/--
1/--
10/1
122
fti-uksw-2 Satya Wacana Christian University
1
93
1/--
1/--
1/93
3/--
1/--
1/--
1/--
2/--
1/--
12/1
123
fti-uksw-3 Satya Wacana Christian University
1
102
0/--
2/--
2/82
2/--
0/--
0/--
0/--
0/--
0/--
6/1
124
BrainPlusPlus State Islamic University Jakarta
1
103
0/--
0/--
1/103
0/--
0/--
0/--
1/--
0/--
0/--
2/1
125
seven Widyatama University
1
116
0/--
0/--
1/116
3/--
0/--
0/--
0/--
0/--
0/--
4/1
126
Cavalieurs Widyatama University
1
119
1/--
0/--
1/119
0/--
0/--
0/--
0/--
0/--
0/--
2/1
127
HexaDec BINUS University
1
121
8/--
4/--
1/121
1/--
0/--
0/--
2/--
0/--
0/--
16/1
128
nyengir Widyatama University
1
126
0/--
0/--
1/126
0/--
0/--
0/--
0/--
0/--
0/--
1/1
129
Cyclopes Binus University (International)
1
129
0/--
0/--
1/129
2/--
0/--
0/--
0/--
0/--
0/--
3/1
130
IF-UPT2010 Universitas Komputer Indonesia
1
132
1/--
0/--
3/92
3/--
0/--
0/--
0/--
0/--
0/--
7/1
131
Madara BINUS University
1
142
0/--
0/--
1/142
0/--
0/--
0/--
0/--
0/--
0/--
1/1
132
IDR Yarsi University
1
151
0/--
0/--
2/131
0/--
0/--
0/--
0/--
0/--
0/--
2/1
133
zeromind State Islamic University Jakarta
1
153
0/--
0/--
1/153
2/--
0/--
0/--
0/--
0/--
0/--
3/1
134
QuadPro BINUS University (International)
1
159
4/--
2/--
1/159
1/--
0/--
0/--
0/--
0/--
0/--
8/1
135
injury time Binus University
1
162
2/--
0/--
4/102
1/--
0/--
0/--
0/--
0/--
1/--
8/1
136
Trunojoyo C++ Universitas Trunojoyo Madura
1
184
0/--
0/--
2/164
4/--
0/--
0/--
8/--
0/--
0/--
14/1
137
DeathByComputer State Islamic University Jakarta
1
185
0/--
0/--
1/185
0/--
0/--
0/--
0/--
0/--
0/--
1/1
138
drei Gadjah Mada University
1
215
2/195
0/--
6/--
1/--
0/--
0/--
0/--
0/--
0/--
9/1
139
IBII 2009 Institut Bisnis Dan Informatika Indonesia