CSP 後多校十二

2022-09-09 18:27:30 字數 3469 閱讀 1717

簽到題.

a_code

#includeusing namespace std;

namespace bss;

} using namespace bss;

#define ull unsigned int

const int n=1e6+21,inf=1e15;

ull fans;

ull b[n],ans[n];

int m,n,cnt;

int a[n];

pairstk[n];

signed main()),sort(b+1,b+1+n);

for(int i=1;i<=n;i++) a[i]-=a[n]-1;

stk[++cnt]=mp(a[1]+1,inf),ans[1]=0;

for(int i=2;i<=n;i++));

for(int i=1;i<=n;i++) fans+=ans[i]*b[i];

printf("%llu\n",fans),exit(0);

}

簽到題.

b_code#includeusing namespace std;

namespace bss;

auto read=()->int;

} using namespace bss;

#define ll long long

const ll mod=1e9+7;

const int n=37000021,m=37000000;

int m,n,st,cnt,minx,ans;

int val[n],pre[n],vis[n];

auto ksm=(int a,int b,int c,int w=1)->int;

auto inc=(int i,int j)->int;

auto work=()->void

else for(int i=1;i<=n;i++) val[i]=read();

for(int i=1;i<=n;i++) vis[val[i]]=1;

for(int i=0;i<=n;i++) if(!vis[i])

if(!minx)

for(int i=0;i<=minx+5;i++) vis[i]=0;

pre[0]=1;

for(int i=1;i<=n;i++)

} for(int i=st+1,j=0;i<=n;i++)

else if(vis[val[j+1]]>1) j++,vis[val[j]]--;

else break;

} // cout<<"i and j: "<

可以想到 \(kruscal\) 重構樹,(因為昨天剛剛刷了雜題..

正解由部分分中鏈的笛卡爾樹啟發而來了 \(kruscal\).

本題中想辦法構造一種重構樹滿足任意兩點之間的最大/小點是 \(lca\) 即可,感覺有點套路.

c_code#includeusing namespace std;

namespace bss;

} using namespace bss;

#define ll long long int

const int n=2e6+21;

ll ans;

int m,n,rt,ts,cnt;

int fa[n],dfn[n],head[n],siz[n];

vectorto[n];

struct i e[n<<1];

struct fenwick

inline int qry(int x)

}bit;

inline int find(int x)

auto add=(int u,int v)->void;

inline void sch(int u)

inline void dfs(int u)

signed main()

for(int i=n;i>=1;i--)

} for(int i=1;i<=n;i++) if(find(i)==i)

sch(rt); ts=0;

for(int i=1;i<=n;i++) fa[i]=i,head[i]=0;

for(int i=1;i<=n;i++)\),那麼 \(u,v\) 兩點之間的最短距離要麼是 \(a_u\),要麼是通過中間的某個點 \(x\)到達 \(v\),即 \(dis\+a_x\).

於是我們發現考慮哪些點會作為 \(u\) 的中間點即可,也就是我們需要求出所有和修改有關的點到其它點的 \(dis\).

很暴力的思想就是跑全源最短路,但是發現圖是完全圖的話,那麼複雜度直接變成 \(o(m^3log)\).

依舊是考慮盡量少列舉重複或無用的資訊,那麼發現對於題裡給的 \(m\) 條邊中沒有出現的 \(path\\) 的情況,\(u,v\) 兩點的直接距離依然是 \(a_u\) ,發現這樣的 \(v\) 對於點 \(u\) 很多,於是線段樹就好了.

也就是在跑全源最短路的過程中,模擬 \(dijkstra\),線段樹維護一些修改和最小值就好了.

好像還有一些 \(dalao\) 直接把線段樹去掉,選擇把貢獻移到單點上,很牛逼.

d_code#includeusing namespace std;

namespace bss;

} using namespace bss;

#define ls (x<<1)

#define rs (x<<1|1)

const int n=1e6+21,inf=1e15;

int m,n,cnt,ts,ans;

int val[n],fa[n],siz[n],vis[n],dfn[n],rk[n],dis[n];

vectorvec;

vector> to[n];

multisets;

unordered_maped[n];

struct i tr[n<<2];

int find(int x)

auto getval=(int x,int l,int r,int w)->void;

auto spread=(int x,int l,int r)->void;

auto pushup=(int x)->void

void upd(int x,int l,int r,int px,int w)

void change(int x,int l,int r,int ql,int qr,int w)

auto bfs=(int x)->void{

int minval=inf,dad=x;

for(auto i : vec) dis[i]=val[x];

dis[x]=0; // cout<<"x:"for(int i=1;i<=n;i++) if(find(i)==x) vec.pb(i);

cnt=vec.size(),sort(vec.begin(),vec.end());

for(int i=0;i

CSP 後多校十七

不難發現乙個聯通塊內只要點數大於邊數就可以.a code includeusing namespace std namespace bss using namespace bss define merge asasasasas define yes puts ladica define no put...

CSP 後多校十四

複雜度為 o n 2 及以上的時候還是很好想的,不過這題資料過水,o n 2 隨便寫.考慮怎麼優化,不難發現每個關係之間形成了類似於圖之間的關係.於是倍增就可以了,不過題解裡寫了乙個字符集大小的限制,沒太懂,希望有會的 dalao 能來踹我.a code includeusing namespace...

礦物運輸 CSP多校聯考 2019

在某個不知名的行星上蘊含著大量冰晶礦,jim 和他的好兄弟 swan 自然不能放過這個賺錢的好機會。jim 在整個星球上開掘樹型礦洞,每個礦坑之間都有礦道相連。jim 和 swan 在每個礦坑開採了大量的礦石,現在他們面臨乙個新的問題,怎麼把所有的礦石運出去。已知,礦坑與礦坑之間形成了有向的樹形結構...