/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package acm2014; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.Set; /** * * @author hulata */ public class Validate { List prikazy1; List prikazy2; Map> absolutne1; Map> absolutne2; public static void main(String[] args){ Validate v = new Validate(); v.start(); } public void start() { Scanner in = null; try { in = new Scanner(new InputStreamReader(System.in)); while(in.hasNextLine()){ prikazy1 = new ArrayList<>(); prikazy2 = new ArrayList<>(); absolutne1 = new HashMap<>(); absolutne2 = new HashMap<>(); int pocetPosunov; char prikaz; int x,y; pocetPosunov = in.nextInt(); for (int i = 0; i < pocetPosunov; i++) { Prikaz p = new Prikaz(); p.prikaz = in.next().charAt(0); p.x = in.nextInt(); p.y = in.nextInt(); prikazy1.add(p); } pocetPosunov = in.nextInt(); for (int i = 0; i < pocetPosunov; i++) { Prikaz p = new Prikaz(); p.prikaz = in.next().charAt(0); p.x = in.nextInt(); p.y = in.nextInt(); prikazy2.add(p); } if(riesZadanie()){ System.out.println("YES"); }else{ System.out.println("NO"); } in.nextLine(); } } catch (Exception e) { e.printStackTrace(); }finally{ if(in!=null){ in.close(); } } } public boolean riesZadanie() { boolean vysledok = false; int ax,ay; ax=0;ay=0; for (Prikaz prikaz : prikazy1) { PrikazAbs p = new PrikazAbs(); p.prikaz = prikaz.prikaz; p.x1 = ax; p.y1 = ay; ax = ax+prikaz.x; ay = ay+prikaz.y; p.x2 = ax; p.y2 = ay; if(p.prikaz=='L'){ urobZlucenia(absolutne1, p); } } ax=0;ay=0; for (Prikaz prikaz : prikazy2) { PrikazAbs p = new PrikazAbs(); p.prikaz = prikaz.prikaz; p.x1 = ax; p.y1 = ay; ax = ax+prikaz.x; ay = ay+prikaz.y; p.x2 = ax; p.y2 = ay; if(p.prikaz=='L'){ urobZlucenia(absolutne2, p); } } //porovnam if(absolutne1.size()!=absolutne2.size()){ return false; }else{ boolean zhoduju = true; for (Map.Entry> entry : absolutne1.entrySet()) { Pair pair = entry.getKey(); Set set = entry.getValue(); Set set2 = absolutne2.get(pair); if(set.size()!=set2.size()){ return false; } for (PrikazAbs prikazAbs : set2) { if(!set.contains(prikazAbs)){ return false; } } } return true; } } public void urobZlucenia(Map> absolutne, PrikazAbs p) { PrikazAbs[] pomPole = new PrikazAbs[3]; boolean zhodaX = false; Set list = absolutne.get(new Pair(p.x1,p.y1)); if(list==null){ list = new HashSet<>(); absolutne.put(new Pair(p.x1,p.y1), list); } //skontrolujem, ci sa da s niektorym zlucit PrikazAbs zluceny=null; for (PrikazAbs prikazAbs : list) { if(prikazAbs==null || prikazAbs.equals(p))continue; double podiel1 = Math.abs((p.x1-p.x2) / (double)(p.y1-p.y2)); double podiel2 = Math.abs((prikazAbs.x1-prikazAbs.x2) / (double)(prikazAbs.y1-prikazAbs.y2)); if(Math.abs(podiel1-podiel2)<0.001){ zluceny = zlucPrikazy(p, prikazAbs, absolutne); pomPole[0]=p; pomPole[1]=prikazAbs; pomPole[2]=zluceny; break; }else{ podiel1 = Math.abs((double)(p.y1-p.y2)/(p.x1-p.x2) ); if(Math.abs(podiel1-podiel2)<0.001){ zluceny = zlucPrikazy(p, prikazAbs, absolutne); pomPole[0]=p; pomPole[1]=prikazAbs; pomPole[2]=zluceny; break; } } } if(zluceny!=null){ zhodaX = true; list.remove(pomPole[0]); list.remove(pomPole[1]); list.add(zluceny); list = absolutne.get(new Pair(p.x2,p.y2)); if(list==null){ list = new HashSet<>(); absolutne.put(new Pair(p.x2,p.y2), list); } list.remove(pomPole[0]); list.remove(pomPole[1]); list.add(zluceny); urobZlucenia(absolutne, zluceny); //odstranit aj z druheho listu //zaradit aj do druheho listu }else{ //len pridat p zhodaX = false; } // to iste pre koncove suradnice list = absolutne.get(new Pair(p.x2,p.y2)); if(list==null){ list = new HashSet<>(); absolutne.put(new Pair(p.x2,p.y2), list); } zluceny=null; //skontrolujem, ci sa da s niektorym zlucit for (PrikazAbs prikazAbs : list) { if(prikazAbs==null || prikazAbs.equals(p))continue; double podiel1 = Math.abs((p.x1-p.x2) / (double)(p.y1-p.y2)); double podiel2 = Math.abs((prikazAbs.x1-prikazAbs.x2) / (double)(prikazAbs.y1-prikazAbs.y2)); if(Math.abs(podiel1-podiel2)<0.001){ zluceny = zlucPrikazy(p, prikazAbs, absolutne); pomPole[0]=p; pomPole[1]=prikazAbs; pomPole[2]=zluceny; break; }else{ podiel1 = Math.abs((double)(p.y1-p.y2)/(p.x1-p.x2)); if(Math.abs(podiel1-podiel2)<0.001){ zluceny = zlucPrikazy(p, prikazAbs, absolutne); pomPole[0]=p; pomPole[1]=prikazAbs; pomPole[2]=zluceny; break; } } } if(zluceny!=null){ list.remove(pomPole[0]); list.remove(pomPole[1]); list.add(zluceny); list = absolutne.get(new Pair(p.x2,p.y2)); if(list==null){ list = new HashSet<>(); absolutne.put(new Pair(p.x2,p.y2), list); } list.remove(pomPole[0]); list.remove(pomPole[1]); list.add(zluceny); urobZlucenia(absolutne, zluceny); }else{ //len pridat p if(!zhodaX){ list.add(p); list = absolutne.get(new Pair(p.x1,p.y1)); if(list==null){ list = new HashSet<>(); absolutne.put(new Pair(p.x1,p.y1), list); } list.add(p); } } } public PrikazAbs zlucPrikazy(PrikazAbs p1, PrikazAbs p2, Map> absolutne) { PrikazAbs vys = new PrikazAbs(); /*int xnezhoda1, ynezhoda1,xnezhoda2, ynezhoda2; if(p1.x1==p2.x1 && p1.y1==p2.y1){ xnezhoda1 = p1.x2; xnezhoda2 = p2.x2; ynezhoda1 = p1.y2; ynezhoda2 = p2.y2; }else if(p1.x1==p2.x2 && p1.y1 == p2.y2){ xnezhoda1 = p1.x2; ynezhoda1 = p1.y2; xnezhoda2 = p2.x1; ynezhoda2 = p2.y1; }*/ //vezmem najvacsi rozdiel na jednej suradnici int maxx1=0, maxx2=0, maxy1=0, maxy2=0; int minx=300000,maxx=-1; if(p1.x1!=p1.x2){ //ak nie je zvisla ciara if(p1.x1maxx){ maxx2 = p1.x1; maxy2 = p1.y1; maxx=p1.x1; }else if(p1.x2>maxx){ maxx2 = p1.x2; maxy2 = p1.y2; maxx=p1.x2; }else if(p2.x1>maxx){ maxx2 = p2.x1; maxy2 = p2.y1; maxx=p2.x1; }else if(p2.x2>maxx){ maxx2 = p2.x2; maxy2 = p2.y2; } }else{ //na zaklade y if(p1.y1maxx){ maxx2 = p1.x1; maxy2 = p1.y1; }else if(p1.y2>maxx){ maxx2 = p1.x2; maxy2 = p1.y2; }else if(p2.y1>maxx){ maxx2 = p2.x1; maxy2 = p2.y1; }else if(p2.y2>maxx){ maxx2 = p2.x2; maxy2 = p2.y2; } } vys.prikaz = 'L'; vys.x1 = maxx1; vys.x2 = maxx2; vys.y1 = maxy1; vys.y2 = maxy2; return vys; } class Prikaz{ char prikaz; int x,y; } class PrikazAbs{ char prikaz; int x1,y1,x2,y2; @Override public boolean equals(Object obj) { if(obj instanceof PrikazAbs){ PrikazAbs pr = (PrikazAbs)obj; return ((x1==pr.x1 && y1==pr.y1 && x2==pr.x2 && y2==pr.y2) || (x1==pr.x2 && y1==pr.y2 && x2==pr.x1 && y2==pr.y1)); }else{ return false; }} @Override public int hashCode() { int hash = x1+x2+y1+y2; return hash; } } class Pair{ int x,y; public Pair(){ } public Pair(int px, int py){ x = px; y = py; } @Override public boolean equals(Object obj) { if(obj instanceof Pair){ Pair p = (Pair)obj; return (x==p.x && y==p.y); }else{ return false; } } @Override public int hashCode() { int hash = 7; hash = 123*x+123*y; return hash; } } }