簽到題.
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 在每個礦坑開採了大量的礦石,現在他們面臨乙個新的問題,怎麼把所有的礦石運出去。已知,礦坑與礦坑之間形成了有向的樹形結構...