良心评测机
这是一道队列和栈的题。
对于所有提交用一个队列维护,而每个选手的提交分别用一个栈来维护,再开一个标记数组标记提交是否已评测即可。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
ll n, id;
string tmp;
queue<array<int,3>> q;
stack<array<int,2>> st[(int)1e5+9];
bitset<(int)1e6+9> vis;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1,op,uid;i<=n;++i){
cin>>op;
if(op==1){
cin>>uid>>tmp;
q.push({uid,i,tmp == "CORRECT"});
st[uid].push({i,tmp == "CORRECT"});
}else{
if(id){
while(!st[id].empty()&&vis[st[id].top()[0]])st[id].pop();
if(!st[id].empty()){
auto [aa,bb]=st[id].top();st[id].pop();
cout<<aa<<"\n";
vis[aa]=true;
if(!bb)id=0;
continue;
}
}
while(!q.empty()&&vis[q.front()[1]])q.pop();
if(!q.empty()){
auto [aa,bb,cc] = q.front();q.pop();
cout<<bb<<"\n";
vis[bb]=true;
if(cc)id=aa;
else id=0;
}else cout<<"NOTHING HAPPENED\n";
}
}
return 0;
}
寻径指津
这是一道bfs题目,因为无压力桩的版本已经在22年的萌新赛出过,所以今天的是有压力桩的版本。
用一个三维数组
#include <bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
using ll=long long;
constexpr int N = 109;
constexpr pii dirs[]={{1,0},{0,1},{-1,0},{0,-1}};
pii st,en;
int a[N][N],n,m,tot;
int dis[N][N][1<<11],vis[N][N][1<<11],ans=0x3f3f3f3f;
pair<array<int,3>,char> lst[N][N][1<<11];
map<pii,char> covdirs;
char c;
map<pii,int> ylz;
pii cov[20];
queue<array<int,3>> q;
int add(int x,int y){
if(ylz.count({x,y}))return 1ll<<ylz[{x,y}];
else return 0;
}
void solmp(int x,int sta){
if(sta){
for(int i=0;i<10;++i)if((x>>i)&1){
auto [xx,yy]=cov[i];
a[xx][yy]=2;
}
}else{
for(int i=0;i<10;++i)if((x>>i)&1){
auto [xx,yy]=cov[i];
a[xx][yy]=3;
}
}
}
int main()
{
{
covdirs[{-1,0}]='U';
covdirs[{1,0}]='D';
covdirs[{0,-1}]='L';
covdirs[{0,1}]='R';
}
memset(dis,0x3f,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
scanf(" %c",&c);
if(c=='.')a[i][j]=1;
else if(c=='#')a[i][j]=2;
else if(c=='?'){
a[i][j]=3,ylz[{i,j}]=tot,cov[tot]={i,j};
tot+=1;
}
else if(c=='S')a[i][j]=4,st={i,j};
else a[i][j]=5,en={i,j};
}
dis[st.first][st.second][0]=0;
q.push({st.first,st.second,0});
while(!q.empty()){
auto [aa,bb,cc]=q.front();q.pop();
if(vis[aa][bb][cc])continue;
vis[aa][bb][cc]=1;
solmp(cc,1);
for(auto [xx,yy]:dirs){
int ta=aa,tb=bb,tc=cc;
while(a[ta+xx][tb+yy]!=2){
tc|=add(ta,tb);
ta+=xx,tb+=yy;
if((pii){ta,tb}==en)break;
}
if(dis[ta][tb][tc]>dis[aa][bb][cc]+1)dis[ta][tb][tc]=dis[aa][bb][cc]+1,lst[ta][tb][tc]=