可能存在这样的情况,操作类型为 1 的man和操作类型为 2 的man在某种规则下应该是交替排列或者有特定的先后顺序,简单反转会破坏这种顺序。你看下是不是
啊,我看看
会不会你想的有点复杂?就是道模拟……
等我一阵,找点东西
没想到你居然还写(英文名忘了)表达式这种东西啊
没事我以为那个表达式没人写呢,老师上课提过一嘴
不知道555这种思路我都挺难想的
如果对g的遍历不理解我加了一下注释:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
I AK IOI;
int n,w,h;
struct node{
int x,y;
};
struct per{
int id,op,p,t,cha;
node en;
}a[200005];
unordered_map<int,vector<int> >g;
int main(){
//freopen("","r",stdin);
//freopen("","w",stdout);
cin>>n>>w>>h;
vector<node>ans(n+1);
for(int i=1;i<=n;i++){
cin>>a[i].op>>a[i].p>>a[i].t;
a[i].id=i;
a[i].cha=a[i].t-a[i].p;
if(a[i].op==1)a[i].en={w,a[i].p};
else a[i].en={a[i].p,h};
g[a[i].cha].push_back(i);
}
for(auto it:g){
vector<int>op1,op2;
for(auto i:it.second){
if(a[i].op==1)op1.push_back(i);//如果方向是第一类则加入op1
else op2.push_back(i);//如果方向是第二类则加入op2
}
sort(op1.begin(),op1.end(),[&](int t1,int t2){
return a[t1].p<a[t2].p;
});//将op1按照p升序排序
sort(op2.begin(),op2.end(),[&](int t1,int t2){
return a[t1].p>a[t2].p;
});//将op2按照p降序排序
vector<int>s;
s.insert(s.end(),op1.begin(),op1.end());
s.insert(s.end(),op2.begin(),op2.end());
//将所有点加入s
vector<node>res;
for(auto f:s)res.push_back(a[f].en);//将s中的所有点的终点加入res
reverse(res.begin(),res.end());//将res反转
for(int j=0;j<s.size();j++)ans[a[s[j]].id]=res[j];//将res按照id顺序加入ans
}
for(int i=1;i<=n;i++)cout<<ans[i].x<<' '<<ans[i].y<<endl;
i_ak ioi;
}
今天有巨佬帮忙吗?