• E. Intersection of Permutations cdq


    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e6+10;
     
    int t[N+10],n;
    void add(int x,int v) {
        for(;x<=n;x+=x&-x) t[x]+=v;
    }
    int qsum(int x) {
        int ans=0;
        for(;x;x-=x&-x) ans+=t[x]; return ans;
    }
     
    struct node {
        int id,x,y,v;
        bool operator <(const node &t) const {
            return x<t.x;
        }
     
    }s[N];
    int ans[N];
    bool cmp(node a,node b) {return a.x<b.x;}
    void cdq(int l,int r) {
        if(l==r) return ;
        int mid=l+r>>1;
        cdq(l,mid);cdq(mid+1,r);
        sort(s+l,s+mid+1);sort(s+mid+1,s+r+1);
        int j=l;
        for(int i=mid+1;i<=r;i++) {
            while(j<=mid&&s[j].x<=s[i].x) {
                if(s[j].id==0) add(s[j].y,s[j].v);
                j++;
            }
            if(s[i].id) ans[s[i].id]+=s[i].v*qsum(s[i].y);
        }
        while(--j>=l) if(s[j].id==0) add(s[j].y,-s[j].v);
    }
     
    int m,pa[N],pb[N],a[N],b[N],cnt;
    int main() {
        cin>>n>>m;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]),pa[a[i]]=i;
        for(int i=1;i<=n;i++) scanf("%d",&b[i]),pb[b[i]]=i;
        for(int i=1;i<=n;i++) {
            s[++cnt]={0,pa[i],pb[i],1};
        }
        int op,la,lb,ra,rb,x,y;int cntq=0;
        for(int i=1;i<=m;i++) {
            scanf("%d",&op);
            if(op==1) {
                scanf("%d%d%d%d",&la,&ra,&lb,&rb);la--;lb--;
                s[++cnt]={++cntq,ra,rb,1};
                s[++cnt]={cntq,la,lb,1};
                s[++cnt]={cntq,ra,lb,-1};
                s[++cnt]={cntq,la,rb,-1};
            }
            else {
                scanf("%d%d",&x,&y); if(x==y) continue;
                s[++cnt]={0,pa[b[x]],pb[b[x]],-1};
                s[++cnt]={0,pa[b[y]],pb[b[y]],-1};
                swap(b[x],b[y]);pb[b[x]]=x;pb[b[y]]=y;
                s[++cnt]={0,pa[b[x]],pb[b[x]],1};
                s[++cnt]={0,pa[b[y]],pb[b[y]],1};
            }
        }
        cdq(1,cnt);
        for(int i=1;i<=cntq;i++) printf("%d
    ",ans[i]);
    }
    View Code
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e6+10;
     
    int t[N+10],n;
    void add(int x,int v) {
        for(;x<=n;x+=x&-x) t[x]+=v;
    }
    int qsum(int x) {
        int ans=0;
        for(;x;x-=x&-x) ans+=t[x]; return ans;
    }
     
    struct node {
        int id,x,y,v,tim;
    }s[N],temp[N];
    int ans[N];
    bool cmp(node a,node b) {return a.x<b.x||a.x==b.x&&a.tim<b.tim;}
    void cdq(int l,int r) {
        if(l==r) return ;
        int mid=l+r>>1;
        for(int i=l;i<=r;i++) {
            if(s[i].tim<=mid&&!s[i].id) add(s[i].y,s[i].v);
            if(s[i].tim>mid&&s[i].id)  ans[s[i].id]+=s[i].v*qsum(s[i].y);
        }
        int L=l,R=mid+1;
        for(int i=l;i<=r;i++) {
            if(s[i].tim<=mid&&!s[i].id) add(s[i].y,-s[i].v);
            if(s[i].tim<=mid) temp[L++]=s[i];
            else temp[R++]=s[i];
        }
        for(int i=l;i<=r;i++) s[i]=temp[i];
        cdq(l,mid);cdq(mid+1,r);
    }
     
    int m,pa[N],pb[N],a[N],b[N],cnt,ccnt;
    int main() {
        cin>>n>>m;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]),pa[a[i]]=i;
        for(int i=1;i<=n;i++) scanf("%d",&b[i]),pb[b[i]]=i;
        for(int i=1;i<=n;i++) {
            s[++cnt]=(node){0,pa[i],pb[i],1,cnt};
        }
        int op,la,lb,ra,rb,x,y,cntq=0;
        for(int i=1;i<=m;i++) {
            scanf("%d",&op);
            if(op==1) {
                scanf("%d%d%d%d",&la,&ra,&lb,&rb);la--;lb--;
                s[++cnt]=(node){++cntq,ra,rb,1,cnt};
                s[++cnt]=(node){cntq,la,lb,1,cnt};
                s[++cnt]=(node){cntq,ra,lb,-1,cnt};
                s[++cnt]=(node){cntq,la,rb,-1,cnt};
            }
            else {
                scanf("%d%d",&x,&y); if(x==y) continue;
                s[++cnt]=(node){0,pa[b[x]],pb[b[x]],-1,cnt};
                s[++cnt]=(node){0,pa[b[y]],pb[b[y]],-1,cnt};
                swap(b[x],b[y]);pb[b[x]]=x;pb[b[y]]=y;
                s[++cnt]=(node){0,pa[b[x]],pb[b[x]],1,cnt};
                s[++cnt]=(node){0,pa[b[y]],pb[b[y]],1,cnt};
            }
        }
        sort(s+1,s+1+cnt,cmp);
        cdq(1,cnt);
        for(int i=1;i<=cntq;i++) printf("%d
    ",ans[i]);
    }
    View Code
  • 相关阅读:
    [转]Nginx配置信息详解
    [转]浅谈Nginx负载均衡和F5的区别
    [转]MySQL中datetime和timestamp的区别及使用
    理解MyCat分库分表
    理解秒杀系统
    [转]设计模式之桥接模式
    [转]MySQL查询语句执行过程详解
    两步完美解决 androud 模拟器太慢的问题
    android hook 框架 xposed 如何实现挂钩
    android hook 框架 xposed 如何实现注入
  • 原文地址:https://www.cnblogs.com/bxd123/p/12295953.html
Copyright © 2020-2023  润新知