線段相交的異或值 (線段樹 or 優先佇列)

2022-06-27 05:42:11 字數 2209 閱讀 5132

vvq 最近迷上了線段這種東西

現在他手上有 n 條線段,他希望在其中找到兩條有公共點的線段,使得他們的異或值最大。 定義線段的異或值為它們並的長度減他們交的長度

第一行包括乙個正整數 n,表示 vvq 擁有的線段條數。

接下來 n 行每行包括兩個正整數 l,r,表示 vvq 擁有的線段的 左右端點。

一行乙個整數,表示能得到的最大異或值
示例1

3 

10 100

1 50

50 100

99

選擇第二條和第三條,99-0=99

1<=n<=200000,1<=l<=r<=1e8

題意 : 在座標軸上面有很多線段,問你所有有公共點的線段的異或值最大是多少?

思路 : 所以線段只有 3 種情況, 1 是不相交, 2是相交, 3是包含,第一種情況的答案是 0, 對於第二種情況 假設2條線段i,j,且靠右的線段是 j,則此情況下的異或值是

rj+lj-(ri+li),將 i 看成是不變的量,讓 j線段的值最大即可,線段樹維護就可以了, 對於第三種情況,答案是 (rj-lj)-(ri-li),則此時值需要讓 ri-rl的值最小即可。

**示例 :

#define ll long long

const int maxn = 2e5+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

#define lson k<<1

#define rson k<<1|1

struct edge

}pre[maxn];

struct node

t[maxn<<2];

void pushup(int k)

void build(int l, int r, int k)

int mid = (l+r) >> 1;

build(l, mid, lson);

build(mid+1, r, rson);

pushup(k);

}int sum = 0;

void query(int l, int r, int k)

int m = (t[k].l+t[k].r)>>1;

if (l <= m) query(l, r, lson);

if (r > m) query(l, r, rson);

}void query2(int l, int r, int k)

int m = (t[k].l+t[k].r)>>1;

if (l <= m) query2(l, r, lson);

if (r > m) query2(l, r, rson);

}int main()

sort(pre+1, pre+1+n);

build(1, n, 1);

int ans = 0;

edge tem;

for(int i = 1; i <= n; i++)

printf("%d\n", ans);

return 0;

}

#includeusing namespace std;

typedef long long ll;

const int maxn = 2e5+10;

int n, m;

struct p

} p[maxn];

bool cmp(p a, p b)

int main() );

int ans = 0;

for(int i = 1; i < n; i++) );

while(!q.empty() && q.top().r < p[i].l) q.pop();

//p中所有點已按l排序,當前點與佇列裡第乙個點不相交,後面的點一定不相交

if(!q.empty()) ans = max(ans, p[i].l + p[i].r - q.top().l- q.top().r);

q.push(p[i]);

}printf("%d\n", ans);

}return 0;

}

線段樹區間異或

題目描述 akn 覺得第一題太水了,不屑於寫第一題,所以他又玩起了新的遊戲。在遊戲中,他發現,這個遊戲的傷害計算有乙個規律,規律如下 擁有乙個傷害串,是乙個長度為 nnn 的只含字元 0 和字元 1 的字串。規定這個字串的首字元是第乙個字元,即下標從 111 開始。給定乙個範圍 l,r l,r l,...

關於區間異或的線段樹

題 題意 倆個操作,操作1 l,r,x 區間 l,r 的數全部異或上x。操作2 l r 輸出區間 l,r 和 分析 對陣列a建線段樹,對於線段樹的每乙個節點進行二進位制拆位,每個位就統計有多少個1,更新操作對於涵蓋區間的二進位制位就等於其長度減去更新前的1的個數 includeusing names...

權值線段樹套序列線段樹

p3380 模板 二逼平衡樹 樹套樹 主要思路如下 外層為權值線段樹,內層為動態開點線段樹,也就是每個權值線段樹上的節點開乙個動態開點線段樹。外層的權值線段樹支援查詢排名,內層的線段樹限制了區間。實際上就是在普通權值線段樹上查詢的價值變成了在其線段樹上區間查詢返回的值。對於這道模板題,我們先寫幾個函...