直接离散化然后暴力染色。
注意离散化的时候在线段头尾都多插一点,否则很容易错。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define nMax 20000
int n;
char s[20];
struct Ask{
int a,b,co;
void read(){
scanf("%d%d%s",&a,&b,s);
a++;
co = (s[0]=='w'?1:0);
}
void out() {
printf("a=%d b=%d co=%d\n",a,b,co);
}
}ask[nMax];
int val[nMax];
#define pb push_back
#define mp make_pair
int Split(){
vector<pair<int,int> > ret;
ret.clear();
ret.pb(mp(0,0));
ret.pb(mp(1000000000,0));
ret.pb(mp(1000000001,0));
for(int i=1;i<=n;i++) {
ret.pb(mp(ask[i].a,i));
ret.pb(mp(ask[i].b,-i));
ret.pb(mp(ask[i].a-1,0));
ret.pb(mp(ask[i].b+1,0));
}
sort(ret.begin(),ret.end());
int cnt = 0, tmp=ret[0].first;
for(int i=0;i<ret.size();i++) {
if(ret[i].first != tmp) tmp=ret[i].first,cnt++;
if(ret[i].second > 0) ask[ ret[i].second ].a = cnt;
else if(ret[i].second < 0) ask[ -ret[i].second ].b = cnt;
val[cnt] = tmp;
}
return cnt;
}
int co[nMax];
int main() {
freopen("input.txt","r",stdin);
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++) ask[i].read();
int cnt = Split();
//for(int i=1;i<=n;i++) ask[i].out();
for(int i=0;i<cnt;i++) co[i]=1;
// co[cnt-1]=0;
for(int i=1;i<=n;i++) {
for(int j=ask[i].a;j<=ask[i].b;j++) co[j] = ask[i].co;
}
int x=-1,y=-1;
int i,j;
for(int i=1;i<cnt;) {
while(i<cnt && co[i]<1) i++;
j=i;
while(j<cnt && co[j]>0) j++;
if(i>=cnt) break;
// printf("%d %d\n",val[i-1],val[j]);
if(x==-1 || val[j]-val[i-1] > val[y]-val[x]) {
x=i-1;y=j;
}
i = j;
}
//printf("x=%d\n",x);
printf("%d %d\n",val[x],val[y]-1);
}
return 0;
}