Advertisement
a53

Intersectie Segmente

a53
Jul 26th, 2017
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstdlib>
  3. using namespace std;
  4. struct entry
  5. {
  6. int x,y1,y2,sgn;
  7. } A[200000];
  8. typedef struct entry entry;
  9. int N,T[1000000];
  10. long long Res;
  11.  
  12. int cmp(const void *i,const void *j)
  13. {
  14. entry *ei=(entry *)i,*ej=(entry *)j;
  15.  
  16. if(ei->x!=ej->x)
  17. return ei->x-ej->x;
  18. return ej->sgn-ei->sgn;
  19. }
  20.  
  21. int query(int n,int l,int r,int a,int b)
  22. {
  23. int m,t=0;
  24.  
  25. if(a<=l&&r<=b)
  26. return T[n];
  27. else
  28. {
  29. m=(l+r)/2;
  30. if(a<=m)
  31. t+=query(2*n,l,m,a,b);
  32. if(b>m)
  33. t+=query(2*n+1,m+1,r,a,b);
  34. }
  35. return t;
  36. }
  37.  
  38. void update(int n,int l,int r,int p,int v)
  39. {
  40. int m=(l+r)/2;
  41.  
  42. T[n]+=v;
  43. if(l==r) return;
  44. if(p<=m)
  45. update(2*n,l,m,p,v);
  46. else
  47. update(2*n+1,m+1,r,p,v);
  48. }
  49.  
  50. int main(void)
  51. {
  52. int i,n,x1,y1,x2,y2;
  53. ifstream f("is.in");
  54. f>>N;
  55. for(n=i=0;i<N;++i)
  56. {
  57. f>>x1>>y1>>x2>>y2;
  58. if(y1==y2)
  59. A[n].x=x1,A[n].sgn=+1,
  60. A[n++].y1=y1,
  61. A[n].x=x2,A[n].sgn=-1,
  62. A[n++].y1=y1;
  63. else
  64. if(x1==x2)
  65. A[n].x=x1,A[n].sgn=0,
  66. A[n].y1=y1,A[n++].y2=y2;
  67. }
  68. f.close();
  69. qsort(A,n,sizeof(entry),cmp);
  70. for (i=0;i<n;++i)
  71. if(A[i].sgn==0)
  72. Res+=query(1,0,99999,A[i].y1,A[i].y2);
  73. else
  74. update(1,0,99999,A[i].y1,A[i].sgn);
  75. ofstream g("is.out");
  76. g<<Res;
  77. g.close();
  78. return 0; }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement