Codeforces 55 E. Very simple problem

問題

凸多角形および、点Pが与えられる。
凸多角形の頂点からなる三角形で、点Pを含むものはいくつあるか求めよ。

制約条件

多角形の角≦100000

方針

多角形の3点を結んでできる三角形から、Pを含まないような三角形の数を引く。

ある頂点iから見て、点Pを左側に見るような直線を引ける最も遠い頂点jを求めれば、
点Pを左手に見るような頂点iを頂点とする三角形の数は、
(j-i)*(j-i-1)/2個である。


これを尺取り法で、全てのiに対して求めれば、Pを含まない三角形が全て求まる。


点Pが凸多角形にそもそも含まれていない場合があるが、それはすぐに0を出力しておく。

ソースコード

double cross(const P& a, const P& b) {
  return imag(conj(a)*b);
}

void run(){
  int n,t;
  cin>>n;
  vector<P> p(2*n);
  rep(i,n)cin>>p[i].real()>>p[i].imag(), p[i+n]=p[i];
  cin>>t;
  while(t--){
    ll ans=n*(n-1ll)*(n-2)/6;
    P x; cin>>x.real()>>x.imag();
    int j=0;
    
    rep(i,n)if(cross(p[i+1]-p[i],x-p[i+1])>=0){
      cout<<0<<endl; goto END;
    }
    rep(i,n){
      j=max(j,i+1);
      while(j<2*n&&cross(p[j]-p[i],x-p[j])<0)j++;
      ans-=(j-i-1)*(j-i-2ll)/2;
    }
    cout<<ans<<endl; END:;
  }
}