方塊 III 線段樹 思維

2021-09-27 06:32:56 字數 962 閱讀 2810

這題並不難,主要就是要想到,怎麼才可以做到將相同的數字給分開來,而方法就是將最開始出現的數字,和上乙個這個數字出現的位置之間,全部加上價值,而上乙個這樣的位置,減去價值。就這樣一直到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...