百度之星2017初賽題解(A)

2021-08-06 04:06:03 字數 2439 閱讀 1460

t1:

簡單數論,問滿足(a0+a1*b+...+an*b^n)=a0+a1+...+an(mod p)的p的個數

即滿足p|(b-1)a1+(b^2-1)a2+(b^3-1)a3+...,即p|b-1的p的個數

sqrt(b-1)暴力列舉b-1約數即可

t2:現在給若干個條件,xi=xj或xi≠xj,要你將它們劃分成若干組,滿足每個組除去最後乙個條件時成立,否則不成立。

拿並查集將所有相等的點縮起來,對於每個連通塊,掛乙個vector或者set儲存與他不相等的連通塊編號(即並查集的代表元)

啟發式合併,每次將vector小的合併到大的中去,複雜度o(nlognα(n))或o(nlog^2nα(n))(實際不滿)

ps:sb出題人認為最後一組到最後乙個條件若成立就不輸出

#include#include#define maxn 200100

using namespace std;

typedef long long ll;

setst2[maxn];

typedef set::iterator sit;

int l,t,cnt[maxn],f[maxn],a[maxn],b[maxn],c[maxn];

int find(int x)

int main()

if(st2[x].size()>st2[y].size())swap(x,y);

f[x]=y;

for(sit it=st2[x].begin();it!=st2[x].end();++it)

st2[*it].erase(x),st2[*it].insert(y),st2[y].insert(*it);

st2[x].clear();

} else

st2[x].insert(y),st2[y].insert(x);}}

if(pos<=l)pos++;

for(int j=i;j

這個。。。簡單題吧,

首先兩條路徑求交,交集一定是一條路徑,一定是乙個的lca在另一條路徑上,否則交集就是空

那麼維護乙個線段樹,每個節點表示這個區間的路徑求交求出的路徑是什麼

然後普通線段樹那樣做即可

t4:給你個地圖(balabala...)注意「*」翻轉的可達性是所有格仔都要翻轉

這題。。。如果狀壓"*"的狀態的話,我猜想有用的狀態(即可能成為最優)不會很多

於是拿乙個hash表spfa暴力dp一番(可能本質上是真·暴力

然後就過了。。。

#include#define get(x,y) ((x*100)+y)

#define inf 1000000007

using namespace std;

typedef unsigned long long ull;

typedef pairpar;

ull h(ull id,ull s)

unordered_mapdp;

queue>q;

char c[100][100];

int t,n,m,cas,id[100][100],dx[4]=,dy[4]=,flag,edx,edy;

ull pre[100][100];

int main()

x1=0,flag=1;

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

for(int j=1;j<=m;++j)

if(c[i][j]=='*')id[i][j]=++x1;

else id[i][j]=0;

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

for(int j=1;j<=m;++j) else if(c[nx][ny]=='*')

}} printf("case #%d:\n%d\n",++cas,ans==inf?-1:ans-1);

}}

t5:不想說了,2-29寫成2-30,智商-1

t6:不想說了,bfs/dfs判一下連通塊即可

#includeusing namespace std;

char c[110][110];

int n,m,vis[110][110],flag;

void dfs(int x,int y,int z)

if(c[x][y]!=z)return ;

vis[x][y]=1;

dfs(x+1,y,z),dfs(x,y+1,z),dfs(x-1,y,z),dfs(x,y-1,z);

}int main() else }}

// printf("[%d,%d,%d]",x0,x1,_x0);

if(_x0==1&&x1==1)printf("0\n");

else if(_x0==0&&x1==1)printf("1\n");

else printf("-1\n");

}}

2017百度之星初賽B場總結

a場因為不可抗力因素 沒能參加,b場還好算是磕磕碰碰地吃著低保過去了,真的菜呀 可以說還是比較一目了然的簽到題,由於這些點的橫縱座標都必須嚴格遞增,那麼我們最多能取到的點就是mi n n,m 個 方案數就相當於是在 max n,m 中選 min n,m 個的方案數,那麼答案就是c max n,m m...

百度之星 初賽B

a 傳送門 點我 求聯通塊個數,對於簡單圖而言,就是c v e,其中c就是聯通塊個數,v是頂點數,e是邊數 include include include include using namespace std const int max n 2e5 10 int n,m,k vectorg max...

2017 百度之星複賽題解 01 03 05

01 有個易錯點,我卡了好久,就是 1 012 1 答案是1012,我剛開始把012的前導0去掉了。03 原題 05 數字dp,記憶化搜尋 dp p q limit ceng 表示前一位是 p,前面處於遞增 遞減 狀態q,當前位上限是多少limit,還有多少位ceng 根據不同情況遞迴即可,可以先不...