第24场周赛
P4070. 异或
题目描述:P4070
思路:
签到题~~,省略
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=20;
int a[N];
int n;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int v=a[n-1];
sort(a,a+n);
int ans=v^a[n-1];
printf("%d",ans);
return 0;
}
P4071. 国际象棋
题目描述:P4071
思路:
枚举,类似于bfs,弄一个方向数组
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string a,b;
bool g[9][9];
int dx[]={-2,-1,1,2,2,1,-1,-2,0};
int dy[]={1,2,2,1,-1,-2,-2,-1,0};
int main(){
cin>>a>>b;
int x1=a[0]-'a'+1,y1=a[1]-'0';
int x2=b[0]-'a'+1,y2=b[1]-'0';
for(int i=1;i<=8;i++) g[x1][i]=true;
for(int i=1;i<=8;i++) g[i][y1]=true;
for(int i=0;i<8;i++){
int x=x1+dx[i],y=y1+dy[i];
if(x<1||x>8||y<1||y>8) continue;
g[x][y]=true;
}
for(int i=0;i<9;i++){
int x=x2+dx[i],y=y2+dy[i];
if(x<1||x>8||y<1||y>8) continue;
g[x][y]=true;
}
int cnt=0;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if(!g[i][j]) cnt++;
}
}
printf("%d",cnt);
return 0;
}
P4072. 习题册
题目描述:P4072
思路:
因为n=100000,所以时间复杂度要控制在O(nlogn)以内,考虑用堆,我们建三个堆,分别对应三个知识点,此时有个问题,如果一个习题册同时在两个堆我们最多只能删其中一个(pop),而另一个删不了,这时用类似懒操作的方法在另一个上面做个标记,所以我们pair里还要存一个编号,方便用st数组删除
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int>PII;
const int N=1e6+10;
priority_queue<PII,vector<PII>,greater<PII>> heap[4];//1~3
int n,m;
int p[N];
bool st[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
for(int i=1;i<=2;i++){
for(int j=1;j<=n;j++){
int a;
scanf("%d",&a);
heap[a].push({p[j],j});
}
}
scanf("%d",&m);
while(m--){
int c;
scanf("%d",&c);
while(heap[c].size()&&st[heap[c].top().y]) heap[c].pop();
if(!heap[c].size()) printf("-1 ");
else{
PII t=heap[c].top();
heap[c].pop();
printf("%d ",t.x);
st[t.y]=true;//懒操作
}
}
return 0;
}