AC:http://tioj.ck.tp.edu.tw/submissions/17674
解題方向:單調性,貪心法
題目大意:兩個人分別有不同的兩組線段,有標記放置的位置,試問誰能用最少的線段覆蓋指定區間。
解法:我們可以分開計算兩個人所需的線段,把線段排序後,由左向右掃描,檢查最右界是否能到達終點即可。
本方法最費時間的為排序,總複雜度為$O(n\log n)$
透過特判可以把時間壓到$140ms$,不過$visitorIKC$的$61ms$我還沒頭緒,
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
pair<int,int> d[2][100000];
int N[2];
int X,Y;
int ans[2];
register int i,j,mx,ed;
bool flag;
while( cin>>N[0]>>N[1] )
{
ans[0]=ans[1]=INT_MAX;
for(i=0;i<2;++i)
for(j=0;j<N[i];++j)
cin>>d[i][j].first>>d[i][j].second;
cin>>X>>Y;
flag = false;
if( X == Y ) {
for(i=0;i<100000000;++i);
for(i=0;i<2;++i)
for(j=0;j<N[i];++j)
if( d[i][j].first <= X && X <= d[i][j].second )
{
ans[i] = 1 ;
break;
}
}
else
{
sort(d[0],d[0]+N[0]);
sort(d[1],d[1]+N[1]);
for(i=0;i<2;++i)
{
ed = mx = X;
j = 0;
while( j!=N[i] && ed < Y )
{
ans[i]++;
ed = mx;
flag = false;
while( j!=N[i] && d[i][j].first <= ed ) {
if( d[i][j].second > mx )
{
flag = true;
mx = d[i][j].second;
}
j++;
}
if( !flag ) break;
}
if( mx < Y ) ans[i] = INT_MAX;
}
}
if( ans[0] == ans[1] && ans[0] == INT_MAX ) cout<<"TIE\n";
else if( ans[0] <= ans[1] ) cout<<"A WIN\n";
else cout<<"B WIN\n";
}
}
沒有留言:
張貼留言