Cod sursa(job #1020855)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 2 noiembrie 2013 19:02:03
Problema Zota & Chidil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<fstream>
#include<algorithm>
using namespace std;
int dist,n,m,x,y;  //SOLUTIE DE 0 PUNCTE CA SA AM SURSA SALVATA
int nr,aux,sol,t1,t2,k;
char dir;
pair <int, int> vx[1400000],vy[1400000];
ifstream in("zc.in"); ofstream out("zc.out");
inline void inserare(int x, int y){
    for(int i=-2;i<=2;++i)
        for(int j=-2;j<=2;++j)
            if(abs(i)+abs(j)<=2 && (x+i || y+j)){
                vx[++nr].first=y+i;
                vx[nr].second =x+j;
            }
}
inline int search(pair <int,int> v[1400000],int x,int y){
    int st=1,dr=nr,mid;
    pair<int,int> t;
    t.first=x, t.second=y;
    if(v[nr]<=t) return nr+1;
    while(st<dr){
        mid=(st+dr)/2;
        if(v[mid]<=t) st=mid+1;
        else dr=mid;
    }
    return st;
}
int main(){
    in>>n>>m;
    for(int i=1;i<=n;++i){
        in>>x>>y;
        inserare(x,y);
    }
    vx[0]=vx[1]; vx[0].first--;
    sort(vx+1,vx+nr+1);
    int nr2=0;
    for(int i=1;i<=nr;++i) if(vx[i-1]!=vx[i]) vx[++nr2]=vx[i];
    nr=nr2;
    for(int i=1;i<=nr;++i) vy[i].first=vx[i].second, vy[i].second=vx[i].first;
    sort(vy+1,vy+nr+1);
    x=y=0;
    for(int i=1; i<=m; ++i){
        in>>dir>>k;
        switch(dir){
            case 'N': {t1=search(vy,x,y); y+=k; t2=search(vy,x,y); break;}
            case 'S': {t2=search(vy,x,y-1); y-=k; t1=search(vy,x,y-1); break;}
            case 'V': {t2=search(vx,y,x-1); x-=k; t1=search(vx,y,x-1); break;}
            case 'E': {t1=search(vx,y,x); x+=k; t2=search(vx,y,x); break;}
        }
        sol+=t2-t1;
    }
    out<<sol<<'\n'; out.close(); return 0;
}