NOIP2016提高A組模擬9 9 爬山

2022-08-18 05:18:14 字數 1675 閱讀 6685

國家一級爬山運動員h10今天獲得了一張有著密密麻麻標記的地圖,在好奇心的驅使下,他又踏上了去爬山的路。

對於爬山,h10有乙個原則,那就是不走回頭路,於是他把地圖上的所有邊都標記成了有向邊。他決定從點s出發,每到達乙個新的節點他就可以獲得一定的成就值。同時h10又是乙個很珍惜時間的運動員,他不希望這次爬山的成就值白白浪費,所以最後他一定要在乙個存檔點停下,儲存自己的成就值。

請你計算出在此次爬山運動中h10能夠得到的最大成就值。保證h10能走到存檔點。

從30%的資料範圍得到啟示,

可以用tarjan縮點,每個點的值就是它所包含的原來的點的成就值總和。

因為\(n<=500000\),有點大,會爆棧,那麼就打個人工棧。

剩下就沒什麼了,最長路、拓撲+dp,隨便。

#include #include #include #include #include #include #include const long long maxlongint=2147483647;

const long long mo=1000000007;

const long long n=500005;

using namespace std;

long long n,m,last[n*2],next[n*2],to[n*2],belong[n],d[n],last1[n*2],next1[n*2],to1[n*2],a[n],sum[n],s,t0,dis[n],tot,dd;

long long dfn[n],low[n],be,ans,z[n],top;

bool bz[n];

long long bj(long long x,long long y)

long long bj1(long long x,long long y)

long long tarjan(long long x1)

long long i;

for(i=last[x];i;i=next[i])

else

if(!belong[to[i]])

low[x]=min(low[to[i]],low[x]);

} if(!i && top>1)

low[z[top-1]]=min(low[z[top-1]],low[x]);

if(!i)

}top--;

} else

z[++top]=to[i]; }}

long long spfa(long long x)

}} }

}int main()

for(long long i=1;i<=n;i++)

memset(bz,true,sizeof(bz));

scanf("%lld%lld",&s,&t0);

tot=0;

tarjan(s);

tot=0;

for(long long k=1;k<=n;k++)

for(long long i=last[k];i;i=next[i])

ans=0;

memset(bz,true,sizeof(bz));

memset(d,0,sizeof(d));

spfa(s);

for(long long i=1;i<=t0;i++)

printf("%lld",ans);

}

NOIP2016提高組模擬 積木

比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...

計數 NOIP2016提高A組模擬7 15

樣例輸入 2 10 樣例輸出 90資料範圍 剖解題目 題目說的很明了了。思路 求方案數,一般會設計道dp,規律之類的。解法 數字dp,設f i j 表示當前到了第i位,這一位的數字是j的方案數。自然有 f i j f i 1 l f i j 0 l k 且 l 0 and j 0 看到這位數,很明顯...

NOIP2016提高A組模擬9 2 單峰

問1 n,n個數的全排列中有多少個滿足單峰序列的性質,並把答案mod 1e9 7 這題還是很簡單的,一開始打了乙個50分的做法,然後發現答案就是2n 1,然後沒有發現輸入也會爆,於是就得了50分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...