QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#602281 | #7029. Xu Xiake in Henan Province | ucup-team5071# | WA | 0ms | 3588kb | C++20 | 4.7kb | 2024-09-30 22:36:37 | 2024-09-30 22:36:38 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
int n,q;
cin>>n>>q;
ll ans=0;
if(n==1){
int z;cin>>z>>z;
while(q--){
char c;cin>>c;
if(c=='!')cout<<"0\n";
else if(c=='?'){
int x;cin>>x;
cout<<"1 1\n";
}
else {
int x;cin>>x;
}
}
return;
}
vector<int> x(n+1),y(n+1);
vector<int> up(n+1),down(n+1),left(n+1),right(n+1);
vector<int> px(n+1);//the x of point on y
vector<int> py(n+1);//the y of point on x
int lu=0,ld=0,ru=0,rd=0;
int l1=1,l2=n,t1=1,t2=n;//actually bound
int x1=1,x2=n,y1=1,y2=n;//virtual bound
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
py[x[i]]=y[i];
px[y[i]]=x[i];
if(x[i]==1&&y[i]==1)lu++;
else if(x[i]==1&&y[i]==n)ru++;
else if(x[i]==n&&y[i]==1)ld++;
else if(x[i]==n&&y[i]==n)rd++;
else if(x[i]==1)up[y[i]]++;
else if(x[i]==n)down[y[i]]++;
else if(y[i]==1)left[x[i]]++;
else if(y[i]==n)right[x[i]]++;
}
auto actual_point = [&](int x,int y){
return make_pair(x-x1+l1,y-y1+t1);
};
auto merge = [&](int &x,int y){//calcu ans when merge
ans+=(ll)x*y;
x+=y;
};
while(q--){
char c;cin>>c;
if(c=='!'){cout<<ans<<"\n";continue;}
if(c=='?'){
int i;cin>>i;
int ax,ay;
if(x[i]<=x1&&y[i]<=y1)tie(ax,ay)=actual_point(x1,y1);
else if(x[i]<=x1&&y[i]>=y2)tie(ax,ay)=actual_point(x1,y2);
else if(x[i]>=x2&&y[i]<=y1)tie(ax,ay)=actual_point(x2,y1);
else if(x[i]>=x2&&y[i]>=y2)tie(ax,ay)=actual_point(x2,y2);
else if(x[i]<=x1)tie(ax,ay)=actual_point(x1,y[i]);
else if(x[i]>=x2)tie(ax,ay)=actual_point(x2,y[i]);
else if(y[i]<=y1)tie(ax,ay)=actual_point(x[i],y1);
else if(y[i]>=y2)tie(ax,ay)=actual_point(x[i],y2);
else tie(ax,ay)=actual_point(x[i],y[i]);
cout<<ax<<" "<<ay<<"\n";
continue;
}
int k;cin>>k;
{//move the actual bound to the map bound
int d=0;
if(c=='L'){d=min(k,t1-1);k-=d;t1-=d;t2-=d;}
if(c=='R'){d=min(k,n-t2);k-=d;t1+=d;t2+=d;}
if(c=='U'){d=min(k,l1-1);k-=d;l1-=d;l1-=d;}
if(c=='D'){d=min(k,n-l2);k-=d;l2+=d;l2+=d;}
if(d==0)continue;
}
if((c=='L'||c=='R')&&y1==y2){//just line move
continue;
}
if((c=='U'||c=='D')&&x1==x2){//just line move
continue;
}
while(k--){
if(c=='L'){
if(y1+1<y2){//not merge
if(x1==x2){
merge(lu,up[y1+1]);
}
else{
if(x1<px[y1]&&px[y1]<x2){
merge(left[px[y1]],1);
left[px[y1]]++;
}
merge(lu,up[y1+1]);
merge(ld,down[y1+1]);
}
}
else{//merge
if(x1==x2){
merge(lu,ru);
}
else{
merge(lu,ru);
merge(ld,rd);
for(int i=x1+1;i<x2;i++)merge(left[i],right[i]);
}
}
y1++;t2--;
}
if(c=='R'){
if(y1+1<y2){//not merge
if(x1==x2){
merge(ru,up[y2-1]);
}
else{
if(x1<px[y2]&&px[y2]<x2){
merge(right[px[y2]],1);
right[px[y2]]++;
}
merge(ru,up[y2-1]);
merge(rd,down[y2-1]);
}
}
else{//merge
if(x1==x2){
merge(lu,ru);
}
else{
merge(lu,ru);
merge(ld,rd);
for(int i=x1+1;i<x2;i++)merge(left[i],right[i]);
}
}
y2--;t1++;
}
if(c=='U'){
}
if(c=='D'){
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;while(T--)solve();
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3588kb
input:
5 0 0 0 0 0 0 0 1 1 1 0 0 2 1 1 0 1 2 3 4
output:
result:
wrong answer 1st lines differ - expected: 'Typically Otaku', found: ''