A
水题。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int n,m,t,ans,k;
bool flag;
int a[maxn];
int main(){
cin>>t;
while(t--){
cin>>n;
flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]%2==0&&flag==0){
k=1;
ans=i;
flag=1;
}
}
if(n==1&&(a[1]%2==1)) cout<<"-1\n";
else{
if(flag) cout<<k<<'\n'<<ans<<'\n';
else{
cout<<"2\n";
int num=2;
for(int i=1;i<=n;i++){
if(a[i]%2&&num>0){
cout<<i<<" ";
num--;
}
}
}
}
}
return 0;
}
B
这题比C题还要难想一点。
打的时候想到是连续1的数量了但最后按面积因子处理的时候没想到。。。
我真sb。
具体看代码吧,看了就懂了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 4e4+5;
ll n,m,k,ans;
int a[maxn],b[maxn],A[maxn],B[maxn];
inline int read(){
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-f; ch=getchar();}
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
void count(int x[],int maxx,int y[]){
int len,index;
for(int i=1;i<=maxx;i++){
if(x[i]){
len=0;index=i;
while(x[index]==1&&index<=maxx){
len++;
index++;
}
for(int j=1;j<=len;j++) y[j]+=len-j+1;
i=index-1;
}
}
}
int main(){
n=read();m=read();k=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
count(a,n,A);
count(b,m,B);
for(int i=1;i<=n;i++){
if(k%i==0&&k/i<=m) ans+=A[i]*B[k/i];
}
printf("%lld\n",ans);
return 0;
}
C
一句话就是左括号一定要在左边,右括号一定要在右边(好像是句废话…)
应该是左括号要在前面,右括号一定要在后面。
没了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int n,ans,temp;
string s;
int main(){
cin>>n>>s;
if(n%2){
cout<<-1<<'\n';
return 0;
}
for(int i=0;i<s.length();i++){
if(s[i]=='(') temp++;
else temp--;
}
if(temp!=0){
cout<<-1<<'\n';
return 0;
}
int st,flag=0;
for(int i=0;i<s.length();i++){
if(s[i]==')') temp--;
else temp++;
if(temp<0&&flag==0){
st=i;flag=1;
}
if(flag&&temp==0){
ans+=i-st+1;
flag=0;
}
}
cout<<ans<<'\n';
return 0;
}