濟南-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**:
#includeusingnamespace
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#includeusing
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為陣...