這題並不難,主要就是要想到,怎麼才可以做到將相同的數字給分開來,而方法就是將最開始出現的數字,和上乙個這個數字出現的位置之間,全部加上價值,而上乙個這樣的位置,減去價值。就這樣一直到n,最大的那個t[1],便是答案了,有點dp的感覺,但不是。
#include#include#include#include#include#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
#define ll long long
using namespace std;
const int mx=1e5+9;
int n,m,a[mx],va[mx],t[mx<<2],laze[mx<<2];
vectorvec[mx];
void pushdown(int k)
return ;
}void pushup(int k)
void update(int k,int l,int r,int l,int r,int val)
pushdown(k);
int mid=(l+r)>>1;
if( l<=mid )
update(lson,l,r,val);
if( midupdate(rson,l,r,val);
pushup(k);
}int main()
for( int i=1 ; i<=m ; i++ )
scanf("%d",&va[i]);
int ans=0;
for( int i=1 ; i<=n ; i++ )
vec[a[i]].push_back(i); // 這個vec是用來存數字a[i]的出現位置,
ans=max(ans,t[1]);
}printf("%d\n",ans);
}return 0;
}
思維 線段樹dp
不得不說這題是真的難,看題解都差點沒用理解。給定平面上若干 1e5 點,每個點ab兩個權值,要求將其分為兩組,a組的a權值和加b組的b權值和最大,劃分條件轉化一下就是,不能有a出現在b的右下,也就是要找到一條不降的折線,其上是a,其下是b。我們認為位於折線上的那些點屬於b。暴力dp是可做的,離散化x...
思維題 方塊 I
題目鏈結 有 n 個方塊排成一排,每個方塊都染有顏色,第 i 個的顏色為 ci,一共有三種顏色,分別為紅,黃,藍,現在你可以對相鄰的顏色不同的方塊進行施法,使其變成第三種顏色,比如對相鄰的紅方塊和黃方塊進行施法,就會使其合併為藍方塊。施法順序的不同,可能對最終的結果產生不同的影響,問在最優策略下,最...
線段樹 思維題 樓房重建
小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上 0,0 點的位置,第i棟樓房可以用一條連線 i,0 和 i,hi 的線段表示,其中hi...