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;
}