话题已被作者删除

没事我以为那个表达式没人写呢,老师上课提过一嘴

@稻叶昙 所以我错在哪里了?

不知道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;
}

@王建力

话说你是不是没有考虑开始走的时间

@稻叶昙 这个我考虑了呀,这个东西用方程组一带就能退出一个更奇妙的式子根本不用考虑时间

@稻叶昙 这个式子是:当两个人能相遇的充要条件是 a_t-a_p=b_t-b_p

今天有巨佬帮忙吗?

这里的en单独放一个数组

@陈梓豪 我弄了结构体

吃瓜看戏

关于s的全删掉

外面添加一个函数f,用于计算最终到达的点和碰撞检测

void f(int l, int r){
	int cnt = 0, k = r+1;
	while(a[k-1].op == 1 && l < k){
		k--;
	}
	for(int i = k; i <= r; i++){
		en[++cnt] = node(w, a[i].p);
	}
	for(int i = l; i < k; i++){
		en[++cnt] = node(a[i].p, h);
	}
	for(int i = l; i <= r; i++){
		ans[a[i].id] = en[i-l+1];
	}
}

g数组不要了
这里改成

int l = 1;
hs[n+1].p = -1e18;
hs[n+1].t = 1e18;
for(int i = 2; i <= n+1; i++){
	if(a[i].cha != a[i-1].cha){
		f(l, i-1);
		l = i;
	}
}

然后这里

node结构体里添加构造函数

struct node{
	int x, y;
	node() {}
	node(int a, int b){
		x = a;
		y = b;
	}
}

接着就是这里

标 ← 的删掉
输入完之后把a数组排序,
sort(a+1, a+1+n, cmp)

bool cmp(per a, per b){
    if(a.cha == b.cha){
        if(a.op == b.op){
            if(a.op == 2){
                return a.p > b.p;
            }else{
                return b.p > a.p;
            }
        }else{
            return a.op > b.op;
        }
    }else{
        return a.cha > b.cha;
    }
}

@陈梓豪 为什么要这样?

@王钰宸涵 同上
image
image

刚上完课,咋样,现在代码给我发一下看看

@金杭东 e代码和原来一样没变

别@了好吗