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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1380 D - Berserk And Fireball(思维,贪心)

發(fā)布時間:2023/12/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1380 D - Berserk And Fireball(思维,贪心) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

LINK

考慮怎樣刪除區(qū)間[l,r][l,r][l,r]內(nèi)的戰(zhàn)士

考慮一種無腦的做法,讓區(qū)間[l,r][l,r][l,r]一直使用狂暴,剩下一個和al?1a_l-1al??1ar+1a_{r+1}ar+1?狂暴就能全部消除

但如果區(qū)間中的最大數(shù)比al?1a_{l-1}al?1?ar+1a_{r+1}ar+1?都大,那么最后它是無法消除的,我們稱這種數(shù)字為特殊數(shù)字

所以應(yīng)該先用火球術(shù)把這種比兩邊大的數(shù)字消掉才行

此時如果(r?l+1)<k(r-l+1)<k(r?l+1)<k,不足以使用一次火球則無解,其余都可以消除

這里需要分兩種情況

①.當(dāng)y?k<=xy*k<=xy?k<=x時,狂暴比較劃算

所以在消除特殊數(shù)字的同時還要最小化火球術(shù)的次數(shù)

當(dāng)區(qū)間中沒有特殊數(shù)字時,一直狂暴即可,代價(r?l+1)?y(r-l+1)*y(r?l+1)?y

否則,一直在最大數(shù)字周圍使用狂暴知道只剩kkk個元素,用一次火球即可消除干凈

②.當(dāng)y?k>xy*k>xy?k>x時,火球比較劃算

所以在消除特殊數(shù)字的同時還要最大化火球術(shù)的次數(shù)

z=(r?l+1)%kz=(r-l+1)\%kz=(r?l+1)%k,顯然可以先用狂暴消掉任意zzz個數(shù)字,然后一直用火球術(shù)即可消干凈

#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 1e6+10; int n,m,t,x,y,k,flag = 1; int a[maxn],b[maxn],mx[maxn][22],lg[maxn]; unordered_map<int,int>ma; int get(int l,int r) {int k = lg[r-l+1];return max( mx[l][k],mx[r-(1<<k)+1][k] ); } int solve(int l,int r) {if( l>r ) return 0ll;int w = get(l,r);if( w>max( a[l-1],a[r+1] ) && (r-l+1)<k ) flag = 0;if( y*k<=x ){if( w<max( a[l-1],a[r+1] ) ) return y*(r-l+1);else if( w>max( a[l-1],a[r+1]) ) return ( r-l+1-k )*y+x; }else{int z = (r-l+1)%k;return (r-l+1)/k*x+z*y; } } signed main() {ios::sync_with_stdio( false ); cin.tie( 0 ); cout.tie( 0 );for(int i=2;i<=1000000;i++) lg[i] = lg[i>>1]+1;ma.clear();cin >> n >> m >> x >> k >> y;for(int i=1;i<=n;i++) cin >> a[i], ma[a[i]] = i, mx[i][0] = a[i];for(int j=1;j<=20;j++)for(int i=1;i+(1<<j)-1<=n;i++)mx[i][j] = max( mx[i][j-1],mx[i+(1<<(j-1))][j-1] );int las = 0, ans = 0;for(int i=1;i<=m;i++){cin >> b[i];int x = ma[b[i]];if( !ma.count( b[i] ) ) flag = 0;else{if( x<las ) flag = 0;else las = x;}}b[0] = 0;for(int i=1;i<=m;i++){if( i==1 ){if( a[1]==b[1] ) continue;ans += solve( 1,ma[b[1]]-1 );}elseans += solve( ma[b[i-1]]+1,ma[b[i]]-1 );}if( a[n]!=b[m] ) ans += solve( ma[b[m]]+1,n );if( flag==0 ) ans = -1;cout << ans << endl; }

總結(jié)

以上是生活随笔為你收集整理的1380 D - Berserk And Fireball(思维,贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。