
总分第一题30分钟100分第二题30分钟100分第三题1.5小时50分第四题30分钟10分第一题和第二题成功AC于是又用bfs做第三题得了50分第四题不会然后骗分第一题一道十分简单的题AC代码#includeiostream #includecstdio using namespace std; int n,p[10],cnt; struct node{ int a,b,c,d; }x[100005]; int main(){ freopen(fourd.in,r,stdin); freopen(fourd.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinn; for(int i1;in;i){ cinx[i].ax[i].bx[i].cx[i].d; } for(int i1;i8;i){ cinp[i]; } for(int i1;in;i){ if(x[i].ap[1]x[i].ap[5]x[i].bp[2]x[i].bp[6]x[i].cp[3]x[i].cp[7]x[i].dp[4]x[i].dp[8]){ cnt; } } coutcnt; return 0; } //20min10min第二题也是一道非常简单的模拟思路能和成就合成AC代码#includeiostream #includecstdio using namespace std; int n,a,m,t[1000005],ans[1000005],x,q; int main(){ freopen(fit.in,r,stdin); freopen(fit.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinnm; for(int i1;in;i){ cina; t[a]; } for(int i1;in;i){ ans[i]t[i]; t[i1]t[i1]t[i]/2; } cinq; while(q--){ cinx; coutans[x]\n; } return 0; } //15min10min第三题题意有两个机器人在可能不同也可能相同的起点前往可能不同也可能相同的终点你要给这两个机器人指令让他们共同上、下、左、右。但是不会走出边界和碰到障碍物问最少的指令个数。这道题一看就是BFS但怎么BFS这是我们就要结合题目我们发现这两个机器人要同时进行移动注意遇到障碍物或到达地图边界一个机器人不移动另一个机器人移动于是BFS要有4个元素vis要用四维数组AC代码如下#includeiostream #includequeue #includecstdio using namespace std; int n,m,x,y,xx,yy,fx[]{0,0,1,-1},fy[]{-1,1,0,0},cnt,pa,pb,qa,qb,dis[35][35][35][35]; char a[35][35]; bool vis[35][35][35][35]; queueint qx,qy,qxx,qyy; void bfs(int x,int y,int xx,int yy){ qx.push(x),qy.push(y),qxx.push(xx),qyy.push(yy); vis[x][y][xx][yy]1; while(!qx.empty()){ int Xqx.front(),Yqy.front(),XXqxx.front(),YYqyy.front(); qx.pop(),qy.pop(),qxx.pop(),qyy.pop(); for(int i0;i4;i){ int axXfx[i],ayYfy[i],axxXXfx[i],ayyYYfy[i]; if(axn||ax1||aym||ay1||a[ax][ay]!.){ //C1 axX,ayY; } if(axxn||axx1||ayym||ayy1||a[axx][ayy]!.){ axxXX,ayyYY; } if(vis[ax][ay][axx][ayy]0){ //C2 qx.push(ax),qy.push(ay),qxx.push(axx),qyy.push(ayy); vis[ax][ay][axx][ayy]1; dis[ax][ay][axx][ayy]dis[X][Y][XX][YY]1; } } } } int main(){ //freopen(sync.in,r,stdin); //freopen(sync.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinnm; for(int i1;in;i){ for(int j1;jm;j){ cina[i][j]; } } cinxyxxyy; cinpapbqaqb; bfs(x,y,xx,yy); if(vis[pa][pb][qa][qb]1){ //C3 coutdis[pa][pb][qa][qb]; } else{ cout-1; } return 0; }C1在BFS中这里判断的是如果按照方向走后出了地图或走到了障碍物上就回到之前的位置C2既然前面已经判定了机器人不走的情况那现在就应该判断机器人能不能走的情况所以只有当前这个位置没有被访问过时才会访问C3当这两个机器人的终点都被访问过时才能输出值否则输出-1第四题给你一个矩阵求所有子矩阵上的所有数字的异或和的总和然后这个题很显然用暴力枚举左上和右下的坐标会TLE所以要进行降维打击就是把四层循环变成三层循环思路是这样的1.用两层循环枚举一个是上界一个是下界每次循环求出sum。这道题要用二进制拆分因为二进制的每一位作异或都不会影响下一位。我们想如果sum[ R ] ^ sum[ L-1 ] 1就可以得到sum[ L-1]1^sum[ R ]#includeiostream #includecstdio #includecstring using namespace std; int n,m,a[305][305],b[305]; long long sum[305],ans,x; int main(){ //freopen(matrix.in,r,stdin); //freopen(matrix.out,w,stdout); ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cinnm; for(int i1;in;i){ for(int j1;jm;j){ cina[i][j]; } } for(int i1;in;i){ memset(b,0,sizeof(b)); for(int ji;jn;j){ for(int k1;km;k){ b[k]^a[j][k]; //D1 sum[k]sum[k-1]^b[k]; } for(int p1;p10;p){ long long t[5]{1}; //D2 for(int k1;km;k){ x(sum[k](p-1))1; //D3 ans(1(p-1))*t[x^1]; //D4 t[x]; } } } } coutans; return 0; }D1当下界往下时每一列都会出现一个新数这时只须异或上就行D2这是一个桶数组因为二进制只有0和1所以t[5]就行D3这是取第p位D4这一位加的贡献可能不只是1还跟第几位有关所以(1(p-1))*t[x^1]