cs3233 competitive progggramming · 2012-09-06 · cs3233 ‐competitive programming, steven halim,...

35
This course material is now made available for public usage. Special acknowledgement to School of Computing, National University of Singapore for allowing Steven to prepare and distribute these teaching materials. CS3233 CS3233 Competitive Programming Dr. Steven Halim Dr. Steven Halim Week 02 – Data Structures & Libraries Focus on Bit Manipulation & Binary Indexed Tree CS3233 Competitive Programming, Steven Halim, SoC, NUS

Upload: others

Post on 31-Mar-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

This course material is now made available for public usage.Special acknowledgement to School of Computing, National University of Singapore

for allowing Steven to prepare and distribute these teaching materials.

CS3233CS3233Competitive Programmingp g g

Dr. Steven HalimDr. Steven Halim

Week 02 – Data Structures & Libraries

Focus on Bit Manipulation & Binary Indexed Tree

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 2: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

OutlineOutline

/• Mini Contest 1 + Break (discussion of A/B)

• Some Admins

• Data Structures With Built‐in Libraries– Just a quick walkthrough

• Read/experiment with the details on your own• Read/experiment with the details on your own

– Linear Data Structures (CS1010/1st half of CS2020)

– Non Linear Data Structures (CS2010/2nd half of CS2020)( )• Focus on the red highlights

• “Top Coder” Coding Style (overview) + Break

• Data Structures With Our‐Own Libraries– Focus on Binary Indexed (Fenwick) Tree

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 3: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Basic knowledge that all ICPC/IOI‐ers must have!

LINEAR DATA STRUCTURESBasic knowledge that all ICPC/IOI ers must have!

WITH BUILT‐IN LIBRARIES

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 4: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

I amI am…

1. A pure C coder

2. A pure C++ coder2. A pure C++ coder

3. A mix between C/C dC/C++ coder

4. A pure Java coderp

5. A multilingual d C/C++/J

0 0 000

coder: C/C++/Java

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

1 2 3 4 50 of 120

Page 5: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Linear DS + Built In Libraries (1)Linear DS + Built‐In Libraries (1)

1. Static Array, built‐in support in C/C++/Java

2. Resize‐able: C++ STL vector, Java Vector2. Resize able: C++ STL vector, Java Vector– Both are very useful in ICPCs/IOIs

• There are 2 very common operations on Array:There are 2 very common operations on Array:– Sorting

S hi– Searching

– Let’s take a look at efficient ways to do them

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 6: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Two “fundamental” CS problems

SORTING + SEARCHINGTwo  fundamental  CS problems

INVOLVING ARRAY

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 7: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Sorting (1)Sorting (1)

• Definition:– Given unsorted stuffs, sort them… *,

• Popular Sorting AlgorithmsO( 2) l i h B bbl /S l i /I i S– O(n2) algorithms: Bubble/Selection/Insertion Sort

– O(n log n) algorithms: Merge/Quick^/Heap Sort

– Special purpose: Counting/Radix/Bucket Sort

• Reference:• Reference:– http://en.wikipedia.org/wiki/Sorting_algorithm

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 8: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Sorting (2)Sorting (2)

• In ICPC, you can “forget” all these…– In general, if you need to sort something…,g , y g ,just use the O(n log n) sorting library:

• C++ STL algorithm:: sortC  STL algorithm:: sort

• Java Collections.sort

• In ICPC sorting is either used as preliminary step• In ICPC, sorting is either used as preliminary stepfor more complex algorithm or to beautify output

Familiarity with sorting libraries is a must!– Familiarity with sorting libraries is a must!

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 9: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Sorting (3)Sorting (3)

• Sorting routines in C++ STL algorithm– sort – a bug‐free implementation of introsort*g p

• Fast, it runs in O(n log n)

• Can sort basic data types (ints, doubles, chars), AbstractCan sort basic data types (ints, doubles, chars), Abstract Data Types (C++ class), multi‐field sorting (≥ 2 criteria)

