//这一次写的好屎,心态直接炸了
//用零分割岛屿,记得特判一开始是不是0
//开始是0,与变才变,开始
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int> vc(n+1);
for(int i=1;i<=n;i++) cin>>vc[i];
int cnt=0;
int num_0=1;
if(vc[1]) cnt++;
for(int i=2;i<=n;i++)
{
if(!vc[i-1]&&vc[i]) cnt++;
}
if(cnt>=2){
cout<<2<<"\n";
}else if(cnt==0){
cout<<0<<"\n";
}else{
cout<<"1\n";
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t = 1;
cin>>t;
while(t--){
solve();
}
return 0;
}
// 1
// 0
// 2
// 1
// 1
// 2
// 1
// 2
// 0
// 1
//wa了n法的题,最后发现错在一个if和else 和||的使用上
//不过看了许多题解,感觉证明是充分的
//【1...k】的的排列充要条件是
//1,各个值不同,2,pre【】数组每个数字小于k;
//1,一路证明到底
//所以对于pre和sur我们可以得到首先p不可能是s左边。
//对于skpd有pre在【1,d】取值1~d,同理sur在【n-k+1,n】取值【1~k】
//显然,所以k到d之间应该容纳d-k+1个数,
//假设d>n-k+1;则有n-k+1>=d-k+1,n=d
//反之;则有d>=d-k+1,也就是k==1;
//所以他们出现的位置固定了
//2,用代码来验证充要条件
//3.观察法
//解法1;
// #include <bits/stdc++.h>
// using namespace std;
// void solve(){
// int n;
// cin>>n;
// string s;
// cin>>s;
// int cnt_s=0,cnt_p=0;
// for(int i=0;i<n;i++){
// if(s[i]=='s') cnt_s++;
// if(s[i]=='p') cnt_p++;
// }
// if(cnt_s==0||cnt_p==0){
// cout<<"YES\n";
// }else if(s[0]=='s'&&cnt_s==1||cnt_p==1&&s[n-1]=='p'){
// cout<<"YES\n";
// }else{
// cout<<"NO\n";
// }
// }
// int main(){
// int t;
// cin>>t;
// while(t--){
// solve();
// }
// }
//prek【】数组每个数字小于k;
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
string s;
cin>>s;
s='?'+s;
vector<int> a(n+1,n);
for(int i=1;i<=n;i++){//构造了一个这种数列
if(s[i]=='p'){
for(int j=1;j<=i;j++){
a[j]=min(a[j],i);//更新 a[j] 为 min(a[j], i),即这些位置的最大允许值不能超过 i。
}
}
if(s[i]=='s'){
for(int j=i;j<=n;j++){
a[j]=min(a[j],n+1-i);//更新 a[j] 为 min(a[j], i),即这些位置的最大允许值不能超过 i。
}
}
}
sort(a.begin()+1,a.end());
for(int i=1;i<=n;i++){
if(a[i]<i){//检查有没有相同的
cout<<"NO\n";
return ;
}
}
cout<<"YES\n";
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
//找规律,构成一个环,题目是找相邻的不出现的最小值,发现样例都是012012012,显然没有限制条件的话这三个数构成可以完美
//但是发现当额外关系时不是很好找,发现偶数010101子满足,奇数0101012满足
//当差为偶数或者奇数(满足本身和额外条件)的时候环形转动(ans[(x + i) % n] = i % 2;)神来之笔;
//
#include <iostream>
#include <vector>
using namespace std;
void solve() {
int n, x, y;
cin >> n >> x >> y;
--x; --y;
vector<int> ans(n);
for (int i = 0; i < n; ++i)
ans[(x + i) % n] = i % 2;
if (n % 2 || (x - y) % 2 == 0)
ans[x] = 2;
for (auto x : ans)cout << x << ' ';
cout << endl;
}
int main() {
int T;
cin >> T;
while (T--) solve();
}
// 0 2 1 0 1
// 1 2 1 0
// 1 2 0 1 2 0
// 0 1 2 0 1 0 1
// 2 0 1
// 1 0 2 1 0
// 0 1 2 0 2 1
//很妙的一个二分,首先简单的公式化简,然后可以排序后二分,但是发现要求i《j,其实和
//位置没关系,只要保证不重复计算就可以,所以对于每个i外面只需搜索i后面有几个j满足
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {
ll n, x, y;
cin >> n >> x >> y;
vector<ll> a(n);
ll sum = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}
ll L = sum - y;
ll R = sum - x;
sort(a.begin(), a.end());
ll cnt = 0;
for (int i = 0; i < n; i++) {//枚举每个a【i】可以和谁组合
//记住要从后面开始搜索,防止重复。
ll min_val = L - a[i];
ll max_val = R - a[i];
auto j_left = lower_bound(a.begin() + i + 1, a.end(), min_val);//保证不重复
auto j_right = upper_bound(a.begin() + i + 1, a.end(), max_val);
cnt += distance(j_left, j_right);
}
cout << cnt << "\n";
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
oj
//括号题,当时被smD卡住了,都没心情分析了
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
string s;
cin>>s;
int cnt_0=0;
for(int i=0;i<n;i++){
if(s[i]=='0') cnt_0++;
else cnt_0--;
if(cnt_0<0){
cout<<"NO\n";
return 0;
}
}
if(cnt_0==0)
cout<<"YES\n";
else
cout<<"NO\n";
}
//md。后面的题这么简单啊
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n,a,b;
cin>>n>>a>>b;
cout<< (n/a-n/(a*b/(__gcd(a,b))));
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, p;
bool check(ll mid) {
ll sum = 0;
for(ll i = 0; i < n; ++i) {
ll first= 1 + i * mid;
if(m >= first){
sum += (m - first + 1);
if(sum >= p) return true;
}
else{
break;
}
}
return sum >= p;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> p;
ll k0 = n * m;
if(k0 < p){
cout << -1;
return 0;
}
ll l = 0, r = m;
ll ans = -1;
while(l <= r){
ll mid = l + (r - l) / 2;
if(check(mid)){
ans = mid;
l = mid + 1;
}
else{
r = mid - 1;
}
}
cout << ans;
}
安理新生e题
//双变量t和p,答案是t,不妨二分t,枚举此时下公式化简p区间重和问题
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
int n, w, k;
bool check(vector<pii> vc, int mid) {
int cnt = 0;
vector<pii> edge;
if (mid == 0) return false;
for (int i = 0; i < n; i++) {
int l = min(w - ceil(1.0 * vc[i].second / mid) + vc[i].first, vc[i].first - w + ceil(1.0*vc[i].second / mid));
int r = max(w - ceil(1.0 * vc[i].second / mid) + vc[i].first, vc[i].first - w + ceil(1.0*vc[i].second / mid));
if (w - ceil(1.0 * vc[i].second / mid) <= 0) continue;
edge.push_back({l, 0});
edge.push_back({r, 1});
}
sort(edge.begin(), edge.end());
int c = 0;
for (auto [b, o] : edge) {
if (o == 0) {
c++;
} else {
c--;
}
cnt = max(cnt, c);
}
return cnt >= k;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
while (cin >> t) {
cin >> n >> w >> k;
vector<pii> fei(n);
for (int i = 0; i < n; i++) {
cin >> fei[i].first;
}
for (int i = 0; i < n; i++) {
cin >> fei[i].second;
}
sort(fei.begin(), fei.end());
int l = 1, r = 1e9;
while (l <= r) {
int mid = (l + r) / 2;
if (check(fei, mid)) r = mid - 1;
else l = mid + 1;
}
if (l >= 1e9) {
cout << -1 << "\n";
} else {
cout << l << "\n";
}
}
}