HDU 2642 stars ||HDU 1892 See you~

题目链接~~>

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

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

代码( HDU 2642 ):

#include<stdio.h>
#include<iostream>
#include<map>
#include<stack>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std ;
#define LEN sizeof(struct node)
#define lld long long int
const double PI = 3.1415926535898 ;
const double INF = 99999999 ;
const double esp = 1e-8 ;
const long long  mod= 1000 ;
const int MX = 1005 ;
int c[MX][MX] ; 
bool vis[MX][MX] ;// 标记是否亮
int lowbit(int x)
{
    return x&(-x) ;
}
int su(int x,int y) // 求和
{
    int ans=0 ;
    while(y>0)
    {
        ans+=c[x][y] ;
        y-=lowbit(y) ;
    }
    return ans ;
}
void add(int x,int y,int num)// 更新
{
    while(y<=1000)
    {
        c[x][y]+=num ;
        y+=lowbit(y) ;
    }
}
int main()
{
    char ch ;
    memset(c,0,sizeof(c)) ;
    memset(vis,false,sizeof(vis)) ;
    int Tx,x,y,x1,y1,t ;
    scanf("%d",&Tx) ;
    while(Tx--)
    {
       cin>>ch ;
       scanf("%d%d",&x,&y) ;
       x++ ; y++ ; // 因为从零开始 s0 加一
       if(ch=='B')
       {
           if(!vis[x][y])// 查看是否亮
           {
               add(x,y,1) ;
               vis[x][y]=true ;
           }
       }
       else if(ch=='D')
       {
           if(vis[x][y])
           {
               add(x,y,-1) ;
               vis[x][y]=false ;
           }
       }
       else
       {
           x1=y ;
           scanf("%d%d",&y,&y1) ;
           y++ ; y1++ ;
           if(x>x1)// 切记要比较大小
           {
               t=x ; x=x1 ;x1=t ;
           }
           if(y>y1)
           {
               t=y ; y=y1 ; y1=t ;
           }
           int sum=0 ;
           for(int i=x ;i<=x1 ;i++)
               sum+=su(i,y1)-su(i,y-1) ;
           printf("%d\n",sum) ;
       }
    }
    return 0 ;
}

HDU 1892 see you~
 

你可能感兴趣的:(HDU 2642 stars ||HDU 1892 See you~)