Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:D. Frets On Fire
思路:明明可以離散化+二分寫,思路硬是歪到了線段樹上,自閉了,真實(shí)弟弟,怪不得其他人過得那么快
只和查詢的區(qū)間長度有關(guān)系,排完序如果相鄰的兩個(gè)點(diǎn)的差值小于等于查詢的區(qū)間長度,那么給結(jié)果帶來的變化就會(huì)新增差值個(gè)數(shù),如果大于區(qū)間長度那么就會(huì)新增區(qū)間長度個(gè)數(shù)
維護(hù)的話,線段樹和二分都可以,二分需要離散化處理,再給差值排個(gè)序,每次找到第一個(gè)大于當(dāng)前區(qū)間長度的差值位置就好了,(沒實(shí)現(xiàn),但是理論上應(yīng)該沒問題)
線段樹直接動(dòng)態(tài)開點(diǎn)可以不用離散化。。
實(shí)現(xiàn)代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define mid ll m = (l + r) /2 const ll M = 1e5+10; #define ROF(i,a,b) for(ll i=a;i>=b;i--) ll sum[M*40],num[M*40]; ll ls[M*40],rs[M*40]; ll idx; void update(ll p,ll c,ll l,ll r,ll &rt){if(!rt) rt = ++idx;sum[rt] += c;num[rt] += 1;if(l == r){return ;}mid;if(p <= m) update(p,c,l,m,ls[rt]);else update(p,c,m+1,r,rs[rt]); }ll query(ll L,ll R,ll l,ll r,ll rt){if(L <= l&&R >= r){return sum[rt];}mid;ll ret = 0;if(L <= m) ret += query(L,R,l,m,ls[rt]);if(R > m) ret += query(L,R,m+1,r,rs[rt]);return ret; }ll ask(ll L,ll R,ll l,ll r,int rt){if(L <= l&&R >= r){return num[rt];}mid;ll ret = 0;if(L <= m) ret += ask(L,R,l,m,ls[rt]);if(R > m) ret += ask(L,R,m+1,r,rs[rt]);return ret; } ll a[2*M]; int main() {ll n,m,x,y,rt = 0;scanf("%lld",&n);for(ll i = 1;i <= n;i ++){scanf("%lld",&a[i]);}sort(a+1,a+1+n);for(ll i = 2;i <= n;i ++){ll num = a[i] - a[i-1];update(num,num,1,1e18,rt);}scanf("%lld",&m);for(ll i = 1;i <= m;i ++){scanf("%lld%lld",&x,&y);ll num = y-x+1;ll ans = num;ans += query(1,num,1,1e18,rt);//cout<<ans<<" ";ans += ask(num+1,1e18,1,1e18,rt)*num;printf("%lld\n",ans);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/kls123/p/10663399.html
總結(jié)
以上是生活随笔為你收集整理的Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动架构-数据库分库和全版本升级
- 下一篇: src/main/resorces a