濟南 1031試題解題報告

2022-05-03 10:48:27 字數 4874 閱讀 9919

濟南-1031試題解題報告

by shenben

本解題報告解析均為100分解題思路。

題意自行讀題。(總結題意太累了……)

解析:打錶出所有

k!,其中

k mod 10000000=0

。詢問時直接找到已知的答案,並計算不超過

10000000

就能找到答案。

解析:先將

ai進行排序。

令f[i]

表示1~i

中相同的

ai對數。

對於所有

ai!=a

的位置,將

f[i]*g*(g-1)/2

累加進答案中。其中

g表示存在多少數字=a。

時間複雜度

nlogn

解析:假設我們選了

x行,那麼必然選擇了

k-x列。

令f[i]

表示選擇

i行得到的最大和。考慮怎麼求出所有

f[i]

。這個是顯然可以貪心的。記錄所有行的總和。利用大根對維護即可。

令g[i]

表示選擇

i列得到的最大和。已知f

與g後。答案為

max解析:二分答案,對於那些不能被到達的位置設定為障礙,問題轉換成判斷連通性問題

,並查集或者搜尋都可以。

另外最短路也可以做。

解析:觀察美麗的仙人掌的定義,發現編號為i與

i+1之間必存在一條邊,問題轉化成有

若干區間,求最多的區間,使得區間之間沒有重疊和覆蓋。這個問題是可以直接

貪心或者

dp的。

上午

t1**:

#include#define name "np"

#define ll long long

using

namespace

std;

const

int a[101]=;

const

int mod=1e9+7

;const

int sz=1e7;

ll n,p;

ll ans=1

;int

main()

if(p==mod)

for(ll i=1;i<=n;i++) ans=ans*i%p;

printf(

"%i64d

",ans);

return0;

}

t2**:

//

**優化 o(n)演算法

#include#include

#define ll long long

using

namespace

std;

const

int n=1e5+10

;const ll mod=1e9+7

;int

n,a[n];

ll ans,f[n],sum;

#define name "program"

intmain()

else

}sum=0

;

for(int i=n;i>1;i--)

printf("%d

",(int

)ans);

fclose(stdin);

fclose(stdout);

return0;

}

t3**:

//

大根堆+字首和 貪心

#include//

#include

#include#define ll long long

using

namespace

std;

const

int n=1e6+10

;int

n,m,k,p;

ll ans,s1[n],s2[n],p1[n],p2[n];

//priority_queueq1,q2;

#define name "select"

intmain()

}make_heap(s1+1,s1+n+1

); make_heap(s2+1,s2+m+1

);

for(int i=1,t;i<=k;i++)

/*用優先佇列實現好像有點問題

for(int i=1;i<=n;i++) q1.push(s1[i]);

for(int i=1;i<=m;i++) q2.push(s2[i]);

for(int i=1,t;i<=k;i++)

*/ll ans=-1e15;

for(ll i=0;i<=k;i++) ans=max(ans,p1[i]+p2[k-i]-i*(k-i)*p);

printf(

"%i64d

",ans);

return0;

}/*60分騙分**存檔

#include#include#include#define name "select"

#define ll long long

#ifdef unix

#define ll "%lld"

#else

#define ll "%i64d"

#endif

using namespace std;

inline const ll read()

while(ch>='0'&&ch<='9')

return x*f;

}const ll n=1e3+10;

ll a[n][n];

ll s1[n][n],s2[n][n];

ll n,m,k,p,sans,ans;

ll px,py;

priority_queueq;

int main()

}for(ll i=1;i<=n;i++)

}

if(k==1)

if(p==0)

if(n==1)

printf(ll,ans);

}if(n<=5&&m<=5&&k<=5)

}ans=-0x3f3f3f3f;

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

/*原始100分**存檔

#include#define name "chocolate"

#define ll long long

#ifdef unix

#define ll "%lld"

#else

#define ll "%i64d"

#endif

using namespace std;

int n;

ll tot;

void dfs(ll n)

m=1ll<<(i-1);

tot+=m-1;

dfs(n-m);

}int main()

*/

t2**:

#includeusing

namespace

std;

const

int n=1e6+10

;const

int m=1e3+1

;int

n,m,cnt,d[m][m],a[m][m],p[m][m],sx[n],sy[n],fa[n];

const

int dx[4]=;

const

int dy[4]=;

inline

bool inside(int x,int

y)int find(int

x)bool check(int

x) }}}

}return find(p[1][1])==find(p[n][m]);

}int

l,r,mid,ans;

#define name "run"

intmain()}}

intpx,py;

while(l!=r)}}

for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) p[i][j]=++cnt;

l=0;r=1e6;

while(l<=r)

printf("%d

",ans-1

); fclose(stdin);

fclose(stdout);

return0;

}

t3**:

#include#include

using

namespace

std;

const

int n=1e5+10

;int

n,m,g[n],f[n];

#define name "cactus"

intmain()

f[0]=-1

;

for(int i=2;i<=n;i++) f[i]=max(f[i-1],f[g[i]]+1

); printf("%d

",f[n]+n-1

); fclose(stdin);

fclose(stdout);

return0;

}

2016 11 17試題解題報告

2016 11 17試題解題報告 by shenben 水災 sliker.cpp c pas 1000ms 64mb 大雨應經下了幾天雨,卻還是沒有停的樣子。土豪ccy剛從外地賺完1e元回來,知道不久除了自己別墅,其他的地方都將會被洪水淹沒。ccy所在的城市可以用乙個n m n,m 50 的地圖表...

2016 11 12試題解題報告

2016 11 1 2試題解題報告 by shenben 本解題報告解析均為100分解題思路。t1列舉 乘法原理 容斥原理 滾動列舉最短的s串在t串的頭和尾,然後用乘法原理當前的x。ans x 注意s串是類似 aabb 這種情況 t2 dp 第一問 根據題目中的偽 乙個點一定會與位於這個點之後並且不...

Mountains CVTE面試題 解題報告

題目大意 用乙個陣列代表群山的高度。高度大的地方代表山峰,小的地方代表山谷。山谷可以容水。假設有一天下了大雨,求群山中總共可以容納多少水?如圖所示情況,a代表該陣列,總共可以容納5個水。解題思路 初步想法可以列舉每乙個單位,判斷是否能放水。這種做法的複雜度為o n 2 h 其中h為陣列最大值,n為陣...