– partial sort – implementation of heapsortpartial_sort  implementation of heapsort• Can do O(k log n) sorting, if we just need top‐k sorted!

stable sort– stable_sort • If you need to have the sorting ‘stable’, keys with same values appear in the same order as in inputvalues appear in the same order as in input

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 10: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Searching in ArraySearching in Array

• Two variants:– When the array is sorted versus not sortedy

• Must do O(n) linear scan if not sorted ‐ trivial

( )• Can use O(log n) binary search when sorted– PS: must run an O(n log n) sorting algorithm once( g ) g g

• Binary search is ‘tricky’ to code!I t d C STL l ith l b d– Instead, use C++ STL algorithm::lower_bound

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 11: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Linear DS + Built In Libraries (2)Linear DS + Built‐In Libraries (2)

3. Array of Boolean: C++ STL bitset– Faster than array of bools or vector<bool>!y

– No specific API in Java that is similar to this

4 Bit k4. Bitmask– a.k.a. lightweight set of Boolean or bit string

– Explanation via:http://www.comp.nus.edu.sg/~stevenha/visualization/bitmask.html

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 12: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Linear DS + Built In Libraries (3)Linear DS + Built‐In Libraries (3)

5. Linked List, C++ STL list, Java LinkedList– Usually not used in ICPCs/IOIsy /

– If you need a resizeable “list”, just use vector!

6 St k C STL t k J St k6. Stack, C++ STL stack, Java Stack– Used by default in Recursion, Postfix Calculation, Bracket Matching, etc

7. Queue, C++ STL queue, Java Queue7. Queue, C  STL queue, Java Queue– Used in Breadth First Search, Topological Sort, etc

PS D d i ‘Slidi Wi d ’ l ith– PS: Deque, used in ‘Sliding Window’ algorithmCS3233 ‐ Competitive Programming,

Steven Halim, SoC, NUS

Page 13: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

More efficient data structures

NON‐LINEAR DATA STRUCTURESMore efficient data structures

WITH BUILT‐IN LIBRARIES

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 14: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Binary Search Tree (1)Binary Search Tree (1)

• ADT Table (key  data)• Binary Search Tree (BST)Binary Search Tree (BST)

– Advertised O(log n) for insert, search, and delete

R i h BST b b l d!– Requirement: the BST must be balanced!• AVL tree, Red‐Black Tree, etc… *argh*

• Fret not, just use: C++ STL map (Java TreeMap)– UVa 10226 (Hardwood Species)*UVa 10226 (Hardwood Species)

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 15: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Binary Search Tree (2)Binary Search Tree (2)

• ADT Table (key exists or not)

• Set (Single Set)Set (Single Set)– C++ STL set, similar to C++ STL map

t (k d t ) i• map stores a (key, data) pair

• set stores just the key

– In Java: TreeSet

• Example:p– UVa 11849 – CD

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 16: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

HeapHeap

• Heap– C++ STL algorithm has some heap algorithmsg p g

• partial_sort uses heapsort

– C++ STL priority queue (Java PriorityQueue) is heapC++ STL priority_queue (Java PriorityQueue) is heap• Prim’s and Dijkstra’s algorithms use priority queue

B t l h bl i ICPC• But, we rarely see pure heap problems in ICPC

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 17: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Hash TableHash Table

• Hash Table– Advertised O(1) for insert, search, and delete, but:( ) , , ,

• The hash function must be good!

• There is no Hash Table in C++ STL ( in Java API)There is no Hash Table in C++ STL ( in Java API)

– Nevertheless, O(log n) using map is usually ok

Di t Add i T bl (DAT)• Direct Addressing Table (DAT)– Rather than hashing, we more frequently use DAT

– UVa 11340 (Newspaper)

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 18: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Top Coder Coding Style

