CF689 BCDE 主要是寫給需要的人看的

2021-10-11 21:59:10 字數 4258 閱讀 8144

b題首先想到的就是遍歷

一看遍歷就是 500 * 250 * 250 * 250 那鐵定超時了

所以相到處理一下最後的i - y,i + y 這一部分

這肯定是字首和就可以了 所以變成了 500 * 500 * 250 大概是62500000

再加上一些剪枝 剪掉 <1 >m的情況 大概能 / 10 大概就是6250000 所以能過hhh

#include

#include

using

namespace std;

const

int n =

510;

int n,m;

char a[n]

[n];

int qzh[n]

[n];

bool

check

(int x,

int y,

int ceng)

intmain()

for(

int j =

1; j <= m; j++)}

for(

int i =

1; i <= n; i++)}

}printf

("%d\n"

,sum);}

return0;

}

c題

double s= 1;

真概率問題 將所有可以使條件成立的 s乘以他們的相反數 就是不能使條件成立了 hh 那些其他反正也不能使條件成立的發不發生都一樣

最後用1 - s 就是答案了

#include

using

namespace std;

const

int n =

1e5+10;

int n,m;

int a[n]

;double x[n]

,y[n]

;int

main()

int end = n;

for(

int i = n; i >=

1; i--

)else

break;}

double h =1;

for(

int i =

1; i <= m; i++)}

if(end ==0)

printf

("%f\n",1

- h);}

return0;

}

d題也是個模擬題

根據題意模擬的話就是logn

然後查詢的話就是 m * (你查詢到的方式)

由於m是<=1e5 所以你選擇logn的查詢方式或者o1就行

所以用map 用set 用vector 都行

反正不要使用find 這個除了stl的都是on stl裡面的是 logn

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

1e6+10;

int n,m;

int a[n]

;vector<

int>v;

long

long qzh[n]

;unordered_map<

long

long

,int

>mm;

void

dfs(

int x,

int y)

}else

if(a[pos]

> mid)

if(pos == y)

return

;dfs

(x,pos);if

(pos +

1== x)

return

;dfs

(pos +

1,y);}

intmain()

sort

(a +

1,a + n +1)

;for

(int i =

1; i <= n; i++

)dfs(1

,n);

sort

(v.begin()

,v.end()

);for(

int i =

1; i <= m; i++

)else cout <<

"yes"

<< endl;}}

return0;

}#include

#include

#include

#include

using

namespace std;

const

int n =

1e6+10;

int n,m;

int a[n]

;vector<

long

long

>v;

long

long qzh[n]

;void

dfs(

int x,

int y)

}else

if(a[pos]

> mid)

if(pos == y)

return

;dfs

(x,pos);if

(pos +

1== x)

return

;dfs

(pos +

1,y);}

intmain()

sort

(a +

1,a + n +1)

;for

(int i =

1; i <= n; i++

)dfs(1

,n);

sort

(v.begin()

,v.end()

);for(

int i =

1; i <= m; i++

)else

else cout <<

"no"

<< endl;}}

}return0;

}

e哈哈哈看一下資料x <= 1e6;

y <= 1e18;

首先是分為兩種狀態吧很明顯了

start 表示初始值 ,use 一天喝的水,add 一天可加的水

day表示天數 l,r表示邊界

1.use < add

當day <= (start / (use - add));那就輸出"yes"

否則輸出"no";

2.use == add

只要第一次相剪得時候 >= l即可

3.use > add

使用while的時候

每次減去最多能減去的天數

然後能加就加 這個時候總會有個迴圈 就是

add - use 和 use 的最小公倍數

當他的迴圈出現的話 並且迴圈期間都沒有出現問題的話 那肯定就是可以的

所以資料尤其重要哈哈因為 x <= 1e6 所以 use <= 1e6

所以 add - use 最多使用1e6 次 就可以重新回到 0

所以while最多進行1e6次 所以完全不用擔心超時的問題

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n =

2e6+10;

int st[n]

;int

main()

else cout <<

"no"

<< endl;

return0;

}if(start < use)if(

(start - use)

/(use - add)

< day -1)

}else

if(st[start]

) st[start]=1

;if(start + add <= r)

else}}

if(flag) cout <<

"yes"

<< endl;

else cout <<

"no"

<< endl;

return0;

}