HDU 2642 stars ||HDU 1892 See you~

举报
Linux猿 发表于 2021/08/05 23:56:44 2021/08/05
【摘要】 题目链接~~> 做题感悟:这题在做之前就听说是二维树状数组下了一跳,读了一下题真有点难,本想问度娘强忍了一下想了一会就AC。 解题思路:其实这题就看成多个一维树状数组,查询的时候从 x ~ x1 依次查询 y~y1  把和加起来就可以了。一个星如果已经点亮就不需要再点亮,如果没点亮就不能让它变暗。 代码( HDU 2642 ): #include&lt...

题目链接~~>

做题感悟:这题在做之前就听说是二维树状数组下了一跳,读了一下题真有点难,本想问度娘强忍了一下想了一会就AC。

解题思路:其实这题就看成多个一维树状数组,查询的时候从 x ~ x1 依次查询 y~y1  把和加起来就可以了。一个星如果已经点亮就不需要再点亮,如果没点亮就不能让它变暗。

代码( HDU 2642 ):


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<stack>
  5. #include<string>
  6. #include<string.h>
  7. #include<stdlib.h>
  8. #include<math.h>
  9. #include<vector>
  10. #include<queue>
  11. #include<algorithm>
  12. using namespace std ;
  13. #define LEN sizeof(struct node)
  14. #define lld long long int
  15. const double PI = 3.1415926535898 ;
  16. const double INF = 99999999 ;
  17. const double esp = 1e-8 ;
  18. const long long mod= 1000 ;
  19. const int MX = 1005 ;
  20. int c[MX][MX] ;
  21. bool vis[MX][MX] ;// 标记是否亮
  22. int lowbit(int x)
  23. {
  24. return x&(-x) ;
  25. }
  26. int su(int x,int y) // 求和
  27. {
  28. int ans=0 ;
  29. while(y>0)
  30. {
  31. ans+=c[x][y] ;
  32. y-=lowbit(y) ;
  33. }
  34. return ans ;
  35. }
  36. void add(int x,int y,int num)// 更新
  37. {
  38. while(y<=1000)
  39. {
  40. c[x][y]+=num ;
  41. y+=lowbit(y) ;
  42. }
  43. }
  44. int main()
  45. {
  46. char ch ;
  47. memset(c,0,sizeof(c)) ;
  48. memset(vis,false,sizeof(vis)) ;
  49. int Tx,x,y,x1,y1,t ;
  50. scanf("%d",&Tx) ;
  51. while(Tx--)
  52. {
  53. cin>>ch ;
  54. scanf("%d%d",&x,&y) ;
  55. x++ ; y++ ; // 因为从零开始 s0 加一
  56. if(ch=='B')
  57. {
  58. if(!vis[x][y])// 查看是否亮
  59. {
  60. add(x,y,1) ;
  61. vis[x][y]=true ;
  62. }
  63. }
  64. else if(ch=='D')
  65. {
  66. if(vis[x][y])
  67. {
  68. add(x,y,-1) ;
  69. vis[x][y]=false ;
  70. }
  71. }
  72. else
  73. {
  74. x1=y ;
  75. scanf("%d%d",&y,&y1) ;
  76. y++ ; y1++ ;
  77. if(x>x1)// 切记要比较大小
  78. {
  79. t=x ; x=x1 ;x1=t ;
  80. }
  81. if(y>y1)
  82. {
  83. t=y ; y=y1 ; y1=t ;
  84. }
  85. int sum=0 ;
  86. for(int i=x ;i<=x1 ;i++)
  87. sum+=su(i,y1)-su(i,y-1) ;
  88. printf("%d\n",sum) ;
  89. }
  90. }
  91. return 0 ;
  92. }

HDU 1892 see you~
 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/22804563

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。