Preheat the oven to 400°F (200°C).
Cook the macaroni according to the directions on the box. Drain, toss with the olive oil, and set aside in a large mixing bowl.
Add the bacon to a small skillet and sauté over medium heat until brown but not crisp, about 10 minutes. Drain on paper towels and add to the cooked macaroni.
In a medium saucepan, bring the milk just to a foamy boil, then reduce the heat to very low to keep warm.
In another saucepan, melt the butter over medium heat. When the foam subsides, remove from the heat. Whisk in the flour and continue stirring until a smooth, pale roux has formed. Return the saucepan to medium heat and, while still whisking steadily, begin ladling the hot milk into the roux, 1 cup at a time, completely incorporating each cup before adding the next. After all the milk has been added, continue to whisk until the sauce thickens and bubbles gently, about 2 minutes. Add the Parmesan, 2 cups of the Gruyère, and the salt and pepper, and stir until the cheese has completely melted.
Pour the sauce over the macaroni, mix thoroughly, and pour into a buttered 10 X 14-inch gratin dish. Bake in the oven for 12 minutes. Remove, sprinkle the remaining cup of Gruyère over tire top, and continue baking for an additional 10 minutes, until the top is golden and crunchy.