SUPPLEMENTARYTop Coder Coding Style

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 19: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Top Coder Coding Style (1)Top Coder Coding Style (1)

• You may want to follow this coding style (C++)

1. Include important headers1. Include important headers – #include <algorithm>– #include <cmath>– #include <cstdio>

Want More?

#include cstdio– #include <cstring>– #include <iostream>– #include <map>

Add libraries that you frequently use into this template, e.g.:

t h– #include <queue>– #include <set>– #include <string>

#i l d < t >

ctype.hbitset

etc– #include <vector>– using namespace std;

etc

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 20: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Top Coder Coding Style (2)Top Coder Coding Style (2)

2. Use shortcuts for common data types– typedef long long ll;– typedef vector<int> vi;typedef vector<int> vi;– typedef pair<int, int> ii;– typedef vector<ii> vii;

3 Si lif R titi /L !3. Simplify Repetitions/Loops!– #define REP(i, a, b) for (int i = int(a); i <= int(b); i++)– #define REPN(i, n) REP (i, 1, int(n))– #define REPD(i, a, b) for (int i = int(a); i >= int(b); i--)– #define TRvi(c, it) \

for (vi::iterator it = (c).begin(); it != (c).end(); it++)– #define TRvii(c it) \#define TRvii(c, it) \

for (vii::iterator it = (c).begin(); it != (c).end(); it++)

Define your own loops

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

style and stick with it!

Page 21: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Top Coder Coding Style (3)Top Coder Coding Style (3)

4. More shortcuts– for (i = ans = 0; i < n; i++)… // do variable assignment in for loop– while (scanf("%d", n), n) { // read input + do value test togetherwhile (scanf( %d , n), n) { … // read input + do value test together– while (scanf("%d", n) != EOF) { … // read input and do EOF test

5. STL/Libraries all the way!/ y– isalpha (ctype.h)

• inline bool isletter(char c) {return (c>='A'&&c<='Z')||(c>='a'&&c<='z'); }

– abs (math.h)• inline int abs(int a) { return a >= 0 ? a : -a; }

