考试资料下载链接:
戳我
这次考试整体难度并不是非常的难,但是我还是觉得有一点困难那么因为这次三道题都已经被解决了,所以说这次的解题思路分析我就稍微少写一点。
T1
一道非常妙妙的题目,经过我们的研究发现这道题其实只是一道神奇的贪心,我们的思路那么就非常的简单了,我们根据dfs序来更新每一个节点的大小,节点大小的定义是这样的,如果该节点为叶子节点,那么这个点的大小为1,如果是求和操作,那么该节点的大小为其儿子节点大小之和,如果为取大操作,那么该节点的大小就为其两个儿子中最大的那一个,最后我们就可以得到根节点的大小,然后我们就可以在所选取的数中,选取根节点那个大小的那么多个,就为我们所要求的东西。
代码如下:
#include<bits/stdc++.h>
using namespace std;
char ch[10005];
int cnt=0,lenc,n,x[10005],root,sum;
int Buildtree(int k)
{
cnt++;k=cnt;
if(ch[k]=='X') return 1;
int l,r;
l=Buildtree(k),r=Buildtree(k);
if(ch[k]=='A') return l+r;
return max(l,r);
}
bool cmp(int a,int b)
{
if(a>b)return true;return false;
}
int main()
{
scanf("%s",ch+1);lenc=strlen(ch+1);
int lim=Buildtree(root);
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&x[i]);
sort(x+1,x+n+1,cmp);
for(int i=1;i<=lim;++i)sum+=x[i];
printf("%d",sum);
return 0;
}
T2
我觉得这道题我应该不用说什么了,没打出来的同学一定是状态不好,或者是跟我一样陷入了误区,把简单的问题复杂化。
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000005];
long long sum;
int main()
{
freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
if(i>1) sum+=max(a[i-1],a[i]);
}
printf("%lld",sum);
//freopen(stdin);freopen(stdout);
fclose(stdin);fclose(stdout);
return 0;
}
T3
这道题是一道标准的链表题,这也是本人第一次接触链表类题目,因为今天的精神状态不佳,所以说详细的讲解将留到以后完善:
代码如下:(相信大家认真看一下也是没有问题的!)
#include<bits/stdc++.h>
using namespace std;
const int N=2001;
int A[2004][2004],num[2004][2004],val[2004][2004],n,m,q;
int X[5000500],Y[5000500];
void spawning(int P,int Q,int R,int S,int Mod){
int T=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
T=(T+(1ll*(i+j)*P+1ll*i*j*Q+1ll*i*R+1ll*j*S)%Mod+Mod)%Mod,A[i][j]=T;
A[P%n+1][P%m+1]^=1;A[P%n+1][Q%m+1]^=1;A[P%n+1][R%m+1]^=1;A[P%n+1][S%m+1]^=1;
A[Q%n+1][P%m+1]^=1;A[Q%n+1][Q%m+1]^=1;A[Q%n+1][R%m+1]^=1;A[Q%n+1][S%m+1]^=1;
A[R%n+1][P%m+1]^=1;A[R%n+1][Q%m+1]^=1;A[R%n+1][R%m+1]^=1;A[R%n+1][S%m+1]^=1;
A[S%n+1][P%m+1]^=1;A[S%n+1][Q%m+1]^=1;A[S%n+1][R%m+1]^=1;A[S%n+1][S%m+1]^=1;
}
void prepare()
{
for(int i=0;i<=n+1;++i)for(int j=0;j<=m+1;++j)num[i][j]=i*N+j;
for(int i=0;i<=n+1;++i)for(int j=0;j<=m+1;++j)
X[num[i][j]]=num[i][j+1],Y[num[i][j]]=num[i+1][j],val[i][j]=A[i][j];
}
void modify(int x,int y,int x1,int y1,int h,int w)
{
int now1,now2,now3,now4;
now1=num[x][0];now2=num[x1][0];
for(int i=1;i<y;++i) now1=X[now1];
for(int i=1;i<y1;++i) now2=X[now2];
now3=X[now1];now4=X[now2];
for(int i=1;i<w;++i)now3=X[now3],now4=X[now4];
for(int i=0;i<h;++i)
{
swap(X[now1],X[now2]);
swap(X[now3],X[now4]);
now1=Y[now1],now2=Y[now2];
now3=Y[now3],now4=Y[now4];
}
now1=num[0][y];now2=num[0][y1];
for(int i=1;i<x;++i) now1=Y[now1];
for(int i=1;i<x1;++i) now2=Y[now2];
now3=Y[now1];now4=Y[now2];
for(int i=1;i<h;++i) now3=Y[now3],now4=Y[now4];
for(int i=0;i<w;++i)
{
swap(Y[now1],Y[now2]);
swap(Y[now3],Y[now4]);
now1=X[now1],now2=X[now2];
now3=X[now3],now4=X[now4];
}
}
void query()
{
int p1=0,x,y;
for(int i=1;i<=n;++i)
{
p1=num[i][0];
for(int j=1;j<=m;++j)
{
p1=X[p1];
y=p1%N;
x=p1/N;
A[i][j]=val[x][y];
}
}
}
void checker(){
long long Pin=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
Pin+=(1ll*i*n+j)*A[i][j];
printf("%lld
",Pin);
}
int main()
{
int a,b,c,d,e;
scanf("%d%d%d%d%d%d%d%d",&n,&m,&q,&a,&b,&c,&d,&e);
spawning(a,b,c,d,e);prepare();
for(int i=1;i<=q;++i)
{
int x,y,x1,y1,h,w;
scanf("%d%d%d%d%d%d",&x,&y,&x1,&y1,&h,&w);
modify(x,y,x1,y1,h,w);
}
query();
checker();
return 0;
}