日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 1535E Gold Transfer(树上倍增+交互)

發布時間:2024/4/11 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1535E Gold Transfer(树上倍增+交互) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一棵初始時只有一個點的樹,每個點都有兩個值:ai,cia_i,c_iai?,ci?,分別代表黃金的個數和單價。需要執行 mmm 次操作,每次操作分為兩種類型:

  • 1piaici1\ p_i\ a_i\ c_i1?pi??ai??ci?添加一個新點 iiipip_ipi? 為其父節點,ai,cia_i,c_iai?,ci? 如上一段所述,保證 ci>cpic_i>c_{p_i}ci?>cpi??
  • 2vw2\ v\ w2?v?w:需要從點 vvv 到根節點的這條路徑上采集 www 個單位的黃金,問如何采集才能使得總花費最少
  • 注意對于每次操作 222 是會疊加的,且強制在線

    題目分析:如果觀察到 ci>cpic_i>c_{p_i}ci?>cpi?? 這個條件的話,不難看出這是個很簡單的數據結構+貪心了,因為每次挑選的點,都是靠近根節點且連續的一系列非空節點

    所以問題轉換為了:

  • 插入一個新點
  • 查找某個點的深度最小的非空祖先
  • 刪除掉某個節點
  • 不難想到樹上倍增,因為之前也做過一個強制在線增加新點的題目:CodeForces - 932D

    相應的處理方法如下:

  • 對于新點 O(logn)O(logn)O(logn) 預處理倍增數組
  • 查找 axa_xax? 非空的祖先
  • ax=0a_x=0ax?=0
  • 時間復雜度的話,每次遍歷到一個祖先節點,要么被刪除,要么就停止,而查找祖先節點的復雜度是 O(lgon)O(lgon)O(lgon) 的,所以時間復雜度是 O(nlogn)O(nlogn)O(nlogn)

    代碼:

    // Problem: E. Gold Transfer // Contest: Codeforces - Educational Codeforces Round 110 (Rated for Div. 2) // URL: https://codeforces.com/contest/1535/problem/E // Memory Limit: 256 MB // Time Limit: 4500 ms // // Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<list> #include<unordered_map> #define lowbit(x) x&-x using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=1e6+100; int a[N],c[N],dp[N][25]; int get_fa(int u) {for(int i=20;i>=0;i--) {if(a[dp[u][i]]) {u=dp[u][i];}}return u; } int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;scanf("%d%d%d",&n,&a[0],&c[0]);for(int i=1;i<=n;i++) {int op;scanf("%d",&op);if(op==1) {scanf("%d%d%d",&dp[i][0],a+i,c+i);for(int j=1;j<=20;j++) {dp[i][j]=dp[dp[i][j-1]][j-1];}} else if(op==2) {int v,w;LL ans1=0,ans2=0;scanf("%d%d",&v,&w);while(a[v]&&w) {int u=get_fa(v);int mmin=min(a[u],w);w-=mmin;a[u]-=mmin;ans1+=mmin;ans2+=1LL*mmin*c[u];}printf("%lld %lld\n",ans1,ans2);fflush(stdout);}}return 0; }

    總結

    以上是生活随笔為你收集整理的CodeForces - 1535E Gold Transfer(树上倍增+交互)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。