ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3521 [POI2011]ROT-Tree Rotations

2019-03-19 08:53:24  阅读:232  来源: 互联网

标签:return int rson POI2011 Tree Seg lson printf ROT


思路

发现每个子树内的交换情况不会对子树外造成影响,所以可以利用贪心的思想,线段树合并找出当前子树的合并的最小值直接累加给答案即可

我脑补的线段树合并貌似不太优秀的样子。。。每次都要新建节点,学习了直接把y合并到x上的想法,但是因为#define int long long的坏习惯导致MLE,最后还是要写内存池。。。

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
struct Node{
    int lson,rson,sz;
}Seg[3000000];
int Nodecnt,ans,min1,min2,n;
queue<int> q;
int getnew(void){
    if(q.size()){
        int t=q.front();
        q.pop();
        Seg[t].lson=Seg[t].rson=Seg[t].sz=0;
        return t;
    }
    return ++Nodecnt;
}
void throwin(int x){
    q.push(x);
}
void build(int l,int r,int &o,int val){
    // printf("%d %d %d %d\n",l,r,o,val);
    if(!o)
        o=getnew();
    // printf("%d %d %d %d\n",l,r,o,val);
    Seg[o].sz++;
    if(l==r){
        return;
    }
    int mid=(l+r)>>1;
    if(val<=mid)
        build(l,mid,Seg[o].lson,val);
    else
        build(mid+1,r,Seg[o].rson,val);
}
void merge(int &x,int y,int l,int r){
    if(x*y==0){
        x=x+y;
        return;
    }
    min1+=Seg[Seg[x].rson].sz*Seg[Seg[y].lson].sz;
    min2+=Seg[Seg[x].lson].sz*Seg[Seg[y].rson].sz;
    if(l==r){
        Seg[x].sz=Seg[x].sz+Seg[y].sz;
        return;
    }
    Seg[x].sz=Seg[x].sz+Seg[y].sz;
    int mid=(l+r)>>1;
    merge(Seg[x].lson,Seg[y].lson,1,mid);
    merge(Seg[x].rson,Seg[y].rson,mid+1,r);
    throwin(y);
    return;
}
int solve(void){
    int x;
    scanf("%lld",&x);
    if(!x){
        int lson,rson;
        lson=solve();
        rson=solve();
        min1=0;
        min2=0;
        int t=lson;
        merge(t,rson,1,n);
        // printf("%d %d\n",min1,min2);
        ans+=min(min1,min2);
        return t;
    }
    else{
        int t=0;
        // printf("ok\n");
        build(1,n,t,x);
        // printf("ok\n");
        return t;
    }
    return 0;
}
signed main(){
    scanf("%lld",&n);
    solve();
    printf("%lld\n",ans);
    return 0;
}

标签:return,int,rson,POI2011,Tree,Seg,lson,printf,ROT
来源: https://www.cnblogs.com/dreagonm/p/10556403.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有