「bjoi2018」鏈上二次求和
我說今天上午寫部落格吧。怕自己寫一上午,就決定先寫道題。
然後我就調了一上午線段樹。
花了2h找到lazy標記沒有清空。我tm清空了有沒有標記沒清空標記本身。
又花25min找到某個乘法爆int了。int真的淡疼,要不是longlong自帶巨無霸常數,這輩子都不想用int。
乙個上午就沒有了。
1view code//achen
2 #include3
#define for(i,a,b) for(int i=(a);i<=(b);i++)
4#define rep(i,a,b) for(int i=(a);i>=(b);i--)
5#define formylove return 0
6const
int n=200007,p=1e9+7,inv2=5e8+4
;7 typedef long
long
ll;8 typedef double
db;9
using
namespace
std;
10int
n,m,a[n],sum[n];
1112 templatevoid read(t &x)
1819
int mo(int x)
2021
int sg[n<<2],si0[n<<2],si1[n<<2],si2[n<<2
];22
bool tg[n<<2
];23
struct
tag lz[n<<2
],pls;
26 tag operator +(const tag&a,const tag&b) ; }
2728
#define lc (x<<1)
29#define rc ((x<<1)|1)
30#define mid ((l+r)>>1)
31void addtag(int
x,tag y)
3738
void down(int
x) ;/////////43}
4445
void build(int x,int l,int
r) 50 build(lc,l,mid); build(rc,mid+1
,r);
51 sg[x]=mo(sg[lc]+sg[rc]);
52 si0[x]=mo(si0[lc]+si0[rc]);
53 si1[x]=mo(si1[lc]+si1[rc]);
54 si2[x]=mo(si2[lc]+si2[rc]);55}
5657
void upd(int x,int l,int r,int ql,int
qr)
59down(x);
60if(ql<=mid) upd(lc,l,mid,ql,qr);
61if(qr>mid) upd(rc,mid+1
,r,ql,qr);
62 sg[x]=mo(sg[lc]+sg[rc]);63}
6465
int qry(int x,int l,int r,int ql,int
qr)
7374
intmain()
79 for(i,1,n) sum[i]=mo(sum[i-1]+sum[i]);
80 build(1,1
,n);
81 for(i,1
,m) ; upd(1,1
,n,l,r);
88if(r
90 upd(1,1,n,r+1
,n); 91}
92}93else
if(o==2
) 97}98
formylove;
99 }
BJOI2018鏈上二次求和 線段樹
l,r 的限制可以拆成 1,l 1 1,r 然後考慮推式子。設s is i si 為a ia i ai 的字首和。a ns i 1x j ins j sj i sum sum s s ans i 1x j i n sj sj i 設t it i ti 為s is i si 的字首和。a ns i 1...
BJOI2018 求和 倍增LCA
master 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的 k 次方和,而且每次的 k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了 pupil 但 pupil 並不會這麼複雜的操作,你能幫他解決嗎?輸入格式 第一行...
鏈上二次求和
link 正在肝的一道黑題 首先處理那個奇怪的詢問操作。我們可以對於那個奇怪的東西進行暴力推式 ans l,r sum limits r sum limits sum limits 用字首和搞一下就是 sum limits r sum limits sum 分離一下 sum limits r m s...