A
【题解】从后往前找
#include<stdio.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#define PI 2*acos(0.0)
#define ll long long
#define INT_MAX 2147483647
using namespace std;
char a[3005][3005];
int n;
bool h[3005]= {false},v[3005]= {false};
int hh[3005][205]= {0},vv[3005][205]= {0};
struct data
{
char e,col;
int w;
} ans[10005];
int findh(char &co)
{
for (int i=1; i<=n; i++)
if (!h[i] && a[i][0]=='0')
{
co='a';
for (int j='a'; j<='z'; j++)
if (hh[i][j]!=0)
{
co=j;
break;
}
return i;
}
return -1;
}
int findv(char &co)
{
for (int i=1; i<=n; i++)
if (!v[i] && a[0][i]=='0')
{
co='a';
for (int j='a'; j<='z'; j++)
if (vv[i][j]!=0)
{
co=j;
break;
}
return i;
}
return -1;
}
void checkh()
{
for (int i=1; i<=n; i++)
if (!h[i])
{
bool flag=true;
int ff=0;
for (int j='a'; j<='z'; j++)
{
if (ff!=0 && hh[i][j]!=0)
{
flag=false;
break;
}
if (ff==0 && hh[i][j]!=0)
ff=hh[i][j];
}
if (flag)
a[i][0]='0';
else
a[i][0]='1';
}
return;
}
void checkv()
{
for (int i=1; i<=n; i++)
if (!v[i])
{
bool flag=true;
int ff=0;
for (int j='a'; j<='z'; j++)
{
if (ff!=0 && vv[i][j]!=0)
{
flag=false;
break;
}
if (ff==0 && vv[i][j]!=0)
ff=vv[i][j];
}
if (flag)
a[0][i]='0';
else
a[0][i]='1';
}
return;
}
int main()
{
cin>>n;
for (int i=1; i<=n; i++)
{
char st[3005];
scanf("%s",st);
for (int j=1; j<=n; j++)
{
a[i][j]=st[j-1];
if (a[i][j]!='?')
{
hh[i][a[i][j]]++;
vv[j][a[i][j]]++;
}
}
}
checkh();
checkv();
int t=1;
while (t<=2*n)
{
char co;
int x=findh(co),y;
if (x!=-1)
{
ans[t].col=co;
ans[t].e='h';
ans[t].w=x;
h[x]=true;
for (int j=1; j<=n; j++)
if (a[x][j]!='?')
vv[j][a[x][j]]--;
checkv();
}
else
{
y=findv(co);
ans[t].col=co;
ans[t].e='v';
ans[t].w=y;
v[y]=true;
for (int i=1; i<=n; i++)
if (a[i][y]!='?')
hh[i][a[i][y]]--;
checkh();
}
t++;
}
for (int i=2*n; i>=1; i--)
printf("%c %d %c\n",ans[i].e,ans[i].w,ans[i].col);
return 0;
}
C
【题解】枚举首项和公比
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define mst(a,b) memset(a,b,sizeof a)
#define PI 2*acos(0.0)
#define ll long long
#define INT_MAX 2147483647
using namespace std;
long long sn,ans=0;
int main()
{
IOS
cin>>sn;
for (int i=1; i<sn; i++)
if (sn%i==0)
{
for (int j=i; j<=sn; j++)
if (j%i==0)
{
long long sum=0,q=j/i,ai=i;
while(true)
{
sum+=ai;
ai*=q;
if (sum==sn)
{
ans++;
break;
}
if (sum>sn)
break;
}
}
}
cout<<ans<<endl;
return 0;
}
D
【题解】st表
#include<stdio.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define mst(a,b) memset(a,b,sizeof a)
using namespace std;
int n,w,f[100005][50];
int get(int l,int r)
{
int k=log2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
bool check(int m)
{
long long sum=0;
for (int i=1;i<=n;i+=m)
sum+=get(i,min(i+m-1,n))+1;
if (sum-1<=w) return true; else return false;
}
int main()
{
IOS
cin>>n>>w;
for (int i=1;i<=n;i++) cin>>f[i][0];
for (int j=1;(1<<j)<=n;j++)
for (int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
for (int i=1;i<=n;i++)
if (check(i))
{
cout<<i<<endl;
return 0;
}
return 0;
}
L
【题解】找规律
#include<stdio.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#define PI 2*acos(0.0)
#define ll long long
#define INT_MAX 2147483647
using namespace std;
long long ans=0,n;
int main()
{
cin>>n;
while (n>1)
{
if (n%2==0)
{
n/=2;
ans+=2*n;
}
else
{
n=(n+1)/2;
ans+=2*n;
n=n*3-1;
if (n>=1e15)
{
cout<<-1<<endl;
return 0;
}
}
}
cout<<ans<<endl;
return 0;
}