Roy scored 11 of his 28 points in the final 4 1/2 minutes, LaMarcus Aldridge added 23 and the Trail Blazers used two huge second-half runs to get past the Heat 102-95 on Sunday night.
Roy shot 4 for 4 down the stretch, including a pair of 3-pointers -- the last a 28-footer over Dwyane Wade's outstretched arm to put the game away with 28.7 seconds remaining.
"You can't do anything," marveled Heat forward Michael Beasley. "I know for a fact, the last 3 he hit, D-Wade was in his face. I'm talking about centimeters away from the ball and it just dropped. It was a tough shot. Great shot. Not too much you can do about those."
But it was all about Roy, who shot 11 for 14, 5 for 5 from 3-point range, and added eight assists.
"The biggest thing is that I wanted to be aggressive," Roy said. "I think we let the last two games on the road slip away, and tonight I wanted to make sure I had some legs down the stretch to try to give ourselves a chance to win. I was fortunate to be able to make some tough shots."
Battling back spasms and getting treatment during the game, Wade scored 28 points and had 10 assists for the Heat, but he was 13 of 31 from the field and didn't have a rebound for only the fourth time in his career.
Quentin Richardson shot 7 for 7 from 3-point range, tying a Heat record from long range without a miss, and added 22 points for Miami, which also got 17 points from Beasley.
The Heat shot 49 percent, had 24 assists and only seven turnovers -- only the fifth time in the last 20 years that Miami put together that kind of combination. Sunday was the first time it added up to a loss.
"We had our opportunities," Heat coach Erik Spoelstra said. "They had their chances and they capitalized on them when it counted most. And it's a shame, too, because we played well enough offensively across the board, moving the ball, shot a good percentage ... for us to come up short, it's a little bit frustrating."
Portland used an 18-2 run in the third to seize the lead, before Miami countered with a 17-2 burst to reclaim control, only to have Portland put the game away with another 18-5 burst down the stretch.
A three-point play from Roy, followed by a straightaway 3-pointer less than a minute later, tied the game at 89. And after Richardson hit his sixth 3-pointer of the night, Webster answered with one from the left corner for another tie with 2:28 left. It stayed that way until Roy pulled up and hit a jumper with 1:40 remaining, and the backbreaking 3-pointer over Wade came about a minute later.
"He took it upon himself to be aggressive and made sure to give us the best chance to win," Blazers forward Juwan Howard said. "That's what All-Stars do in this league."
Richardson's fifth 3-pointer put the Heat up 57-51 early in the third, before Portland seemed like it was on the cusp of taking control with the 18-2 run over the next 4 1/2 minutes.
The Heat misfired on 6 of 7 shots during that stretch, Wade going 0 for 5, and the only Miami basket came when Beasley slammed home a missed jumper by the 2006 NBA finals MVP. Portland shot 7 for 10 during the rally, with Miller doing much of the damage with seven points.
Miller also was the central figure in Miami getting back on track.
With Portland up 69-59 with 4:03 remaining in the third, Miller was called for a flagrant foul when Wade went flying on a drive toward the rim. Wade made both free throws and then a jumper on the resultant possession, kickstarting what became a 17-2 Miami spurt that put the Heat back on top.
It just wouldn't last.
"It was right there," Wade said. "The basketball Gods didn't want us to win this one."
It only took 274 minutes, 42 seconds, but Richardson finally took a free throw on Miami's home floor after being fouled by Miller with 32.8 seconds left in the half. ... Aldridge and Webster combined to shoot 2 of 17 at Orlando on Saturday. They were 5 for 5 in the first 3 minutes Sunday. ... Portland is 14-2 when leading after three quarters.