國家一級爬山運動員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分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...