题目

$n , m ,d,x\le 10^5 , $强制在线

题解

  • 对原树做dfs,得到原树的dfs序

  • 对kruksal重构树做dfs,得到重构树的dfs序

  • 那么就是一个三维数点问题

  • 强制在线并且卡空间,我写的线段树套\(splay\)

  • (主要想存一下模板OVO)

    #include<bits/stdc++.h>
    #define ll long long
    #define il inline
    #define rg register using namespace std; const int N=100010,M=20;
    int n,m,ty,a[N],X1,Y1,X2,Y2,V;
    struct Edge{int u,v,w;}e[N];
    il bool cmp(Edge x,Edge y){return x.w>y.w;}
    ll ans,tmp; il char gc(){
    static char*p1,*p2,s[1000000];
    if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    il int rd(){
    int x=0;char c=gc();
    while(c<'0'||c>'9')c=gc();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    return x;
    } struct Kruskal{
    int cnt,ls[N*2],rs[N*2],idx,st[N*2],ed[N*2],fa[N*2][M],bin[20],w[N*2],f[N*2],dep[N*2];
    il void cal1(int u){X2=st[u];}
    il void cal2(int u,int x){
    for(int i=17;~i;--i)if(w[fa[u][i]]>=x)u=fa[u][i];
    X2=st[u];Y2=ed[u];
    }
    void dfs(int u){
    st[u]=++idx;
    for(int i=1;bin[i]<=dep[u];++i)fa[u][i]=fa[fa[u][i-1]][i-1];
    if(ls[u]){
    dep[ls[u]]=dep[rs[u]]=dep[u]+1;
    fa[ls[u]][0]=fa[rs[u]][0]=u;
    dfs(ls[u]);dfs(rs[u]);
    }
    ed[u]=idx;
    }
    int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
    il void init(){
    for(int i=bin[0]=1;i<20;++i)bin[i]=bin[i-1]<<1;
    for(int i=1;i<=n;++i)f[i]=i;
    sort(e+1,e+n,cmp);cnt=n;
    for(int i=1;i<n;++i){
    int u=find(e[i].u),v=find(e[i].v);
    w[++cnt]=e[i].w;
    ls[cnt]=u,rs[cnt]=v;
    f[u]=f[v]=f[cnt]=cnt;
    }
    dfs(cnt);
    }
    }T2; struct Tree{
    int o=1,hd[N],st[N],ed[N],idx;
    struct edge{int v,nt;}E[N<<1];
    il void adde(int u,int v){
    E[o]=(edge){v,hd[u]};hd[u]=o++;
    E[o]=(edge){u,hd[v]};hd[v]=o++;
    }
    il void cal1(int u){X1=st[u];}
    il void cal2(int u){X1=st[u];Y1=ed[u];}
    void dfs(int u,int F){
    st[u]=++idx;
    for(int i=hd[u];i;i=E[i].nt){
    int v=E[i].v;
    if(v==F)continue;
    dfs(v,u);
    }
    ed[u]=idx;
    }
    il void init(){dfs(1,0);}
    }T1; struct Splay{
    int sz,rt[N<<2],fa[N*M*2],ch[N*M*2][2],le[N*M*2],ri[N*M*2],Le[N*M*2],Ri[N*M*2];
    ll ly[N*M*2],sum[N*M*2];
    il void init(int k){rt[k]=++sz;le[sz]=Le[sz]=0;ri[sz]=Ri[sz]=2*n;}
    il void pushup(int k){
    int l=ch[k][0],r=ch[k][1];
    Le[k]=l?Le[l]:le[k];
    Ri[k]=r?Ri[r]:ri[k];
    }
    il void mfy(int k,int x){sum[k]+=x;ly[k]+=x;}
    il void pushdown(int k){
    if(!ly[k])return;
    mfy(ch[k][0],ly[k]);
    mfy(ch[k][1],ly[k]);
    ly[k]=0;
    }
    void push(int x){
    if(fa[x])push(fa[x]);
    pushdown(x);
    }
    il void rotate(int x,int&k){
    int y=fa[x],z=fa[y];
    if(y!=k)ch[z][ch[z][1]==y]=x;else k=x;
    int l=ch[y][1]==x,r=l^1;
    fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
    ch[y][l]=ch[x][r];ch[x][r]=y;
    pushup(y);pushup(x);
    }
    il void splay(int x,int&k){
    push(x);
    for(int y,z;x!=k;rotate(x,k)){
    y=fa[x],z=fa[y];
    if(y!=k)rotate((ch[z][1]==y)^(ch[y][1]==x)?x:y,k);
    }
    }
    il int find(int k,int x){
    if(le[k]<=x&&x<=ri[k])return k;
    if(Le[ch[k][0]]<=x&&x<=Ri[ch[k][0]])return find(ch[k][0],x);
    return find(ch[k][1],x);
    }
    il void update(int k){
    int l=X2-1,r=Y2+1;
    int x=find(rt[k],l);splay(x,rt[k]);
    if(l<ri[x]){
    sum[++sz]=sum[x];
    ri[sz]=ri[x];ri[x]=l;le[sz]=l+1;
    fa[ch[sz][1]=ch[x][1]]=sz;
    fa[ch[x][1]=sz]=x;
    pushup(sz);pushup(x);
    }
    int y=find(ch[x][1],r);splay(y,ch[x][1]);
    if(le[y]<r){
    sum[++sz]=sum[y];
    le[sz]=le[y];le[y]=r;ri[sz]=r-1;
    fa[ch[sz][0]=ch[y][0]]=sz;
    fa[ch[y][0]=sz]=y;
    pushup(sz);pushup(y);
    }
    mfy(ch[y][0],V);
    }
    il void query(int k){
    int x=find(rt[k],X2);
    splay(x,rt[k]);
    tmp+=sum[x];
    }
    }D2; struct segment{
    #define ls (k<<1)
    #define rs (k<<1|1)
    il void build(int k,int l,int r){
    D2.init(k);
    if(l==r)return;
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    }
    il void update(int k,int l,int r,int x,int y){
    if(l==x&&r==y){D2.update(k);return;}
    int mid=(l+r)>>1;
    if(y<=mid)update(ls,l,mid,x,y);
    else if(x>mid)update(rs,mid+1,r,x,y);
    else update(ls,l,mid,x,mid),update(rs,mid+1,r,mid+1,y);
    }
    il void query(int k,int l,int r){
    D2.query(k);
    if(l==r)return;
    int mid=(l+r)>>1;
    if(X1<=mid)query(ls,l,mid);
    else query(rs,mid+1,r);
    }
    }D1; int main(){
    freopen("ichi.in","r",stdin);
    freopen("ichi.out","w",stdout);
    n=rd();m=rd();ty=rd();
    for(rg int i=1;i<=n;++i)a[i]=rd();
    for(rg int i=1,u,v,w;i<n;++i){
    u=rd();v=rd();w=rd();
    e[i]=(Edge){u,v,w};
    T1.adde(u,v);
    }
    T1.init();
    T2.init();
    D1.build(1,1,n);
    for(rg int i=1,op,u,x,y;i<=m;++i){
    op=rd();
    if(op==1){
    u=rd();if(ty)u=(u+ans)%n+1;
    T1.cal1(u);T2.cal1(u);
    tmp=0;D1.query(1,1,n);
    ans=a[u]+tmp;
    printf("%lld\n",ans);
    }else{
    y=rd();x=rd();
    u=rd();if(ty)u=(u+ans)%n+1;
    T1.cal2(u);T2.cal2(u,x);
    V=y;D1.update(1,1,n,X1,Y1);
    }
    }
    return 0;
    }

【JZOJ6227】【20190621】ichi的更多相关文章

  1. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  3. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  4. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  5. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  6. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  7. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  8. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  9. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  10. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

随机推荐

  1. C# vb .net实现过度曝光效果滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的过度曝光效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  2. C#设计模式之11:命令模式

    C#设计模式之11:命令模式 命令模式 命令模式用来解决一些复杂业务逻辑的时候会很有用,比如,你的一个方法中到处充斥着if else 这种结构的时候,用命令模式来解决这种问题就会让事情变得简单很多. ...

  3. visual studio 2015 开发时常见问题的解决方案

    1.visual studio 2015 用printf函数打印时来不及看结果窗口就关闭 方案一 在所写的代码后面,加上system("PAUSE"); 如下:

  4. pandas-13 时间序列操作方法pd.date_range()

    pandas-13 时间序列操作方法pd.date_range() 在pandas中拥有强大的时间序列操作方法. 使用 pd.date_range() 生成 'pandas.core.indexes. ...

  5. 【开发工具】- 推荐一款好用的文本编辑器[Sublime Text]

    作为一个程序员除了IDE外,文本编辑器也是必不可少的一个开发工具.之前一直在用的是NotePad++.EditPlus,这两款编辑器,但是总感觉差点什么,昨天在知乎上看到有人推荐Sublime Tex ...

  6. Java 之 Response 发送验证码案例

    定义一个 Servlet 用来在内存中生成 二维码图片,并向浏览器页面输出. import javax.imageio.ImageIO; import javax.servlet.ServletExc ...

  7. Code Clean读书笔记

    代码整洁之道读书笔记 by fangpc 序言部分 "神在细节之中" - 建筑师路德维希 5S哲学(精益) 整理(Seiri):搞清楚事物之所在--通过恰当地命名之类的手段--至关 ...

  8. AudioToolbox--利用AudioQueue音频队列,通过缓存对声音进行采集与播放

    都说iOS最恶心的部分是流媒体,其中恶心的恶心之处更在即时语音. 所以我们先不谈即时语音,研究一下,iOS中声音采集与播放的实现. 要在iOS设备上实现录音和播放功能,苹果提供了简单的做法,那就是利用 ...

  9. ffmpeg 把视频转换为图片

    ffmpeg -i "Tail of Hope.mp4" -r 1 -q:v 2 -f image2 pic-%03d.jpeg

  10. Python学习日记(三十四) Mysql数据库篇 二

    外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...