【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)
題干:
巴尼住在NYC。NYC具有從1開始的正整數(shù)編號(hào)的無數(shù)個(gè)交叉點(diǎn)。在交叉點(diǎn)?i?和?2i?之間以及?i和?2i?+?1?之間存在雙向道路,對(duì)任意整數(shù)?i?都滿足。在任意兩點(diǎn)之間都有且只有一條最短路。
?
最初任何人都可以通過任何道路免費(fèi)。 但是后來發(fā)生了 q 個(gè)事件。 有兩種類型的事件:
1. 政府制定新規(guī)。 一個(gè)規(guī)則可以用三個(gè)整數(shù)表示?v,?u?和?w。經(jīng)過這次操作,點(diǎn)?u?到點(diǎn)?v?路徑上的所有點(diǎn)增加?w?元路費(fèi)。
2. 巴尼從點(diǎn)?v?通過最短路移動(dòng)到點(diǎn)?u。
現(xiàn)巴尼想知道,他的每一次移動(dòng)需要花多少錢
Input
第一行包含一個(gè)整數(shù)?q?(1?≤?q?≤?1?000).
之后?q?行,每行包含一個(gè)事件。加路費(fèi)的事件都被描述成?1?v?u?w?,代表將點(diǎn)?u?到點(diǎn)?v?路徑上所有點(diǎn)路費(fèi)增加?w?元。移動(dòng)的事件都被描述成?2?v?u,表示巴尼從點(diǎn)?v?走到點(diǎn)?u.
1?≤?v,?u?≤?1018,?v?≠?u,?1?≤?w?≤?109。
Output
對(duì)于第二類的每個(gè)事件,打印Barney在此事件中通過的所有道路的通行費(fèi)的總和,一行。 以相應(yīng)事件的時(shí)間順序打印答案。
Example
Input
7 1 3 4 30 1 4 1 2 1 3 6 8 2 4 3 1 6 1 40 2 3 7 2 2 4Output
94 0 32Note
In the example testcase:
Here are the intersections used:
?
解題報(bào)告:
? ?注意到i,2i與 i,2i+1的搭配,考慮二叉樹。因?yàn)樽畲蟮闹凳?e18,所以層數(shù)一定不會(huì)很多(最多也就60層吧?)所以對(duì)于更新和查詢均可以暴力。用點(diǎn)權(quán)代表他和父節(jié)點(diǎn)的邊權(quán),一維map就可以解決。(二維map也可以,但是因?yàn)楹⒆庸?jié)點(diǎn)的父節(jié)點(diǎn)是唯一的,所以孩子節(jié)點(diǎn)就可以當(dāng)做這條邊的特征元)
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define FF first #define SS second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e5 + 5; map<ll,ll> mp; void add(ll u,ll v,ll w) {while(u!=v) {if(u>v) mp[u] += w,u /= 2;else mp[v] += w,v /= 2;} } ll sum(ll u,ll v) {ll res = 0;while(u!=v) {if(u>v) res += mp[u],u /= 2;else res += mp[v],v /= 2;}return res; } int main() {int q,op;ll u,v,w;cin>>q;while(q--) {scanf("%d",&op);if(op == 1) {scanf("%lld%lld%lld",&u,&v,&w);add(u,v,w);}else {scanf("%lld%lld",&u,&v);printf("%lld\n",sum(u,v));}}return 0 ; }?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【CodeForces - 697C】Lorenzo Von Matterhorn(二叉树,思维)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CCNP-第二篇-SLA扩展+EIGRP
- 下一篇: 【机器学习】 - 激活函数与交叉熵Sig