真tm線段樹神題。。。 設[
l,r]
複雜值為tl
,r首先對於詢問[l
,r] ,把問題轉化為:∑n
i=1∑
nj=i
ti,j
−∑l−
1i=1
∑l−1
j=it
i,j−
∑ni=
r+1∑
nj=i
ti,j
我們先考慮字首的,字尾的反過來再做一遍就是了。
我們設f
i 為∑i
j=1t
j,i ,那麼fi
的字首和就是所求。
從左到右掃,考慮用一棵權值線段樹維護每個權值的貢獻,掃到
i 時,把≥a
i的權值的貢獻全部乘上
k ,再加上ai
對fi 貢獻即可。 ai
對fi 貢獻如何計算呢?考慮預處理每個ai
對fi 的貢獻,也就是∑i
j=1k
numj
,i,num
j,i 表示[j
,i] 中比ai
小的數的個數。開一棵線段樹,按ai
從小到大插入,位置
x 表示上式中為j=
x的貢獻,每次插入就是把[1
,i] 乘上
k ,然後查詢ai
貢獻是在插入之前,就是[1
,i−1
] 的和,因為這個時候對於
i 位置的乘
k操作都是多餘的,所以記錄下多乘的
k ,最後乘上逆元即可。 然後f
i就求出來了,字首和一下,再反著做一遍,對於每個詢問就o(
1)了。
**:
#include
#include
#include
#include
#define ll long long
#define n 300010
#define mid (l+r>>1)
#define pii pair
#define fs first
#define sc second
using namespace std;
const int
mod=1000000007;
int n,m,k,a[n],z[n];
pii r[n];
ll mi[n],f[2][n],s[2][n],inv[n];
int read()
ll ksm(ll a,int b)return r;}
struct tree
void update()
void cal(int d)
void pushdown()
}void build(int l,int r,int f)
void add(int pl,ll d,int l,int r)
pushdown();
if(pl<=mid) ls->add(pl,d,l,mid);
else rs->add(pl,d,mid+1,r);
update();
}void mdf(int lx,int rx,int d,int l,int r)
pushdown();
if(rx<=mid) ls->mdf(lx,rx,d,l,mid);
else
if(lx>mid) rs->mdf(lx,rx,d,mid+1,r);
else ls->mdf(lx,mid,d,l,mid),rs->mdf(mid+1,rx,d,mid+1,r);
update();
}ll qry(int lx,int rx,int l,int r)
ll getinv(int pl,int l,int r)
}*xtr;
void work(int b)
xtr->build(1,n,0);
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
(f[b][i]+=f[b][i-1])%=mod;
if(b)
for(int i=1;i<=(n>>1);i++)
swap(f[b][i],f[b][n-i+1]);
}int main()
return
0;}
2018雅禮集訓1 12 小C飲水記
題面 考場上sb用set,式子還沒化成o t 的,總複雜度o ntlogn n t2 70分滾粗。首先對於一段長度為 k 區間,假設按w1 wk的順序來選,貢獻為 i 1kw i2i 所以顯然要按從大到小的順序來選,然後發現本題不要求取模,所以當 i 很大時,wi 的貢獻就可以忽略不計了。所以我們只...
雅禮集訓 小C飲水記
標籤 鍊錶,貪心 暴力做法 貪心,對於每個區間,從大到小排序,顯然,wi大的對答案貢獻越大 時間複雜度o n 3 log n 正解 因為題目輸出實數,所以當交換次數到一定時候,對答案的影響可以忽略不計 這個t大約是30次 對每個wi的貢獻單獨計算 每個wi只對相鄰的t個產生貢獻,所以取前後各t個 計...
雅禮集訓及WC2018划水記
noip考成250,沒得去thuwc和pkuwc,和czy等去參加本來只有samjia和棟棟的集訓隊模擬。抱著 的心態去比賽。第一天剛到比較困,比賽有點沒精神,看到t3的67暴力是計算幾何很高興,結果寫完卡常失敗只有20多。第一題貪心,第二題需要一些觀察。下午太睏,就腐過去了 第二天是陳通的題,信心...