能AC掉的 就看速度 题目梯度跨的好大 - -
A
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
inline ll read(){
char c=getchar();
ll f=1,x=0;
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
const int manx=1e6+5;
const double eps =1e-8;
ll a[manx];
int main(){
ll p=read();
while(p--){
ll n=read();
ll cnt1=0,cnt2=0;
for(int i=1;i<=n;i++){
a[i]=read();
if(a[i]&1) cnt1++;
else cnt2++;
}
if(cnt1==1&&cnt2==0) printf("-1\n");
else {
if(cnt2){
cout<<1<<endl;
for(int i=1;i<=n;i++){
if(a[i]%2==0){
cout<<i<<endl;
break;
}
}
}
else {
ll k=0;
cout<<2<<endl;
for(int i=1;i<=n;i++){
if(a[i]&1) cout<<i<<" ",k++;
if(k==2){
cout<<endl;
break;
}
}
}
}
}
return 0;
}
B
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[100100],b[100100];
int c[100100];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>b[i];
int p=0;
for(int i=1;i*i<=k;i++){
if(k%i==0){
c[p++]=i;
if(i==k/i) continue;
c[p++]=k/i;
}
}
ll ans=0;
for(int i=0;i<p;i++){
int cnt=0;
ll x=0,y=0;
for(int j=0;j<n;j++){
if(a[j]==1) cnt++;
else cnt=0;
if(cnt==c[i]) cnt--,x++;
}
cnt=0;
for(int j=0;j<m;j++){
if(b[j]==1) cnt++;
else cnt=0;
if(cnt==k/c[i]) cnt--,y++;
}
ans=ans+x*y;
}
cout<<ans<<endl;
return 0;
}
C
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
inline ll read(){
char c=getchar();
ll f=1,x=0;
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
int main(){
ll n;
n=read();
string s;
cin>>s;
int l=0,r=0;
for (int i = 0; i <n ; ++i) {
if(s[i]=='(')l++;
else r++;
}
if(l!=r)cout<<"-1";
else{
int a=0,b=0,ans=0;
for (int i = 0; i <n ; ++i) {
if(s[i]=='(')a++;
else b++;
if(b>a){
int tmp=1;
for (int j = i+1; j <n ; ++j) {
if(s[j]==')')b++;
else a++;
tmp++;
if(a==b){i=j;
break;}
}
ans+=tmp;
}
}
cout<<ans<<endl;
}
return 0;
}
D (勉强补明白了) 附上大佬代码
#include<stdio.h>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctype.h>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#define dbg(x) cout<<#x<<" = "<<x<<endl;
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define eps 1e-6
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 400100;
const int mod = 1000000007;
int a[maxn], b[40001000], sum[40001000];
int getans(int l, int r, int x);
int main()
{
int n, i, j, k, x, ans=0;
scanf("%d", &n);
for(i=0;i<n;i++)
scanf("%d", &a[i]);
for(i=0;(1<<i)<=2e7+10;i++)
{
LL num = 0;
x = 1<<(i+1);
memset(b, 0, (x+10)*sizeof(x));
for(j=0;j<n;j++)
b[a[j]%x]++;
sum[0] = b[0];
for(j=1;j<x;j++)
sum[j] = sum[j-1]+b[j];
for(j=0;j<x;j++)
{
int l = (x/2-j+x)%x, r = (x-1-j+x)%x;
num += b[j]*getans(l, r, x);
if(l <= r && j>=l && j<=r)num -= b[j];
else if(l>r && (j>=l || j<=r))num -= b[j];
}
num /= 2;
if(num%2)ans |= 1<<i;
}
printf("%d\n", ans);
return 0;
}
int getans(int l, int r, int x)
{
if(l <= r)return sum[r]-sum[l]+b[l];
else return sum[x-1]-sum[l]+b[l]+sum[r]-sum[0]+b[0];
}
。。。。。。。能看懂代码基本上思路也明白了本场