2019南京网络赛A(离散化 离线 树状数组)


The beautiful values of the palace



二维子矩阵和(坐标太大).



图片说明


#include<bits/stdc++.h>
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
using namespace std;
const int N=1e6+5;
typedef long long ll;
struct matrix{
    ll TD(ll x,ll y,ll n){
        ll r=0;
        if(x<=y&&x+y<=n+1){
            r=x;return 4LL*(r-1)*n-4*(r-1)*(r-1)+1+y-r;
        }
        if(x<=y & x+y >= n+1) {   
            r = n- y + 1;
            return 4LL*(r-1)*n - 4*(r-1)*(r-1) + 1 + n-2*r + 1 + x - r;
        }
        if(x>=y & x+y >= n+1) {   
            r = n - x +1;
            return 4LL*(r-1)*n - 4*(r-1)*(r-1) + 1 + 3*n-6*r + 3 - y + r;
        }
        if(x>=y & x+y <= n+1) {   
            r = y;   
            return 4LL*(r-1)*n - 4*(r-1)*(r-1) + 1 + 4*n-8*r + 4  - x + r;
        }
    }
    void DT(int &i,int &j,int n){
        int t=i;
        i=n-j+1,j=n-t+1;
    }
}MIT;
int getnum(ll n){
    int ans=0;
    while(n)ans+=n%10,n/=10;
    return ans;
}
struct qin_peng{
    int id,x,y,val,flag;
    bool friend operator<(qin_peng a,qin_peng b){
        return a.x<b.x;
    }
}QR[N<<2],P[N];
ll ans[N]={0},sum[N]={0};
void up(int x,int val){for(int i=x;i<N;i+=i&(-i))sum[i]+=val;}
ll Q(int x){
    ll ans=0;
    for(int i=x;i;i&=i-1)ans+=sum[i];
    return ans;
}
int main(){
    int t;cin>>t;
    while(t--){
        me(sum,0);
        int n,m,q;
        sc("%d%d%d",&n,&m,&q);
        for(int i=1;i<=m;i++){
            int x,y;
            sc("%d%d",&x,&y);
            MIT.DT(x,y,n);
            swap(x,y);
            ll num=MIT.TD(x,y,n);
            int val=getnum(num);
            P[i]={i,x,y,val,0};
        }
        int cnt=0;
        for(int i=1;i<=q;i++){
            int x1,y1,x2,y2;
            sc("%d%d%d%d",&x2,&y2,&x1,&y1);
            MIT.DT(x2,y2,n);swap(x2,y2);
            MIT.DT(x1,y1,n);swap(x1,y1);
            QR[++cnt]={i,x2,y2,0,1};
            QR[++cnt]={i,x1-1,y2,0,-1};
            QR[++cnt]={i,x2,y1-1,0,-1};
            QR[++cnt]={i,x1-1,y1-1,0,1};
        }
        sort(P+1,P+1+m);sort(QR+1,QR+1+cnt);
        int ptr=1;
        for(int i=1;i<=cnt;i++){
            while(ptr<=m&&P[ptr].x<=QR[i].x){
                up(P[ptr].y,P[ptr].val);
                ++ptr;
            }
            ans[QR[i].id]+=1LL*QR[i].flag*Q(QR[i].y);
        }
        for(int i=1;i<=q;i++)printf("%lld\n",ans[i]),ans[i]=0;
    }    
}

全部评论

相关推荐

点赞 评论 收藏
分享
10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务