2016 11 12試題解題報告

2022-05-03 10:33:19 字數 4266 閱讀 1804

2016-11-1

2試題解題報告

by shenben

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

t1列舉+乘法原理(+容斥原理)

滾動列舉最短的s串在t串的頭和尾,然後用乘法原理當前的x。

ans=∑x(注意s串是類似「aabb」這種情況)

t2

dp

第一問:

根據題目中的偽**,乙個點一定會與位於這個點之後並且不大於這個點的點連一條邊,樣例中3會與1和2連一條邊,而1就不會與2連邊,這樣就構成了乙個下降的序列。那麼反過來,不連邊的點就構成了上公升序列,這就是乙個點獨立集,最大的點獨立集就是最長上公升子串行。所以第一問的答案就是最長上公升子串行的長度。 

第二問:

問哪些點在最長上公升子串行中必不可少。

因為最長上公升子串行可能有多個,那麼所有上公升子串行中公共的點就是一定在最大點獨立集中的點。

t3

。。

暫時不知道

t1**

ai版

#include#include

#include

#define ll long long#ifdef unix

//ifdef千萬別再寫錯了區別 ifndef(×)

#define ll "%lld"

#else

#define ll "%i64d"

#endif

using

namespace

std;

const

int n=3e5+10,m=210

;const

int inf=0x3f3f3f

;char

t[n],s[m];

int n,m,cnt,near[n][30

];int

head[n],tail[n];

void

special_judge()

printf(ll,ans);

}#define name "encrypt"

intmain()

//near[i][j]表示距離t[i]右邊最近的a~z的下標

for(int i=1;i<=26;i++) near[m][i]=inf;

for(int i=m-1;i>=0;i--)

}for(int i=0;i<=m;i++)}}

for(int i=0;i)

ll ans=0;head[0]=-1;//

乘法原理

for(int i=1;i<=cnt;i++) ans+=(ll)(head[i]-head[i-1])*(ll)(m-tail[i]);

printf(ll,ans);

fclose(stdin);

fclose(stdout);

return0;

}

簡短精煉的std

#include#include

#include

#define ll long long#ifdef unix

#define ll "%lld"

#else

#define ll "%i64d"

#endif

using

namespace

std;

const

int n=3e5+10

;const

int m=210

;char

t[n],s[m];

intn,m,f[m];

ll ans;

#define name "encrypt"

intmain()

}ans+=n-f[1]+1

; }

printf(ll,ans);

fclose(stdin);

fclose(stdout);

return0;

}

t2**

#include#include

#define r register

using

namespace

std;

inline

intread()

while(ch>='

0'&&ch<='9')

return f?x:-x;

}const

int n=1e5+10

;int

n,len,a[n],b[n],f[n],maxx[n],sum[n];

bool

vis[n];

#define name "bubble"

intmain()

else

}printf(

"%d\n

",len);

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

}for(int i=1;i<=n;i++) if(vis[i]&&sum[f[i]]==1) printf("

%d "

,i);

fclose(stdin);

fclose(stdout);

return0;

}

t3**]

暫無ac**

/*

20分存檔

#include#include#include#include#include#include#define r register

#define debug(x,y) cout<'9')

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

return f?x:-x;

}const ll n=2001;

const ll qlen=n*4-5;

const ll inf=2e9;

ll n,m,pd,sd,dfn[n],low[n],sum[n];

bool mark[n],vis[n];

ll b[n][n];

stacks;

struct node

bool operator <(const node &a) const

}ind[n],outd[n];

struct ss

ss(ll _id,ll _val)

bool operator <(const ss &a) const

}dis[n];

void tarjan(ll v)

else if(mark[w])}}

ll u;

if(low[v]==dfn[v])while(u!=v);

}}ll q[n<<2]=;

ll ans[n];

ll sans[n];

inline void spfa(ll s)}}

}}

//printf("%d",dis[t]);

}void cl()

#define name "rebuild"

int main()

for(ll i=1;i<=n;i++) if(!dfn[i]) tarjan(i);

sort(sum+1,sum+sd+1,greater());

if(sum[1]==n)

sort(outd+1,outd+n+1);

spfa(outd[1].id);

sort(dis+1,dis+n+1);

printf(ll"\n",dis[1].val+1);

ll tv=dis[1].val;ans[++ans[0]]=dis[1].id;

for(ll i=2;i<=n;i++) if(dis[i].val==tv) ans[++ans[0]]=dis[i].id;

for(ll i=1,z=outd[1].id,pt,x,y;i<=ans[0];i++)

sort(sans+1,sans+sans[0]+1);

ll cnt=unique(sans+1,sans+sans[0]+1)-(sans+1);

printf(ll"\n",cnt);

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

fclose(stdin);

fclose(stdout);

return 0;

}*/

2016 11 17試題解題報告

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

濟南 1031試題解題報告

濟南 1031試題解題報告 by shenben 本解題報告解析均為100分解題思路。題意自行讀題。總結題意太累了 解析 打錶出所有 k 其中 k mod 10000000 0 詢問時直接找到已知的答案,並計算不超過 10000000 就能找到答案。解析 先將 ai進行排序。令f i 表示1 i 中...

Mountains CVTE面試題 解題報告

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