B.
比赛当时真的想了很长时间,看到大佬的解法,感觉真的好厉害啊
简单来说,你要比较两个线段包不包含,你先根据线段的最后排序,从小到大,那么如果出现一个线段的开始比之前最大的开始要小,那么这个线段就包含之前哪个线段
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 3e5 + 10;
struct node{
ll start, end, ll;
}a[MAXN];
bool cmp(struct node a, struct node b){
if (a.end != b.end){
return a.end < b.end;
}
else{
return a.start > b.start;
}
}
int main(){
ll n;
cin >> n;
for (ll i = 0; i < n; i++){
cin >> a[i].start >> a[i].end;
a[i].ll = i + 1;
}
sort(a, a + n, cmp);
ll max = 0, mian;
for (ll i = 0; i < n; i++){
if (a[i].start > max){
max = a[i].start;
mian = a[i].ll;
}
else{
cout << mian << " " << a[i].ll << endl;
return 0;
}
}
cout << "-1" << " " << "-1" << endl;
return 0;
}
C.
这个题目真是卡了我很长时间啊!!!但是也没什么好说的,就是把筛选的条件一定要写好,大概反映出了我思维不够吧
#include <iostream>
using namespace std;
int main(){
long long n, m, k;
cin >> n >> m >> k;
if (k < n){
cout << k + 1 << " " << "1" << endl;
}
else{
k -= (n - 1);
long long a = n, b;
long long d = k % (m - 1);
long long t = k / (m - 1);
if (d == 0) {
a -= (t - 1);
d = (m - 1);
}
else a -= t;
long long lt = a - n;
if (lt % 2 == 0) b = 1 + d;
else b = (m + 1) - d;
cout << a << " " << b << endl;
}
return 0;
}