iwtgm-31
A.
int a[5];
void solve() {
int ma=0;
for(int i=1;i<=3;i++){
cin>>a[i];
a[i]=(a[i]+1)/2;
ma=max(ma,a[i]);
}
int ans=0;
for(int i=1;i<=3;i++){
if(a[i]==ma){
ans=(ma-1)*3+i-1+30;
}
}
cout<<ans;
}
B.
map<pair<int,char>,int>hang,lie;
char g[105][105];
void solve() {
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
hang[{i,g[i][j]}]++;
lie[{j,g[i][j]}]++;
}
}
string ans="";
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(hang[{i,g[i][j]}]>=2||lie[{j,g[i][j]}]>=2)continue;
ans+=g[i][j];
}
}
cout<<ans;
}
C.
该题证明,还是要手动模拟
发现奇数位和偶数位的变化一致
n是偶数加减相同无贡献
奇数时,奇数位都-1,偶数位都+1,贡献位1
LL WA一发
void solve() {
int n,m,k;cin>>n>>m>>k;
int mi=inf;
for(int i=1,x;i<=n;i++){
cin>>x;
if(i&1)mi=min(mi,x);
}
if(n%2==0){
cout<<"0";return ;
}
int ans=min(m/((n+1)/2)*k,mi);
cout<<ans;
}
E.
爆搜会t,考虑对空白格进行优化
即记录该点上下左右的点
题解取名十字链表,实在没必要取这么高大上的名字
char s[5010][5010];
int U[5050],D[5050],L[5050],R[5050];
int n,m;
void init(){
for(int i=0;i<n;i++){
int l=-1;
for(int j=0;j<m;j++){
if(s[i][j]!='.'){
int now=i*m+j;
L[now]=l;
if(l!=-1)R[l]=now;
l=now;
}
}
R[l]=-1;
}
for(int i=0;i<m;i++){
int l=-1;
for(int j=0;j<n;j++){
if(s[j][i]!='.'){
int now=j*m+i;
U[now]=l;
if(l!=-1)D[l]=now;
l=now;
}
}
D[l]=-1;
}
}
int dfs(int x,int y){
int now=x*m+y;
if(U[now]!=-1)D[U[now]]=D[now];
if(D[now]!=-1)U[D[now]]=U[now];
if(L[now]!=-1)R[L[now]]=R[now];
if(R[now]!=-1)L[R[now]]=L[now];
int go;
if(s[x][y]=='U')go=U[now];
else if(s[x][y]=='D')go=D[now];
else if(s[x][y]=='L')go=L[now];
else if(s[x][y]=='R')go=R[now];
if(go==-1)return 1;
return dfs(go/m,go%m)+1;
}
void solve() {
int ans=-1,num=0;
cin>>n>>m;
for(int i=0;i<n;i++)scanf("%s",s[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]!='.'){
init();
int now=dfs(i,j);
if(now>ans)ans=now,num=1;
else if(now==ans)++num;
}
}
}
cout<<ans<<' '<<num;
}