bzoj4940: [Ynoi2016]这是我自己的发明

用dfs序把询问表示成询问dfs序的两个区间中的信息

拆成至多9个询问(询问dfs序的两个前缀),对这些询问用莫队处理,时间复杂度$O(n\sqrt{m})$

#include<bits/stdc++.h>
typedef long long i64;
const int N=1e5+77;
char buf[N],*ptr=buf+100000,ob[N],*op=ob;
int G(){
    if(ptr-buf==100000)fread(ptr=buf,1,100000,stdin);
    return *ptr++;
}
int _(){
    int x=0;
    if(ptr-buf<99900){
        while(*ptr<48)++ptr;
        while(*ptr>47)x=x*10+*ptr++-48;
    }else{
        int c=G();
        while(c<48)c=G();
        while(c>47)x=x*10+c-48,c=G();
    }
    return x;
}
#define fl fwrite(ob,1,op-ob,stdout),op=ob
void pr(i64 x){
    if(op-ob>100000)fl;
    int ss[25],sp=0;
    if(!x)*op++=48;
    while(x)ss[++sp]=x%10,x/=10;
    while(sp)*op++=ss[sp--]+48;
    *op++=10;
}
i64 ans[N*5];
int n,m,rt=1;
int v[N],vs[N],qc=0;
int es[N*2],enx[N*2],e0[N],ep=2;
int fa[N],sz[N],son[N],dep[N],top[N],id[N][2],vi[N],idp=0;
void f1(int w,int pa){
    dep[w]=dep[fa[w]=pa]+1;
    sz[w]=1;
    for(int i=e0[w];i;i=enx[i]){
        int u=es[i];
        if(u==pa)continue;
        f1(u,w);
        sz[w]+=sz[u];
        if(sz[u]>sz[son[w]])son[w]=u;
    }
}
void f2(int w,int tp){
    id[w][0]=++idp;
    vi[idp]=v[w];
    top[w]=tp;
    if(son[w])f2(son[w],tp);
    for(int i=e0[w];i;i=enx[i]){
        int u=es[i];
        if(u!=fa[w]&&u!=son[w])f2(u,u);
    }
    id[w][1]=idp;
}
int up(int x,int y){
    int a=top[x],b=top[y];
    while(a!=b){
        x=fa[a];
        if(x==y)return a;
        a=top[x];
    }
    return son[y];
}
bool chk(int w){
    return id[w][0]<id[rt][0]&&id[rt][0]<=id[w][1];
}
int pos[N],B,qp=0;
struct Q{
    int l,r,sgn,id;
}qs[N*20],qs1[N*20],*ls[N],*lp;
int tr[N],tb[N];
i64 s0[N],_ans;
int ts[N][2];
inline void inc0(int x){++ts[x][0],_ans+=ts[x][1];}
inline void dec0(int x){--ts[x][0],_ans-=ts[x][1];}
inline void inc1(int x){++ts[x][1],_ans+=ts[x][0];}
inline void dec1(int x){--ts[x][1],_ans-=ts[x][0];}
void cal(int w,int*a,int&p){
    if(w==rt)a[0]=n,p=1;
    else if(id[w][0]<id[rt][0]&&id[rt][0]<=id[w][1]){
        w=up(rt,w);
        a[0]=n;
        a[1]=-id[w][1];
        a[2]=id[w][0]-1;
        p=3;
    }else{
        a[0]=id[w][1];
        a[1]=1-id[w][0];
        p=2;
    }
}
void ins(int a,int b,int id){
    if(!(a&&b))return;
    int c=1;
    if(a<0)a=-a,c=-c;
    if(b<0)b=-b,c=-c;
    if(a>b)std::swap(a,b);
    if(b==n)ans[id]+=c*s0[a];
    else qs[qp++]=(Q){a,b,c,id};
}
int main(){
    n=_();m=_();
    for(int i=1;i<=n;++i)v[i]=vs[i]=_();
    std::sort(vs+1,vs+n+1);
    for(int i=1;i<=n;++i)v[i]=std::lower_bound(vs+1,vs+n+1,v[i])-vs;
    for(int i=1,a,b;i<n;++i){
        a=_(),b=_();
        es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
        es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
    }
    f1(1,0);
    f2(1,1);
    for(int i=1;i<=n;++i)inc0(vi[i]);
    for(int i=1;i<=n;++i)inc1(vi[i]),s0[i]=_ans;
    _ans=0;
    memset(ts,0,sizeof(ts));
    for(int i=1;i<=m;++i){
        if(_()==1)rt=_();
        else{
            ++qc;
            int x=_(),y=_();
            int xv[4],xp,yv[4],yp;
            cal(x,xv,xp);
            cal(y,yv,yp);
            for(int a=0;a<xp;++a)
                for(int b=0;b<yp;++b)ins(xv[a],yv[b],qc);
        }
    }
    B=n/sqrt(qp+1)*2+1;
    for(int i=1;i<=n;++i)pos[i]=i/B;

    for(int i=0;i<qp;++i)++tr[qs[i].r],++tb[pos[qs[i].l]];
    lp=qs1;
    for(int i=1;i<=n;++i)ls[i]=lp,lp+=tr[i];
    for(int i=0;i<qp;++i)*ls[qs[i].r]++=qs[i];
    lp=qs;
    for(int i=0;i<=pos[n];++i)ls[i]=lp,lp+=tb[i];
    for(int i=0;i<qp;++i)*ls[pos[qs1[i].l]]++=qs1[i];
    for(int i=0;i<pos[n];i+=2)std::reverse(ls[i],ls[i+1]);

    int L=0,R=0;
    for(int i=0;i<qp;++i){
        int l=qs[i].l,r=qs[i].r;
        while(L<l)inc0(vi[++L]);
        while(L>l)dec0(vi[L--]);
        while(R<r)inc1(vi[++R]);
        while(R>r)dec1(vi[R--]);
        ans[qs[i].id]+=qs[i].sgn*_ans;
    }
    for(int i=1;i<=qc;++i)pr(ans[i]);
    return fl,0;
}
时间: 2024-10-17 02:32:24

