zoukankan      html  css  js  c++  java
  • bzoj1176

    题解:

    和上一题差不多

    就加上一个初始值

    代码:

    #include<bits/stdc++.h>
    const int N=1000005;
    using namespace std;
    int n,m,cnt,s,sum[N],ans1[N],pos[N],ans[N];
    struct date{int op,x,y,v,id;}qs[N];
    int comp(date x,date y){return x.x<y.x;}
    void add(int x,int y){for (int i=x;i<=n;i+=i&-i)sum[i]+=y;}
    int  query(int x)
    {
        int temp=0;
        for (int i=x;i;i-=i&-i)temp+=sum[i];
        return temp;
    }
    void solve(int l,int r)
    {
        if (l==r) return;
        int mid=(l+r)/2,temp=0;
        solve(l,mid);solve(mid+1,r);
        sort(qs+l,qs+mid+1,comp);
        sort(qs+mid+1,qs+r+1,comp);
        int i=l,j=mid+1;
        while (j<=r)
         {
            while (qs[i].op==2&&i<=mid) i++;
            while (qs[j].op==1&&j<=r) j++;
            if (i<=mid&&qs[i].x<=qs[j].x) add(qs[i].y,qs[i].v),i++,temp=i-1;
            else if (j<=r) ans[qs[j].id]+=query(qs[j].y),j++;
         }
        for (int t=l;t<=temp;t++) if (qs[t].op==1) add(qs[t].y,-qs[t].v); 
    }
    int main()
    {
        memset(ans,0,sizeof(ans));
        memset(sum,0,sizeof(sum));
        int op,x1,x2,y1,y2;
        scanf("%d%d",&s,&n),m=cnt=0;
        for (;;)
         {
            scanf("%d",&op);
            if (op==1)
             {
                qs[++m].op=op,qs[m].id=m;
                scanf("%d%d%d",&qs[m].x,&qs[m].y,&qs[m].v);
             }
            else
             {
                if (op==2)
                 {
                    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                    pos[++cnt]=m;
                    qs[++m].op=op,qs[m].x=x1-1,qs[m].y=y1-1,qs[m].id=m;
                    ans1[m]+=s*(x2-x2+1)*(y2-y1+1);
                    qs[++m].op=op,qs[m].x=x2,qs[m].y=y2,qs[m].id=m;        
                    qs[++m].op=op,qs[m].x=x1-1,qs[m].y=y2,qs[m].id=m;
                    qs[++m].op=op,qs[m].x=x2,qs[m].y=y1-1,qs[m].id=m;
                 }
                else break;
             }
         }
        solve(1,m);
        for (int i=1;i<=cnt;i++)
         printf("%d
    ",ans[pos[i]+1]+ans[pos[i]+2]-ans[pos[i]+3]-ans[pos[i]+4]);
    }
  • 相关阅读:
    三级联动
    投票系统
    增删改查
    PHP基础
    查询练习
    高级查询
    高级查询练习题
    0510课堂02三元运算符,跳转语句,循环结构
    0510课堂
    050602课堂css3旋转、过渡、动画
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8424184.html
Copyright © 2011-2022 走看看