d.
題意:給2組資料a和b陣列,每次有2種操作:(+,l,r,x)把a陣列第l個到第r個元素全置為x,(?,l,r)查詢[l,r]之間哪些位置滿足a[i]>=b[i](i>=l && i<=r)並把這些位置的數量統計
一直想很久,沒想到什麼有效的方案,直到看到題解才明白過來,原來線段樹套平衡樹還有這種情況:裡面其實不是平衡樹,只是有序表。
然後這題就轉換為區間查詢數對應排名
由於此題不用對2個陣列都修改,其中1個b樹可作為固定的線段樹套有序表以節省時間,另外1個表a樹則單純使用線段樹的方法先修改,再更新對應b樹結點的排名
這裡查詢排名如果全部logn查詢會因為常數太大直接卡,注意每個結點都含有序表並且上下有包含關係
那咱們可以在b樹自底向上更新父結點排名對應左右子樹裡的排名,用歸併排序的方法,占用空間才o(nlogn),時間也是o(nlogn)
順帶把會改變的a樹1個個結點查詢b樹查出排名,修改時先查出根結點對應位置,再根據位置子樹表一邊向下更新一邊轉移到子樹對應位置
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef __int64 ll;
int max(int a,int b)
int min(int a,int b)
intcnt;
const
int n=100010,m=262150,e=1768950
;int
n,m,i,a[n],b[n],x,l,r;
intst[m],en[m],v[m],tag[m],pl[e],pr[e],pool[e],cur;
ll ans,sum;
void build(int x,int l,int
r)
int mid=((l+r)>>1
); build(x
<<1
,l,mid);
build((x
<<1)|1,mid+1
,r);
v[x]=v[x<<1]+v[(x<<1)|1
];
int al=st[x<<1],ar=en[x<<1],bl=st[(x<<1)|1],br=en[(x<<1)|1
]; st[x]=cur+1
;
while(al<=ar&&bl<=br)pool[++cur]=pool[al]];
while(al<=ar)pool[++cur]=pool[al++];
while(bl<=br)pool[++cur]=pool[bl++];
en[x]=cur;
al=st[x<<1],bl=st[x<<1|1
];
for(int i=st[x];i<=cur;i++)
}inline
void rankpt(int x,int
p)inline
void pushdown(int
x)void update(int x,int a,int b,int
p) pushdown(x);
int mid=(a+b)>>1
;
if(l<=mid)update(x<<1
,a,mid,pl[p]);
if(r>mid)update((x<<1)|1,mid+1
,b,pr[p]);
v[x]=v[x<<1]+v[(x<<1)|1];}
void query(int x,int a,int
b) pushdown(x);
int mid=((a+b)>>1
);
if(l<=mid)query(x<<1
,a,mid);
if(r>mid)query((x<<1)|1,mid+1
,b);
v[x]=v[x<<1]+v[(x<<1)|1];}
inline
int lower(int
x)int seeda, seedb, c = ~(1
<<31), mm = (1
<<16)-1
;int rnd(int
last)
intmain()
}printf(
"%i64d\n
",sum);
}return0;
}
f.題意,有1個圖(可能不是全部聯通的)gi表示去掉第i個點的圖權值(1個連通圖的權值=所有點的積 多個連通圖的權值=連通圖權值之和)
求1*g1+2*g2+3*g3+...+n*gn
求點雙聯通分量,求出割點,然後求出此點以外點雙聯通連通圖的權值
#include #includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 100005
#define mod 1000000007
int inv(int
x)while(mod >>= 1
);
return
res;
}vector
g[maxn];
intw[maxn];
intz[maxn];
intcz[maxn];
intpre[maxn];
bool
iscut[maxn];
intncc_no[maxn];
vector
ncc[maxn];
intncc_size[maxn];
intncc_cnt;
intclock;
int tarjan(int u, int
fa) }
else
if(pre[v] < pre[u] && v !=fa)
lowu =min(lowu, pre[v]);
}if(fa < 0 && child == 1
) iscut[u] = false
;
return
lowu;
}int
main()
while(m--)
memset(z,
0, sizeof
z); memset(pre,
0, sizeof
pre);
memset(iscut,
false, sizeof
iscut);
memset(ncc_no,
0, sizeof
ncc_no);
clock = ncc_cnt = 0
;
for(i=1, sum=0; i<=n; i++)
if(!pre[i])
for(i=1, y=0; i<=n; i++)
printf(
"%d\n
", y);
}return0;
}
g.
2016多校聯賽 hdu 5724 Chess
此題就是乙個sg函式的題目,需要找出每一行的sg值,然後異或就可以咯。找sg需要在初始化的時候就找,也就是在t之前,暴力找出所有情況的sg。注意這個題只有20行,所以狀態壓縮一下就可以,每一行有棋子的地方就置為1,每一的地方就是0.include include include include in...
2016多校聯賽 hdu 5728 PowMod
題意就是題目上的圖的那個樣子。給定的n是乙個n is a square free number.他是乙個無平方因子數。也就是說他分解質因子後質因子的指數是1.解決這個題分兩步,先說第二步,第二步是 bzoj 3884原題,只是在這個題我們需要算底數是多少而已。引用一下別人的證明 本人巨菜 考慮尤拉定...
多校聯賽總結
首先是一些資料 2014 multi university training contest 1 by fzu a 數學 費馬小定理 b 網路流 最小k路徑覆蓋 c 樹形dp 樹的重心 資料結構 d 貪心 巧妙 e 數學 dp 隱含馬爾科夫模型 f 線段樹 函式式 二分 g 線段樹 狀態壓縮 h 模...