第三次訓練賽

2021-10-01 03:47:30 字數 3831 閱讀 9965

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e5+10;

vector<

int> mp[maxn]

;int n,m,s[maxn]

;int ans=

0,mx;

void

dfs(

int i,

int pre,

int cnt)

//pre是父親節點 不能往回走

intmain()

for(

int i=

1;i)dfs(1

,-1,

0); cout

}

#include

main()

printf

("%d"

,dp[n]);

}

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+

100;

intmain()

if(num0==n&&n&

1) s[0]

=0;//cout(n&1

&&num0!=n) s[xx]

=-s[xx]-1

;for

(int i=

0;i)printf

("%d "

,s[i]);

return0;

}

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

3e5+

100;

int n,num,s[maxn]

,st[maxn][2

],cnt=0;

intmain()

int a,b;

while

(q[0

]!=mx)

ll x;

while

(num--

)return0;

}

#include

main()

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

3e5+

100;

int num[maxn]

,s[maxn][2

],st[maxn]

;int

main()

x=s[0]

[0],y=s[0]

[1];

int num1=

0,num2=

0,num3=0;

//num1含有兩個數的區間數,num2含有第乙個數的區間數,num3含有第二個數的區間數(num2,num3包括num1)

memset

(st,0,

sizeof st)

;for

(int i=

1;i(num1==m-

1||m==

1) flag=1;

//全都含有兩個數或只有乙個區間

else

//分別模擬

int mx=0;

for(

int i=

1;i<=n;i++

) mx=

max(num[i]

,mx);if

(mx+num2==m-1)

//第乙個區間沒統計所以是m-1

flag=1;

else

//統計num3 同上

int mx=0;

for(

int i=

1;i<=n;i++

) mx=

max(num[i]

,mx);if

(mx+num3==m-1)

flag=1;

}}if(flag)

puts

("yes");

else

puts

("no");

return0;

}

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

3e5+

100;

int n,m,s[maxn]

;bool

check

(int x)

else

if(s[i]

}return1;

}int

main()

else

l=mid+1;

} cout

}

很容易就會想到dp了 但是3w*3w的陣列太大了,不現實,看了網上幾篇題解都說dp[i][ j]

表示上一次跳 j 步到達i點的最大價值,還說 j 只用開到500就可以了 ,我覺得說錯了 因為如果第一步的d 大於500 就會直接越界了 這種說法有問題,**沒問題d ! ! !

最開始想的dp[ i ][ j ] 中 j 直接表示上一次跳的距離,這樣行不通,那可不可以委婉的表示,每次距離的變化值只有三個數 -1 0 1 但是用這三個數表示的話就太亂了 只知道你上次變化量,跳了了幾步就不知道了,缺少參考值 其實我們有乙個很好的參考值-> d

即: 用dp[ i ] [ j ] 表示跳到 i 點上步距離是 d+j 沒毛病吧 那我們來看看 j 的範圍有多大 就直接用他們的250 吧 如果到達dp[ i ][ 250 ] 那麼一定是從dp[i][249] 過來的

那麼最短的跳過的距離和是多少: d + (d+1)+(d+2)+ … +(d+249)+(d+250)

求和後為 d * 250+250 * 251 / 2 且d>0 所以已經大於三萬了 可以滿足題目要求了

為啥要開500 呢 因為有正有負 250*2 完全可以了

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

3e4+10;

int dp[

500]

[maxn]

,num[maxn]

;//dp的i j 互換了~~

intmain()

int ans=num[d]

; dp[

250]

[d]=num[d]

;//250-250 就是差值為0 了

for(

int j=d;j)for

(int i=

1;i<

500;i++)if

(dp[i]

[j]!=-1

)//} cout

}

第三次訓練J題

問題簡述 給出若干組成員,當該組成員中有乙個是嫌疑人時,所有組員均為嫌疑人,預設成員0必為嫌疑人。問題分析 當具備某個條件時,將兩者歸為同乙個集合。顯然為並查集問題。程式說明 當一者為嫌疑人 父節點為0 時,將雙方的父節點都置為0,最後再遍歷所有成員使用一次find函式,避免有成員的父節點為除0外的...

中石油新生第三次訓練賽 C題進製轉換(奇葩解)

題目描述 樂樂正在學進製轉換,但他老是搞不清楚到底自己是否做對,請你編一程式實現兩種不同進製之間的資料轉換,幫他檢驗。輸入 共有三行,第一行是乙個正整數,表示需要轉換的數的進製n 2 n 16 第二行是乙個n進製數,若n 10則用大寫字母a f表示數碼10 15,並且該n進製數對應的十進位制的值不超...

2015暑假第三次積分賽

題目位址 a alphabet cookies 水 題目大意 輸入2個字串,能否在第乙個字串中找到字元組成第二個字串,字串全大寫 解題思路 水 include include include include include include include include include includ...