思路:模拟着做…
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n,m,sc,sl,ec,el,dc = 1,dl = 1,ans = 0;
cin >> n >> m >> sc >> sl >> ec >> el;
int pc = sc, pl = sl;
while(pc != ec && pl != el)
{
if(pc+dc > n || pc+dc < 1)
dc = -dc;
if(pl+dl > m || pl+dl < 1)
dl = -dl;
ans++;
pc += dc, pl += dl;
}
cout << ans << endl;
}
int main()
{
int t;
cin>>t;
while(t--) solve();
}
思路:由于每一组区间最终都要分割至空区间,因此分割后只有两种情况。case1:
其它区间中被它完全覆盖的区间包含起点L;case2:
其它区间中被它完全覆盖的区间不包含起点L。
对于case1:
此时被分割点是其它区间中被它完全覆盖的区间终点R+1的最大值。
对于case2:
此时分割点只能是L。
比赛时,题意没读懂分析了个时间复杂度感觉o(n^2)跑不过,就放弃了…
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n ;
cin>>n;
vector<pair<int,int> > pl;
pair<int,int> p;
for (int i = 0; i < n; i++)
{
cin>>p.first>>p.second;
pl.push_back(p);
}
for (int i = 0; i < n; i++)
{
int x = pl[i].first;
for (int j = 0; j < n; j++)
{
//同起点且完全覆盖
if (pl[j].first == pl[i].first && pl[i].second >pl[j].second) {
x = max(x,pl[j].second + 1);
}
}
cout<<pl[i].first<<" "<<pl[i].second<<" "<<x<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--) solve();
}