Codeforces 1159F Winding polygonal line(叉积)

 

其实这个几何写起来还是比较方便,只用到了叉积。首先我们贪心的考虑一种情况,对于任意给定的LR串,我们起点的选择肯定是在这些点围成的凸包端点上,对于这样的起点来说,他对于L或者R都是有选择的机会,而且一定可以从剩下n-1个点选出两个点满足要求(可以画图观察),接下来我们对于这个起点出发开始去寻找满足LR的点,对于第二个点来说,我们需要去找到剩下n-1个点中最外侧的点,并且满足剩下n-2个点都在向量point[1]-point[0]的左侧或者右侧,这个可以直接由叉积得到,那么我们便得到了第二个点,显然第二个点也一定是在剩下n-1个点围成的凸包端点上,无论取剩下n-2个点中的任何一个都是满足两个向量满足 point[2]-point[1],point[1]-point[0]的向量转向满足s[0],那么问题就可以看成是一个 n'=n-2 的新问题,那么此时起点是point[1],那么依然通过上述方法找到point[2],反复如此,直到找到 n-1 个点,最后剩下一个点必然满足最后一个s的转向,那么此题也是没有-1的情况。

  1 //      ——By DD_BOND
  2 
  3 //#include<bits/stdc++.h>
  4 #include<functional>
  5 #include<algorithm>
  6 #include<iostream>
  7 #include<sstream>
  8 #include<iomanip>
  9 #include<climits>
 10 #include<cstring>
 11 #include<cstdlib>
 12 #include<cstddef>
 13 #include<cstdio>
 14 #include<memory>
 15 #include<vector>
 16 #include<cctype>
 17 #include<string>
 18 #include<cmath>
 19 #include<queue>
 20 #include<deque>
 21 #include<ctime>
 22 #include<stack>
 23 #include<map>
 24 #include<set>
 25 
 26 #define fi first
 27 #define se second
 28 #define MP make_pair
 29 #define pb push_back
 30 #define INF 0x3f3f3f3f
 31 #define pi 3.1415926535898
 32 #define lowbit(a)  (a&(-a))
 33 #define lson l,(l+r)/2,rt<<1
 34 #define rson (l+r)/2+1,r,rt<<1|1
 35 #define Min(a,b,c)  min(a,min(b,c))
 36 #define Max(a,b,c)  max(a,max(b,c))
 37 #define debug(x)  cerr<<#x<<"="<<x<<"\n";
 38 
 39 using namespace std;
 40 
 41 typedef long long ll;
 42 typedef pair<int,int> P;
 43 typedef pair<ll,ll> Pll;
 44 typedef unsigned long long ull;
 45 
 46 const ll LLMAX=2e18;
 47 const int MOD=1e9+7;
 48 const double eps=1e-8;
 49 const int MAXN=1e6+10;
 50 const int hmod1=0x48E2DCE7;
 51 const int hmod2=0x60000005;
 52 
 53 inline ll sqr(ll x){ return x*x; }
 54 inline int sqr(int x){ return x*x; }
 55 inline double sqr(double x){ return x*x; }
 56 ll __gcd(ll a,ll b){ return b==0? a: __gcd(b,a%b); }
 57 ll qpow(ll a,ll n){ll sum=1;while(n){if(n&1)sum=sum*a%MOD;a=a*a%MOD;n>>=1;}return sum;}
 58 inline int dcmp(double x){    if(fabs(x)<eps) return 0;    return (x>0? 1: -1); }
 59 
 60 int use[MAXN];
 61 vector<int>ans;
 62 
 63 struct Point{
 64     ll x,y,id;
 65     Point(){ x=y=0; }
 66     Point(ll a,ll b){ x=a,y=b; }
 67     Point operator -(const Point &n)const{
 68         return Point(x-n.x,y-n.y);
 69     }
 70     bool operator <(const Point &n)const{
 71         if(x==n.x)  return y<n.y;
 72         return x<n.x;
 73     }
 74 }point[MAXN];
 75 
 76 int dcmp(ll x){
 77     if(x==0)    return 0;
 78     return x>0? 1: -1;
 79 }
 80 
 81 bool cmp(Point a,Point b){
 82     return a.id<b.id;
 83 }
 84 
 85 ll cross(Point a,Point b){
 86     return a.x*b.y-a.y*b.x;
 87 }
 88 
 89 int main(void)
 90 {
 91     ios::sync_with_stdio(false);    cin.tie(0);   cout.tie(0);
 92     int n;  cin>>n;
 93     for(int i=1;i<=n;i++)   cin>>point[i].x>>point[i].y,point[i].id=i;
 94     string s;   cin>>s;
 95     sort(point+1,point+n+1);
 96     ans.pb(point[1].id),use[point[1].id]=1;
 97     sort(point+1,point+n+1,cmp);
 98     for(int i=0;i<s.size();i++){
 99         int k=0,flag=(s[i]=='L'? 1: -1);
100         for(int j=1;j<=n;j++){
101             if(use[j])  continue;
102             if(!k||dcmp(cross(point[k]-point[ans[i]],point[j]-point[k]))!=flag) k=j;
103         }
104         ans.pb(k),use[k]=1;
105     }
106     for(int i=1;i<=n;i++)
107         if(!use[i])
108             ans.pb(i);
109     for(auto i:ans) cout<<i<<' ';
110     return 0;
111 }
posted @ 2019-05-13 19:10  DD_BOND  阅读(391)  评论(0编辑  收藏  举报