2016多校聯賽2

2022-05-02 09:30:07 字數 3911 閱讀 2644

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#include

#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;

}

view code

f.題意,有1個圖(可能不是全部聯通的)gi表示去掉第i個點的圖權值(1個連通圖的權值=所有點的積 多個連通圖的權值=連通圖權值之和)

求1*g1+2*g2+3*g3+...+n*gn

求點雙聯通分量,求出割點,然後求出此點以外點雙聯通連通圖的權值

#include #include 

#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;

}

view code

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 模...