JZOJ 4811 排隊 線段樹的方法

2021-07-23 10:40:07 字數 2235 閱讀 2057

關鍵是操作1

我們要將order前面x個空的房間補滿。我們盡量往左補,如果能夠補完就補,不能補完就往右補直到補完為止。

void modify(int

s,int l,int r,int

x,bool p)

int wz=(l+r)/2,prd=tree[s

*2];

if (prd>=x/*左邊有空位*/) modify(s

*2,l,wz,x,p);

else

tree[s]=tree[s

*2]+tree[s

*2+1];

}

至於什麼倍增等的基礎演算法自己去實現。

#include

#include

#include

#include

#include

#define n 100010

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fd(i,a,b) for(i=a;i>=b;i--)

#define edge(i,x) for(i=head[x];i;i=next[i])

using namespace std;

int lca,ans,x,y,i,j,cnt,n,t,op,tot,mn;

int c[n*2][2],o[n],o1[n],deep[n],go[n*2],next[n*2],head[n*2],f[n][20],tree[n*10];

bool b[n];

void lb(int

x,int

y)void bs(int

x) o[++o[0]]=x;

}void build(int

s,int l,int r)

int wz=(l+r)/2;

build(s

*2,l,wz);

build(s

*2+1,wz+1,r);

tree[s]=tree[s

*2]+tree[s

*2+1];

}void modify(int

s,int l,int r,int

x,bool p)

int wz=(l+r)/2,prd=tree[s

*2];

if (prd>=x) modify(s

*2,l,wz,x,p);

else

tree[s]=tree[s

*2]+tree[s

*2+1];

}void change(int

s,int l,int r,int

x) if (l==r) return;

int wz=(l+r)/2;

if (x

<=wz) change(s

*2,l,wz,x);

else change(s

*2+1,wz+1,r,x);

tree[s]=tree[s

*2]+tree[s

*2+1];

}void qsort(int l,int r)

}if (lif (iint main()

qsort(1,n-1);

fo(i,1,n-1) lb(c[i][0],c[i][1]),lb(c[i][1],c[i][0]);

bs(1);

fo(i,1,n) o1[o[i]]=i;

build(1,1,n);

fo(i,1,t)

else}}

jzoj1278 排隊(線段樹)

1278.排隊 description 每天,農夫 john 的n 1 n 50,000 頭牛總是按同一序列排隊.有一天,john決定讓一些牛們玩一場飛盤比賽.他準備找一群在對列中為置連續的牛來進行比賽.但是為了避免水平懸殊,牛的身高不應該相差太大.john 準備了q 1 q 180,000 個可能...

bzoj2141 排隊(線段樹 splay)

題目鏈結 分析 之所以找到這道題是因為不想寫dp了 看到網上的題解都是 分塊 線段樹,樹狀陣列 線段樹。立志自己想解法 一開始我在想,能不能用cdq搞 但是cdq版的動態逆序對好像是單點修改 實際上逆序對的個數就是每個數字形成的逆序對之和 而每個數會和在ta之前比ta大的數以及在ta之後比ta大的數...

bzoj3333 排隊計畫 (線段樹)

time limit 20 sec memory limit 128 mb submit 717 solved 323 submit status discuss 6 2160 163 164 161 167 160 2 3 63 1 題目思路 每次操作是把乙個數後面所有小於等於該數值的位置都排序重...