Ural 1019. Line Painting

来源:互联网 发布:js 等比例缩放图片 编辑:程序博客网 时间:2024/06/03 22:06

Ural 1019. Line Painting

直接离散化然后暴力染色。

注意离散化的时候在线段头尾都多插一点,否则很容易错。


#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;#define nMax 20000int 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_pairint 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;}