zoukankan      html  css  js  c++  java
  • 【POJ】1436 Horizontally Visible Segments

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<vector>
      4 #include<algorithm>
      5 #include<set>
      6 using namespace std;
      7 #define MAXN 16010
      8 #define INF 123456789
      9 struct Seg
     10 {
     11     int y1,y2,x;
     12     friend bool operator<(Seg a,Seg b)
     13     {
     14         return a.x<b.x;
     15     }
     16 };
     17 int i,tree[MAXN<<2];
     18 Seg p[MAXN];
     19 vector<int>G[MAXN];
     20 vector<int>::iterator it;
     21 inline void PushDown(int rt)
     22 {
     23     if(tree[rt])
     24     {
     25         tree[rt<<1]=tree[rt<<1|1]=tree[rt];
     26         tree[rt]=0;
     27     }
     28 }
     29 void Update(int x,int y,int val,int L,int R,int rt)
     30 {
     31     if(x<=L&&R<=y)
     32         tree[rt]=val;
     33     else
     34     {
     35         int mid=(L+R)>>1;
     36         PushDown(rt);
     37         if(x<=mid)
     38             Update(x,y,val,L,mid,rt<<1);
     39         if(y>mid)
     40             Update(x,y,val,mid+1,R,rt<<1|1);
     41     }
     42 }
     43 void Query(int x,int y,int L,int R,int rt)
     44 {
     45     if(x<=L&&R<=y)
     46     {
     47         if(tree[rt])
     48         {
     49             G[i].push_back(tree[rt]);
     50             G[tree[rt]].push_back(i);
     51         }
     52         else if(L!=R)
     53         {
     54             int mid=(L+R)>>1;
     55             Query(x,y,L,mid,rt<<1);
     56             Query(x,y,mid+1,R,rt<<1|1);
     57         }
     58     }
     59     else
     60     {
     61         int mid=(L+R)>>1;
     62         PushDown(rt);
     63         if(x<=mid)
     64             Query(x,y,L,mid,rt<<1);
     65         if(y>mid)
     66             Query(x,y,mid+1,R,rt<<1|1);
     67     }
     68 }
     69 int main()
     70 {
     71     int t,n,j,k,r,left,right,ans;
     72     scanf("%d",&t);
     73     while(t--)
     74     {
     75         left=INF;
     76         ans=right=0;
     77         scanf("%d",&n);
     78         for(i=1;i<=n;i++)
     79         {
     80             scanf("%d%d%d",&p[i].y1,&p[i].y2,&p[i].x);
     81             p[i].y1<<=1;
     82             p[i].y2<<=1;
     83             left=min(left,p[i].y1);
     84             right=max(right,p[i].y2);
     85             G[i].clear();
     86         }
     87         sort(p+1,p+1+n);
     88         memset(tree,0,sizeof(tree));
     89         for(i=1;i<=n;i++)
     90         {
     91             Query(p[i].y1,p[i].y2,left,right,1);
     92             Update(p[i].y1,p[i].y2,i,left,right,1);
     93         }
     94         for(i=1;i<=n;i++)
     95         {
     96             sort(G[i].begin(),G[i].end());
     97             it=unique(G[i].begin(),G[i].end());
     98             G[i].resize(it-G[i].begin());
     99         }
    100         for(i=1;i<=n;i++)
    101         {
    102             for(j=0;j<G[i].size();j++)
    103             {
    104                 for(k=j+1;k<G[i].size();k++)
    105                 {
    106                     r=lower_bound(G[G[i][j]].begin(),G[G[i][j]].end(),G[i][k])-G[G[i][j]].begin();
    107                     if(r<G[G[i][j]].size()&&G[G[i][j]][r]==G[i][k])
    108                         ans++;
    109                 }
    110             }
    111         }
    112         printf("%d\n",ans/3);
    113     }
    114     return 0;
    115 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    HDU 5441 离线处理 + 并查集
    [转载]HDU 3478 判断奇环
    POJ 1637 混合图的欧拉回路判定
    [转载] 一些图论、网络流入门题总结、汇总
    UVA 820 --- POJ 1273 最大流
    [转载 ]POJ 1273 最大流模板
    POJ 3041 -- 二分图匹配
    2014西安现场赛F题 UVALA 7040
    UVA 12549
    割点、桥(一点点更新)
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2554062.html
Copyright © 2011-2022 走看看