bzoj4940: [Ynoi2016]这是我自己的发明的相关文章

《爆品战略》:浓浓的营销讲师味道:洞察力不够却喜欢发明理论和概念;陷入锤子模式。2星

作者试图发明一个理论来解释互联网时代的一切商业行动.读后感觉比较差.理由如下: 1:案例太片面,基本集中在面向终端用户的快消品: 2:案例太少,只有39个: 3:信息来源太局限,书中居然有的案例的来源是讲课过程中学员的反馈,太不严肃了: 3:植入太明显,小米相关的内容占的篇幅太多,资料明显比其他案例详细: 4:洞察力不够,逻辑不够严谨,完全算不上是理论: 5:陷入锤子模式,尝试用自己的理论解释所有的商业行为,大部分的解释都比较牵强: 整体评价为2星. 全书15万字,正常印刷的话是一本比较薄的书,

全世界第一个可穿戴设备,是中国大学生25年前发明的,有专利为证

最近整理资料,发现了25年前,自己大学期间(90年)的发明:数据手套 申报过专利,专利编号, 91220988,可惜太超前,当时还没有谷歌 这个专利,可能是国内,甚至全球第一款,或者第一批,可穿戴电脑设备. (专利号, 91220988,一种电子计算机数据输入装置,http://so.baiten.cn/results?q=91220988&type=63) 此专利虽然超过时限,但和现代的电脑图像.机器视觉,以及无线传感器结合,以及与微软kinect.谷歌眼镜等现代技术结合,升级扩展,可以作为新

谁发明了验证码?你出来 保证不打死你

前验证码时代 一开始,网络上是没有验证码的.那时想要在论坛上发帖,只需轻轻敲一下回车键. 然而,那个时代却没有大家以为的那么平静,当时的黑客也十分猖狂:他们编写了一种能够大量.重复编写信息的程序,伪装成人类用户,肆无忌惮地朝网络上倾倒大量的.无意义的"僵尸"信息,垃圾邮件.垃圾广告.垃圾评论到处乱飞.论坛被灌水,有用的信息很快会被淹没,很多网站的正常运营遭到破坏. 除此之外,还有数之不尽的程序机器人使用不断尝试的方法恶意破解密码.恶意刷票,从中获取非法的利益.强而有力的程序机器人如同霸

重新发明 Y 组合子:不用 λ演算那一套

重新发明 Y 组合子:不用 λ演算那一套 重新发明 Y 组合子:不用 λ演算那一套 目录 1. 一类奇妙的函数 1.1. 三个例子 1.2. 构造方法 1.3. 程序分解 2. X 组合子 3. Y 组合子 4. 结语 1 一类奇妙的函数 1.1 三个例子 函数 (lambda ($) (lambda (n) (if (< n 2) 1 (* n (($ $) (- n 1)))))) 以一个函数为参数,当这个参数是函数本身时,返回计算阶乘的函数 函数 (lambda ($) (lambda (

《软件故事:谁发明了那些经典的编程语言》

<软件故事:谁发明了那些经典的编程语言> 基本信息 作者: (美)史蒂夫.洛尔 译者: 张沛玄 出版社:人民邮电出版社 ISBN:9787115355089 上架时间:2014-6-19 出版日期:2014 年6月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 软件工程及软件方法学 > 综合 更多关于>>><软件故事:谁发明了那些经典的编程语言> 编辑推荐 聆听软件行业发展的精彩故事 领悟软件巨擘的深邃思想 放飞想象力,通过编码改变世界

第一章,计算机的发明

一.计算机的发展历史 早在17世纪,欧洲一批数学家就已开始设计和制造以数字形式进行基本运算的数字计算机.1642年,法国数学家帕斯卡采用与钟表类似的齿轮传动装置,制成了最早的十进制加法器.1678年,德国数学家莱布尼兹制成的计算机,进一步解决了十进制数的乘.除运算. 英国数学家巴贝奇在1822年制作差分机模型时提出一个设想,每次完成一次算术运算将发展为自动完成某个特定的完整运算过程.1884年,巴贝奇设计了一种程序控制的通用分析机.这台分析机虽然已经描绘出有关程序控制方式计算机的雏型,但限于当时

张艾迪(创始人):发明整个世界+224C个国家

Eidyzhang:发明整个世界+224C个国家 Eidyzhang: Genius.Founder.CEO.23 I 世界级最高级创始人.世界最高级FounderCEO 出生在亚洲中国.Eidyzhang 拥有黑色头发白色皮肤(20岁)大学辍学生.提前2年离开学校 Hello World Fouder:Eidyzhang story for Grow Up Eidyzhang是一个大学辍学生(修读2年) 这一切我都可以做得到.我是Eidyzhang.我是世界级最高级梦想家.理想家: 年少的我拥

张艾迪(创始人):发明Global.World.224C的天才

Eidyzhang: Genius.Founder.CEO.23 I 世界级最高级创始人.世界最高级FounderCEO 出生在亚洲中国.Eidyzhang 拥有黑色头发白色皮肤(20岁)大学辍学生.提前2年离开学校 她是这个世界的天才.全球互联网的天才女孩(提前离开学校.是因为世界需要我) Eidyzhang是一个大学辍学生(修读2年) (20岁)离开学校: (21岁)成立自己的第一家Newspaper广告公司; (21.22岁期间独立搭建很多Blog和门户系统.举办很多活动.卖掉专利.爱发明

从原创到发明,卡萨帝推进“金字塔”生活

在刚刚开始的2017年里,家电市场的"求变"方向已成行业趋势. 通过架构附加价值服务.提升和优化品质服务.铺设新型营销渠道等等方式是其中典型,除此之外,突破创新.推进全方面的多维度战略思维,也成为这个"求变"方向中的另一潮流.在具体举措方面,一些品牌亦步亦趋,但一些颇具实力和规模的品牌如卡萨帝则采取了全方面突破思维.重新定义不同生活品质阶层的策略. 就目前情形来看,这种做法虽是首创,但更具颠覆性,因为其具备典型的"发明"属性. 卡萨帝首推高端需求