SCAU2020春季個人排位賽div2 5

2021-10-03 16:09:40 字數 3959 閱讀 1605

標頭檔案見上一場的blog

題意:給你s和x,可能存在正數a+b=s,且a xor b=x,問a,b可能的組合有多少種

題解:s=a+b,則s=a ^ b+2*(a&b),^是只表示兩個數的相加,&是表示兩個數的進製,某一位的xor如果是1,那麼a和b在這一位必然乙個是1乙個是0,此時&必為0;如果某一位的xor是0,那麼在這一位的a和b都是確定的要麼都是1要麼都是0,至於是哪個,這個由其他位決定,所以不用管它們

ac**:

int

main()

else

if(a==

0)ans=ans-2;

printf

("%lld"

,ans);}

return0;

}

題意:有乙個字串,只包含a,b,c,每乙個字元都可以和b相連,a,c只能和自己相連,給出所有的字元相互連線情況,復原該字串(字串可能不存在

題解:二分圖染色——顯然ac之間不能連線,其實作題目的補圖,這個補圖就是二分圖了!標記所有連線情況,發現某個點和其他點都連線,填寫b,然後往下填,優先填a,如果有連線的格仔,也填a,不連線的話,填c。違規情況有兩種:i和j連線,但是乙個填了a乙個填了c;i和j沒有鏈結,但是他們填的是一樣的字母

ac**:

int n,m,flag=0;

int s[

800]

[800];

char ans[

600]

;void

dfs(

int i)

if(i!=j&&s[i]

[j]==1&&

((ans[i]

=='a'

&&ans[j]

=='c')||

(ans[i]

=='c'

&&ans[j]

=='a'))

)if(i!=j&&s[i]

[j]==

0&&ans[j]==0

)if(i!=j&&s[i]

[j]==

1&&ans[j]==0

)}}int

main()

for(

int i=

0;i(po==0)

ans[i]

='b';}

for(

int i=

0;iif(flag==1)

printf

("no");

else

return0;

}

題意:n個鈴鐺,m個箱子,n<=2m,鈴鐺體積從第乙個到最後乙個遞增,問要裝下所有的鈴鐺,箱子體積統一,那麼箱子最小要有多大

題解:由題意得,設有x個鈴鐺單獨裝箱,x=2m-n,這x個肯定是取最大的那幾個放,剩下的裡面最大+最小為一箱,不斷更新箱子體積就可以了

ac**:

int a[

150000];

intmain()

return0;

}

題意:給你乙個偶數,拆成兩個素數的解,問有多少種拆法

題解:暴力求解就好啦(囂張

ac**:

bool prime

(int n)

return true;}}

intmain()

}return0;

}

題意:乙個人從點1出發,走路經過若干條路去到某個點,再經由這個點走蟲洞(可能不止乙個)或者走路回到點1,且用時比去的時候少,問存在這種情況嗎

題解:bellman_ford,負權有向圖(是叫這個嗎),就是維護每個點到源點的距離,如果這個點到源點的用時少於它的來點+走到它的用時,說明存在情況

ac**:

int t,n,m,k;

struct node

;vectoredge;

vector<

int>g[

1000];

void

good

(int n)

void

addnode

(int from,

int to,

int dist));

int k=edge.

size()

; g[from]

.push_back

(k-1);

}bool bellman_ford

(int s)

}for

(int i=

0;isize()

;i++

)return false;

}int

main()

while

(k--)if

(bellman_ford(0

))printf

("yes\n");

else

printf

("no\n");

}return0;

}

題意:k的白花規模數,一把花有a~b朵花,一把花裡的花可以是紅花,或者紅花+k*n朵白花(n>=0);且每乙個k朵白花必須全部相連,比如說一把花有4朵,紅花是r白花是w,這把花可以是rrww,不可以是wrwr。給出a,b問有多少種花的組合方法

題解:dp,狀態轉移方程是:dp[i]=dp[i-1]+dp[i-k],dp[i-1]對應的是i位是紅花的情況,dp[i-k]對應的是第i位是白花的情況,如果i是白花,那麼i-k+1~i都是白花,dp[i]是對前面情況的繼承

ac**:

ll dp[

101000

],ans[

101000];

intmain()

for(

int i=

1;i<=

100005

;i++

)//for(int i=1;i<=5;i++)printf("**%lld %lld",dp[i],dp)

while

(n--)}

return0;

}

題意:有n個營地,每個營地有若干個士兵,可以對這些營地進行加兵,減兵,數兵的操作,數兵會給出範圍a~b,數兵的時候輸出總數

題解:線段樹維護區域性和,板子題

我學習的線段樹模板來自:點進去就好啦

ac**:

const

int maxn=

500010*4

;using namespace std;

int a[maxn]

;struct tree

node[maxn]

;void

pushup

(int i)

void

build

(int i,

int l,

int r)

int mid=

(l+r)/2

;build

(i<<

1,l,mid)

;build

((i<<1)

|1,mid+

1,r)

;pushup

(i);

}int

getsum

(int i,

int l,

int r)

void

add(

int i,

int k,

int v)

int mid=

(node[i]

.l+node[i]

.r)/2;

if(k<=mid)

add(i<<

1,k,v)

;else

add(

(i<<1)

|1,k,v)

;pushup

(i);

}int

main()

}return0;

}

SCAU2020春季個人排位賽div2 1 B

給出正整數 n 和 m,統計滿足以下條件的正整數對 a,b 的數量 1 a n,1 b m a b 是 2016 的倍數。input 輸入包含不超過 30 組資料。每組資料報含兩個整數 n,m 1 n,m 10e9 output 對於每組資料,輸出乙個整數表示滿足條件的數量。sample input...

scau2020春季排位賽 9 I題

給定長度為n的小寫字母字串,可以理解為給n個空位,然後每個位置有m個選擇即a開始往後數m 1個字母,接著這個重組的字串為原字串的子串,因為不會dp,所以就直接硬著頭皮算,我承認我有賭的成分 接著我們可以先把原字串挖掉乙個,比如現在為abc,我們先拿走c並用 表示那麼就可以表示為,ab,a b,ab ...

2014新生暑假個人排位賽06

時間限制 3000 ms 記憶體限制 65536 kb 小弱的學校很喜歡修路,現在給你一張他學校的地圖,地圖上有n個點和m條雙向邊,每條邊代表一條路,這條路有可能是暢通,也有可能正在修路。大家都知道修路使得交通很不方便。所有小弱很想學校快快的把路修好,使得他能夠很輕鬆的到達主樓915去刷題。但考慮到...