See you~ HDU1892

一开始还离散化弄了好久  离散化细节弄得好差

这题用二维树状数组做很快  因为树状数组下标不为0  所以所有下标要加一处理

还有就是算矩阵的时候要处理两个坐标的大小关系

个人感觉树状数组用for语句写更加简洁

#include<bits/stdc++.h>
using namespace std;
int c[1010][1010];
int n;
int lowbit(int i)
{
    return i&-i;
}
void update(int x,int y,int v)
{
    for(int i=x;i<n;i+=lowbit(i))
        for(int j=y;j<n;j+=lowbit(j))
           c[i][j]+=v;
}
long long sum(int x,int y)
{
    long long ans=0;
    for(int i=x;i>0;i-=lowbit(i))
        for(int j=y;j>0;j-=lowbit(j))
         ans+=c[i][j];
    return ans;
}
int main()
{
    int cas;
    scanf("%d",&cas);
    n=1005;
   for(int i=1;i<=cas;i++)
   {
       printf("Case %d:\n",i);
       memset(c,0,sizeof(c));
       for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
          update(i,j,1);
       int q;
       scanf("%d",&q);
       char s[10];
       int x1,x2,y1,y2,n1;
       while(q--)
       {
           scanf("%s",s);
           if(s[0]==‘A‘)
           {
               scanf("%d%d%d",&x1,&y1,&n1);
               update(x1+1,y1+1,n1);
           }
           else if(s[0]==‘D‘)
           {
               scanf("%d%d%d",&x1,&y1,&n1);
               x1++;y1++;
               int w=sum(x1,y1)-sum(x1,y1-1)-sum(x1-1,y1)+sum(x1-1,y1-1);
               if(w-n1>=0) update(x1,y1,-n1);
               else update(x1,y1,-w);
           }
           else if (s[0]==‘S‘)
           {
               scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
               x1++;y1++;x2++;y2++;
               if(x1>x2)swap(x1,x2);
               if(y1>y2)swap(y1,y2);
               printf("%d\n", sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1)   );
           }
           else if(s[0]==‘M‘)
           {
               scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
               x1++;y1++;x2++;y2++;
               int w=sum(x1,y1)-sum(x1,y1-1)-sum(x1-1,y1)+sum(x1-1,y1-1);
               if(w>=n1){ update(x1,y1,-n1);update(x2,y2,n1);  }
               else  {update(x1,y1,-w);update(x2,y2,w);}
           }
       }
   }
    return 0;
}

原文地址:https://www.cnblogs.com/bxd123/p/10357356.html

时间: 2024-08-28 03:41:33

See you~ HDU1892的相关文章

HDU1892 See you~

Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4660    Accepted Submission(s): 1479 Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many knowledge ab

See you~(hdu1892)

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4768    Accepted Submission(s): 1521 Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kno

hdu-1892 See you~---二维树状数组运用

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1892 题目大意: 题目大意:有很多方格,每个方格对应的坐标为(I,J),刚开始时每个格子里有1本书,然后让你统计一片区域有多少本书,还可以增加书和减少,移动书. 解题思路: 直接二维数组数组模拟 注意: 每个下标+1,从(1, 1)开始 求区域和的时候给出的x1 y1 和x2 y2不是标准的正对角线,需要转化 1 #include<cstdio> 2 #include<cstring>