QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#602329 | #7029. Xu Xiake in Henan Province | ucup-team5071# | WA | 1ms | 3572kb | C++20 | 7.1kb | 2024-09-30 22:58:44 | 2024-09-30 23:00:21 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const bool test=true;
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;
if(test){if(x>0&&y>0)cout<<"merge x="<<x<<" y="<<y<<endl;}
x+=y;
};
int tt=0;
while(q--){
if(test){
cout<<"-----------------------------------------------------------"<<endl;
cout<<"times = "<<++tt<<endl;
cout<<"lu="<<lu<<" ld="<<ld<<" ru="<<ru<<" rd="<<rd<<endl;
cout<<"x1="<<x1<<" x2="<<x2<<" y1="<<y1<<" y2="<<y2<<endl;
cout<<"l1="<<l1<<" l2="<<l2<<" t1="<<t1<<" t2="<<t2<<endl;
cout<<"left :";for(int i=1;i<=n;i++)cout<<left[i]<<" \n"[i==n];
cout<<"right :";for(int i=1;i<=n;i++)cout<<right[i]<<" \n"[i==n];
cout<<"up :";for(int i=1;i<=n;i++)cout<<up[i]<<" \n"[i==n];
cout<<"down :";for(int i=1;i<=n;i++)cout<<down[i]<<" \n"[i==n];
}
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(k==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+1]&&px[y1+1]<x2){
merge(left[px[y1]+1],1);
}
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(y1==y2)break;
}
if(c=='R'){
if(y1+1<y2){//not merge
if(x1==x2){
merge(ru,up[y2-1]);
}
else{
if(x1<px[y2-1]&&px[y2-1]<x2){
merge(right[px[y2-1]],1);
}
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(y1==y2)break;
}
if(c=='U'){
if(x1+1<x2){//not merge
if(y1==y2){
merge(lu,left[x1+1]);
}
else{
if(y1<py[x1+1]&&py[x1+1]<y2){
merge(up[py[x1+1]],1);
}
merge(lu,left[x1+1]);
merge(ru,right[x1+1]);
}
}
else{//merge
if(y1==y2){
merge(lu,ld);
}
else{
merge(lu,ld);
merge(ru,rd);
for(int i=y1+1;i<y2;i++)merge(up[i],down[i]);
}
}
x1++;l2--;
if(x1==x2)break;
}
if(c=='D'){
if(x1+1<x2){//not merge
if(y1==y2){
merge(ld,left[x2-1]);
}
else{
if(y1<py[x2-1]&&py[x2-1]<y2){
merge(down[py[x2-1]],1);
}
merge(ld,left[x2-1]);
merge(rd,right[x2-1]);
}
}
else{//merge
if(y1==y2){
merge(lu,ld);
}
else{
merge(lu,ld);
merge(ru,rd);
for(int i=y1+1;i<y2;i++)merge(up[i],down[i]);
}
}
x2--;l1++;
if(x1==x2)break;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;while(T--)solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3572kb
input:
5 0 0 0 0 0 0 0 1 1 1 0 0 2 1 1 0 1 2 3 4
output:
----------------------------------------------------------- times = 1 lu=0 ld=0 ru=0 rd=0 x1=1 x2=0 y1=1 y2=0 l1=1 l2=0 t1=1 t2=0 left :right :up :down :
result:
wrong answer 1st lines differ - expected: 'Typically Otaku', found: '-----------------------------------------------------------'