– pow (math.h)• int power(int a int b) {int power(int a, int b) {

int res=1; for (; b>=1; b--) res*=a; return res; }

– Use STL data structures: vector, stack, queue, priority_queue, map, set, etc

– Use STL algorithms: sort, lower bound, max, min, max element, next permutation, etcg , _ , , , _ , _p ,

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 22: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Top Coder Coding Style (4)Top Coder Coding Style (4)

6. Use I/O Redirection– int main() {– // freopen("input.txt", "r", stdin); // don't retype test cases!// freopen( input.txt , r , stdin); // don t retype test cases!– // freopen("output.txt", "w", stdout);– scanf and printf as per normal; // I prefer scanf/printf than

// cin/cout, C style is much easier

7. Use memset/assign/constructor effectively!– memset(dist, 127, sizeof(dist));

// useful to initialize shortest path distances, set INF to 127!– memset(dp_memo, -1, sizeof(dp_memo));

// useful to initialize DP memoization table– memset(arr, 0, sizeof(arr)); // useful to clear array of integers( , , ( )); // y g– vector<int> dist(v, 2000000000);– dist.assign(v, -1);

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 23: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Top Coder Coding Style (5)Top Coder Coding Style (5)

8. Declare (large) static DS as global variable– All input size is known, declare data structure size LARGER than needed to avoid silly bugs

Avoid dynamic data structures that involve pointers etc– Avoid dynamic data structures that involve pointers, etc

– Use global variable to reduce “stack size” issue

• Now our coding tasks are much simpler • Typing less code = shorter coding time• Typing less code = shorter coding time= better rank in programming contests 

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 24: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Quick CheckQuick Check

1. I can cope with this pace…p

2. I am lost with so many newmany new information in the 

fpast few slides

00

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

1 20 of 120

Page 25: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

5 Minutes Break5 Minutes Break

• One data structures without built‐in libraries will be discussed in the last part…p– Binary Indexed (Fenwick) Tree

Graph Union Find Disjoint Sets and Segment Tree– Graph, Union‐Find Disjoint Sets, and Segment Tree are not discussed in this year’s CS3233 Week02

G h DS i d i d t il i CS2010/CS2020• Graph DS is covered in details in CS2010/CS2020

• UFDS is covered briefly in CS2010/CS2020

Pl t d S t T• Please study Segment Tree on your own– We try not set any contest problem involving Segment Tree

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Time Check:8.30pm

Page 26: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Graph (not discussed today, revisited in Week05/08)

U i Fi d Di j i t S t ( t di d t d d Ch2 )Union‐Find Disjoint Sets (not discussed today, read Ch2 on your own)

Segment Tree (not discussed today, read Ch2 on your own)

Fenwick Tree (discussed today)

DATA STRUCTURESFenwick Tree (discussed today)

WITHOUT BUILT‐IN LIBRARIES

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

Page 27: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (1)Fenwick Tree (1)

• Cumulative Frequency Table– Example, s = {2,4,5,5,6,6,6,7,7,8} (already sorted)

Index/Score/Symbol Frequency Cumulative Frequency

0 0 0

1 0 0

2 1 1

3 0 13 0 1

4 1 2

5 2 4

6 3 7

7 2 9

8 1 10

Page 28: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (2)Fenwick Tree (2)

• Fenwick Tree (inventor = Peter M. Fenwick)– Also known as “Binary Indexed Tree”, very aptly named

– Implemented as an array, let call the array name as ft• Each index of ft is responsible for certain range (see diagram)

Key/Index Binary Range F CF FT

0 0000 N/A N/A N/A N/A

1 0001 1 0 0 0 Do you notice2 0010 1..2 1 1 1

3 0011 3 0 1 0

4 0100 1..4 1 2 2

any particular pattern?

5 0101 5 2 4 2

6 0110 5..6 3 7 5

7 0111 7 2 9 27 0111 7 2 9 2

8 1000 1..8 1 10 10

9 1001 9 0 10 0

Page 29: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (3)Fenwick Tree (3)

h l f f d– To get the cumulative frequency from index 1 to b,use ft_rsq(ft,b)

• The answer is the sum of sub frequencies stored in array ft with• The answer is the sum of sub‐frequencies stored in array ft with indices related to b via this formula b' = b - LSOne(b)

– Recall that LSOne(b) = b & (-b)» That is, strip the least significant bit of b

• Apply this formula iteratively until b is 0– Example: ft rsq(ft, 6)A l i Example: ft_rsq(ft, 6)

» b = 6 = 0110, b’ = b ‐ LSOne(b) = 0110 ‐ 0010, b' = 4 = 0100

» b' = 4 = 0100, b’’ = b’ ‐ LSOne(b’) = 0100 ‐ 0100, b'' = 0, stop

Sum ft[6] + ft[4] = 5 + 2 = 7

Analysis:This isO(log n)

– Sum ft[6] + ft[4] = 5 + 2 = 7(see the blue areathat covers range[1 4] + [5 6] = [1 6])

Why?

[1..4] + [5..6] = [1..6])

Page 30: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (4)Fenwick Tree (4)

h l f f d– To get the cumulative frequency from index a to b,use ft_rsq(ft,a, b)

• If a is not one we can use:• If a is not one, we can use:ft_rsq(ft, b) – ft_rsq(ft, a - 1)to get the answer

– Example: ft_rsq(ft, 3, 6) =ft_rsq(ft, 6) – ft_rsq(ft, 3 – 1) =ft_rsq(ft, 6) – ft_rsq(ft, 2) = blue areaminus green area

Analysis:This isO(2 log n) =O(l ) blue areaminus green area =

(5 + 2) ‐ (0 + 1) = 7 ‐ 1 = 6

O(log n)

Why?

Page 31: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (5)Fenwick Tree (5)

d h f f k / d b ( h– To update the frequency of an key/index k, by v (either positive or negative), use ft_adjust(ft, k, v)

• Indices that are related to k via k' = k + LSOne(k)• Indices that are related to k via k' = k + LSOne(k)will be updated by v when k < ft.size()

– Example: ft_adjust(ft, 5, 2)A l i » k = 5 = 0101, k' = k + LSOne(k) = 0101 + 0001, k' = 6 = 0110

» k' = 6 = 0110, k'' = k' + LSOne(k') = 0110 + 0010, k'' = 8 = 1000

» And so on while k < ft.size()

Analysis:This is alsoO(log n)

• Observe that the dotted red line in the figure below stabs through the ranges that are under the responsibility of indices 5, 6, and 8

– ft[5] 2 updated to 4

Why?

ft[5], 2 updated to 4

– ft[6], 5 updated to 7

– ft[8], 10 updated to 12

Page 32: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (6) LibraryFenwick Tree (6) – Libraryt d f t <i t> itypedef vector<int> vi;#define LSOne(S) (S & (-S))

void ft create(vi &ft, int n) { ft.assign(n + 1, 0); } // init: n+1 zeroesvoid ft_create(vi &ft, int n) { ft.assign(n 1, 0); } // init: n 1 zeroes

int ft_rsq(const vi &ft, int b) { // returns RSQ(1, b)int sum = 0; for (; b; b -= LSOne(b)) sum += ft[b];return sum; }

int ft_rsq(const vi &t, int a, int b) { // returns RSQ(a, b)t ft (t b) ( 1 ? 0 ft (t 1)) }return ft_rsq(t, b) - (a == 1 ? 0 : ft_rsq(t, a - 1)); }

// adjusts value of the k-th element by v (v can be +ve/inc or -ve/dec)void ft adjust(vi &ft, int k, int v) {_ j ( , , ) {for (; k < (int)ft.size(); k += LSOne(k)) ft[k] += v; }

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS FT/BIT is in IOI syllabus!

Page 33: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Fenwick Tree (7) ApplicationFenwick Tree (7) – Application

• Fenwick Tree is very suitable for dynamic RSQs (cumulative frequency table) where each update occurs on a certain index only

• Now, think of potential real‐life applications!– http://uhunt.felix‐halim.net/id/32900– Consider code running time of [0.000 ‐ 9.999]

for a particular UVa problem

• There are up to 9+ million submissions/codes– About thousands submissions per problemAbout thousands submissions per problem

• If your code runs in 0.342 secs, what is your rank?

• How to use Fenwick Tree to deal with this problem?pCS3233 ‐ Competitive Programming,

Steven Halim, SoC, NUS

Page 34: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

Quick CheckQuick Check

1. I am lost with Fenwick Tree

2. I understand the basics of F i k T b t i thiFenwick Tree, but since this is new for me, I may/may not be able to recognizenot be able to recognize problems solvable with FT

3. I have solved several FT‐related problems before

0 00

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS

1 2 30 of 120

Page 35: CS3233 Competitive Progggramming · 2012-09-06 · CS3233 ‐Competitive Programming, Steven Halim, SoC, NUS. Top Coder Coding Style (5) 8. Declare (large) static DS as global variable

SummarySummary

• There are a lot of great Data Structures out there– We need the most efficient one for our problem

• Different DS suits different problem!

• Many of them have built‐in libraries– For some others, we have to build our own (focus on FT)

• Study these libraries! Do not rebuild them during contests!

• From Week03 onwards and future ICPCs/IOIs,use C++ STL and/or Java API and our built‐in libraries!– Now, your team should be in rank 30‐45 (from 60)(still solving ~1‐2 problems out of 10, but faster)

CS3233 ‐ Competitive Programming,Steven Halim, SoC, NUS