When your node encounters a conflict (a fork), where two signed blocks have the same parent (double spend attempt), it creates a vote referencing the block and broadcasts it to the network.
The nodes vote and the weighted majority (>51%) is taken as the real fork. The weight of a node's vote is the sum of the balances all accounts that have named that node as its representative.
The key thing here is that when a fork or missing block occurs, only the accounts referenced in the transaction are affected. The rest of the network proceeds with processing transactions for other accounts.
The voting mechanism is to wait for 4 voting periods (1 minute total) and keep a cumulative tally of incoming votes from the other representatives. The most popular block wins majority and is kept. The other block is discarded.
Refer to page 4 (bottom right) of the whitepaper: https://raiblocks.net/media/RaiBlocks_Whitepaper__English.pd...
As far as I am concerned, this is a great design (if you buy into proof-of-stake, which I do).