• 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:
    ",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
    ", 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;
    }
    View Code
  • 相关阅读:
    作业
    剑指Offer:链表中倒数第k个节点
    剑指Offer:反转链表
    剑指Offer:数值的整数次方
    剑指Offer:剪绳子Ⅰ和剪绳子Ⅱ
    剑指Offer:机器人的运动范围
    Linux下进程与线程的区别
    剑指Offer:调整数组顺序使奇数位于偶数前面
    剑指Offer:删除链表的节点
    剑指Offer:打印从1到最大的n位数
  • 原文地址:https://www.cnblogs.com/bxd123/p/10357356.html
Copyright © 2020-2023  润新知