• 洛谷P1502 窗口的星星


    题目背景

    小卡买到了一套新房子,他十分的高兴,在房间里转来转去。

    题目描述

    晚上,小卡从阳台望出去,“哇~~~~好多星星啊”,但他还没给其他房间设一个窗户。

    天真的小卡总是希望能够在晚上能看到最多最亮的星星,但是窗子的大小是固定的,边也必须和地面平行。

    这时小卡使用了超能力(透视术)知道了墙后面每个星星的位置和亮度,但是小卡发动超能力后就很疲劳,只好拜托你告诉他最多能够有总和多亮的星星能出现在窗口上。

    输入格式

    本题有多组数据,第一行为 TT,表示有 TT 组数据。

    对于每组数据:

    第一行 33 个整数 n,W,Hn,W,H 表示有 nn 颗星星,窗口宽为 WW,高为 HH。

    接下来 nn 行,每行三个整数 x_i,y_i,l_ixi​,yi​,li​ 表示星星的坐标在 (x_i,y_i)(xi​,yi​),亮度为 l_ili​。

    输出格式

    TT 个整数,表示每组数据中窗口星星亮度总和的最大值。

    输入输出样例

    输入 #1复制

    2
    
    3 5 4
    1 2 3
    2 3 2
    6 3 1
    
    3 5 4
    1 2 3
    2 3 2
    5 3 1

    输出 #1复制

    5
    6
    

    说明/提示

    小卡买的窗户框是金属做的,所以在边框上的不算在内。

    数据范围

    1\le T \le 101≤T≤10
    1\le n \le 10^41≤n≤104
    1\le W,H \le 10^61≤W,H≤106 0\le x_i,y_i < 2^{31}0≤xi​,yi​<231

    上代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define LL long long
    6. #define N (100001)
    7. using namespace std;
    8. template <typename T> void read(T&t) {
    9. t=0;
    10. bool fl=true;
    11. char p=getchar();
    12. while (!isdigit(p)) {
    13. if (p=='-') fl=false;
    14. p=getchar();
    15. }
    16. do {
    17. (t*=10)+=p-48;p=getchar();
    18. }while (isdigit(p));
    19. if (!fl) t=-t;
    20. }
    21. int t,n,W,H,tot,cnt,maxans;
    22. int left[N],right[N];
    23. struct star{
    24. int x,y,l,id;
    25. bool fl;
    26. }a[N],b[N];
    27. struct node{
    28. int l,r,lazy,v;
    29. }T[N<<2];
    30. inline bool cmp(star a,star b){
    31. return a.x
    32. }
    33. inline bool cmp1(star a,star b){
    34. return a.y==b.y?a.l>b.l:a.y
    35. }
    36. void build(int u,int l,int r){
    37. T[u].lazy=T[u].v=0;
    38. T[u].l=l,T[u].r=r;
    39. if (l==r) return;
    40. int mid=l+r>>1,kk=u<<1;
    41. build(kk,l,mid);
    42. build(kk|1,mid+1,r);
    43. }
    44. void pushdown(int u){
    45. if (T[u].lazy){
    46. int aa=T[u].lazy,kk=u<<1;
    47. T[u].lazy=0;
    48. T[kk].v+=aa;
    49. T[kk].lazy+=aa;
    50. T[kk|1].v+=aa;
    51. T[kk|1].lazy+=aa;
    52. }
    53. }
    54. int query(int u,int L,int R){
    55. if (L<=T[u].l&&T[u].r<=R) return T[u].v;
    56. pushdown(u);
    57. int ret=0,k=u<<1,mid=T[u].l+T[u].r>>1;
    58. if (L<=mid) ret=query(k,L,R);
    59. if (R>mid) ret=max(ret,query(k|1,L,R));
    60. return ret;
    61. }
    62. void add(int u,int L,int R,int k){
    63. if (L<=T[u].l&&T[u].r<=R){
    64. T[u].v+=k;
    65. T[u].lazy+=k;
    66. pushdown(u);
    67. return;
    68. }
    69. pushdown(u);
    70. int mid=T[u].l+T[u].r>>1,vv=u<<1;
    71. if (L<=mid) add(vv,L,R,k);
    72. if (R>mid) add(vv|1,L,R,k);
    73. T[u].v=max(T[vv].v,T[vv|1].v);
    74. }
    75. int main(){
    76. read(t);
    77. while (t--){
    78. cnt=tot=maxans=0;
    79. read(n),read(W),read(H);
    80. for (int i=1;i<=n;i++){
    81. read(a[i].x),read(a[i].y),read(a[i].l);
    82. a[i].id=i; a[i].fl=0;
    83. b[i].y=a[i].y,b[i].l=a[i].l;
    84. b[i].id=i;
    85. }
    86. tot=n;
    87. for (int i=1;i<=n;i++){
    88. a[++tot].x=a[i].x+W-1;
    89. a[tot].id=i;
    90. a[tot].fl=1;
    91. }
    92. sort(a+1,a+tot+1,cmp);
    93. for (int i=1;i<=tot;i++){
    94. int tt=0;
    95. if (a[i].x==a[i-1].x&&i!=1) tt=cnt;
    96. else tt=++cnt;
    97. if (!a[i].fl) left[a[i].id]=tt;
    98. else right[a[i].id]=tt;
    99. }
    100. tot=n;
    101. for (int i=1;i<=n;i++){
    102. b[++tot].y=b[i].y+H-1;
    103. b[tot].l=-b[i].l;
    104. b[tot].id=b[i].id;
    105. }
    106. sort(b+1,b+tot+1,cmp1);
    107. build(1,1,cnt);
    108. for (int i=1;i<=tot;i++){
    109. if (b[i].l>0){
    110. int num=query(1,left[b[i].id],right[b[i].id]);
    111. if (num+b[i].l>maxans) maxans=num+b[i].l;
    112. }
    113. add(1,left[b[i].id],right[b[i].id],b[i].l);
    114. }
    115. printf("%d\n",maxans);
    116. }
    117. return 0;
    118. }

  • 相关阅读:
    论文解读《Adversarial training methods for semi-supervised text classification》
    vue 实现自定义分页打印 window.print
    神经网络控制系统的应用,神经元网络控制的应用
    【CTO变形记】高维视角,跳出“农场主与火鸡”
    如何阅读一份源代码?
    [模拟赛]2022.07.25
    QT实现将两个时间相加的算法[hh: mm + hh: mm]
    33.Python从入门到精通—Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别
    MySQL-日志
    内功心法:深入研究整型数(下)
  • 原文地址:https://blog.csdn.net/lzx_xzl_______/article/details/126052365