長沙學院2021校賽題解

2022-09-06 04:06:11 字數 4146 閱讀 3069

比賽鏈結

聽了偶像的話,決定也來寫一寫題解哈哈哈~

可能編碼風格不是很好orz

題解寫得不好!湊合著看吧~

a水題將乙個正實數四捨五入。

因為輸入的浮點數長度小於等於2000,已經超過了double的資料範圍,所以我是用字串做的。

先判斷是否存在小數點,不存在的話直接輸出。

存在的話判斷小數點後一位的數是否大於等於5來決定是否進製。

char

s[maxn];

void

solve()

if(s[pos+1]<'5'

)

pos--;

rep(i,

0,pos)s[i]-='0'

;

bool ju=0

; s[pos]++;

int pp=pos;

while(1

)

s[--pp]++;

continue

; }

break

; }

if(ju)printf("1"

); rep(i,

0,pos)printf("

%c",s[i]+'0'

);}

b給你兩個陣列a,b。

讓你有多少種取法使得從a中取乙個數ai,從b中取乙個數bj使得ai+bj是乙個質數。

我是先求出200000內的質數,然後記錄b中每個數出現的次數。

a陣列記錄個數去重,列舉a。

int

pri[maxn],cnt;

bool

vis[maxn];

void

init()

}}int

n,m,a[maxn],b,cntb[maxn],cnta[maxn],ma;

ll res;

void

solve()

res=res+1ll*cnta[a[i]]*sum;

}plld(res);

}

c不管a的話題意相當於:有n座山,第i做山的高度為hi,小c只能從當前位置i移動到右邊的位置j,且該位置的高度比原位置的高度大。即i然後有q個詢問,每個詢問給x,w。x代表起始位置,w代表小c的體力值,問小c能到達的最大位置。

最開始看錯題意(傻

把hj*(j-i+1)理解成hj*(j-i)

做法:先預處理,以每個點為起點,求每乙個它到能到達的位置需要的體力值。可能會出現當前位置pos到x

int

n,q;

inta,xx,h[maxn];

ll x[maxn][maxn];

vector

vec[maxn],ans[maxn];

pii p[maxn];

intcnt;

void

solve()

x[i][j]=mi;

vec[i].pb(mk(x[i][j],j));

}sort(vec[i].begin(),vec[i].end());

int si=vec[i].size();

if(si)ans[i].pb(vec[i][0

]); rep(j,

1,si-1

)

}while(q--)

}

(怎麼有點懶得寫了orz

d(不會qwq

e(水題

記錄質數,然後記錄位置是質數的字元,c,s,u出現的次數

int

pri[maxn],cnt;

bool

vis[maxn];

void

init()

}}char

str[maxn];

intc,s,u;

void

solve()

}if(c>=2&&s&&u)puts("

yes"

);

else puts("no"

);}

f給你乙個序列,讓你求最長的完美子串行長度

乙個序列是完美的:對於所有的1<=i,滿足b[i]不是b[i + 1]的因數。

做法:預處理每個數的因子fac,然後對於第i個數,求前邊i-1個數中不是ai的因子且長度最長的長度,我是用線段樹做的,找到兩個相鄰因子中間的數的最大長度。

vectorfac[maxn];

void

init()

}sort(fac[i].begin(),fac[i].end());

}}struct

nodea[maxn

<<2

];int

n;void build(int k,int l,int

r)void update(int k,int l,int

x)

int mid=(a[k].l+a[k].r)>>1

;

if(l<=mid)update(k<<1

,l,x);

else update(k<<1|1

,l,x);

a[k].ma=max(a[k<<1].ma,a[k<<1|1

].ma);

}int query(int k,int l,int

r)int

ans;

void

solve()

res=max(res,query(1,x+1

,1e5));

ans=max(ans,res+1

); update(

1,x,res+1

); }

pd(ans);

}

g算出的所有連續子串行中有多少滿足:

1,所有數的和為k的倍數;

2,且其和至少為z;

記錄字首和%k的和,然後對於當前位置的sum,滿足的是sum-sumi>=z,即sumi<=sum-z,看這個數在vec中的位置

int

n,k,z,a[maxn];

vector

vec[maxn];

ll res;

void

solve()

int pos=upper_bound(vec[y].begin(),vec[y].end(),sum-z)-vec[y].begin();

//cout' 'res+=pos;

}plld(res);

}

h雜湊

給你兩個字串s和t,問你s中有多少個子串,而這個子串不是t的子串

(用map和unordered_map都超時了qwq

const ull base=233

;int

n,m;

char

s[maxn],t[maxn];

ull p[maxn],has1[maxn],has2[maxn];

void

init()

ull get1(

int l,int

r)ull get2(

int l,int

r)ull pp[maxn*maxn];

intres,cnt;

void

solve()

sort(pp+1,pp+1+cnt);

cnt=unique(pp+1,pp+1+cnt)-pp;

rep(i,

1,n)rep(j,i,n)

pd(res);

}

i有乙個n*m的矩陣,問你有多少種放法,使得每一行每一列最多只能放置乙個

想法:對於n*m的矩陣,考慮第一行要不要放,放的話有m個位置,答案轉移為m*dfs(n-1,m-1),即轉化為(n-1)*(m-1)的矩陣的放法。

不放的話答案轉移為dfs(n-1,m),即轉化為(n-1)*m的矩陣的方法。

int

n,m;

intd[maxn][maxn];

int dfs(int nn,int

mm)void

solve()

j(不會

k(不會

本來沒想打的,但是無聊啊!敲了3個小時後就敲不出來了,然後就溜啦~

2019長沙學院新生賽題解

題目鏈結 a 打表找規律,發現每四個數就是0,所以找第乙個大於l的四的倍數,找第乙個小於r的四的倍數,然後異或。includeusing namespace std define ll long long int main ll tt 0 y 4 l 4 l,x r r 4 for ll i l i...

2017校賽題解

又是一年一度的校賽,三個人從出題到準備環境花了好幾天的時間。雖然也是蠻累的,期間出了一些小差錯,但總的來說還是蠻成功的 感覺比去年好一些,逃。一共出了7題,但是考慮到比賽時間比較緊張就砍掉了兩題 反正沒砍我的題,對了,關於 teddywang 同學在題面上黑我的情況表示強烈譴責,將在他不注意的時候實...

校賽反思和題解

這次校賽只做出來三道題,而且自己沒做出來一道。雖然拿了銅獎,這有什麼意義呢?這個獎唯一的意義就是告訴我自己還很菜,同樣在集訓隊的大一同學至少是銀獎。我不願意和別人這樣去競爭。所以找找自己的原因吧。首先是自己剛的j題沒有做出來,原因不明。其次是全場最簡單的簽到題卡了讀題。很簡單的模擬沒有搞出來,博弈論...