You need some mechanism to merge chains, in order for the whole thing to work properly. If you have 4 fast blocks between 2 full blocks, then you need some way to maintain ordering (between the slow blocks).
A -> a, b, c, d -> B
Looking at B, you can't tell if there were 4 fast blocks.
There would need to be a fast chain, with (at least) 2 inputs.
If b and c happened together, then the result is that d must merge the 2 chains. It has 2 parents, rather than just 1.
A -> a -> (b, c) => d -> B
It should be allowed to merge "around" a full block. The objective is just to allow PoW to be merged into a tree more efficiently.
| |
V |
A -> a -> b -> d -> B
|
+--> c
B is has a "slow" link back to A.
The work that went into c is potentially wasted, but it could be merged back in.
+-------------------+
| |
V |
A -> a -> b -> d -> B -> e -> f
| ^
| |
+--> c -------------+
Someone looking at f can trace back the entire tree starting at f. Since c and e would be backwards links (and included in the header), c (and e) must have been created before f.
This allows all orphans to be merged back in, and so prevents wasting of PoW.