zoukankan      html  css  js  c++  java
  • poj 2201

    噗,认识了一种神奇的数据结构。。

    水。。反正有SBT的性质就排序。。然后地轨+RMQ。。

    输出中间变量没删WA了一版23333

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<cmath>
     6 #include<queue>
     7 #define inc(i,l,r) for(i=l;i<=r;i++)
     8 #define dec(i,l,r) for(i=l;i>=r;i--)
     9 #define inf 1e9
    10 #define mem(a) memset(a,0,sizeof(a))
    11 #define ll long long
    12 #define succ(x) (1<<x)
    13 #define NM 50000+5
    14 using namespace std;
    15 int read(){
    16     int x=0,f=1;char ch=getchar();
    17     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    18     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    19     return x*f;
    20 }
    21 struct tmp{
    22     int a,k,num;
    23 }a[NM];
    24 int ans[NM][3],d[NM][20],n,i,j,p;
    25 bool cmp(tmp x,tmp y){
    26     return x.k<y.k;
    27 }
    28 int _min(int x,int y){
    29     return a[x].a<a[y].a?x:y;
    30 }
    31 int minn(int l,int r){
    32     int k=log(r-l+1.0)/log(2.0);
    33     return _min(d[l][k],d[r-succ(k)+1][k]);
    34 }
    35 int dfs(int x,int l,int r){
    36     if(l>r)return 0;
    37     int t=minn(l,r);
    38     ans[a[t].num][0]=a[x].num;
    39     if(l==r)return a[t].num;
    40     int v=dfs(t,l,t-1);
    41     ans[a[t].num][1]=v;
    42     v=dfs(t,t+1,r);
    43     ans[a[t].num][2]=v;
    44 //    printf("%d %d %d %d
    ",a[t].num,ans[a[t].num][0],ans[a[t].num][1],ans[a[t].num][2]);
    45     return a[t].num;
    46 }
    47 int main(){
    48     while(~scanf("%d",&n)){
    49     inc(i,1,n){
    50         a[i].k=read();
    51         a[i].a=read();
    52         a[i].num=i;
    53     }
    54     sort(a+1,a+1+n,cmp);
    55     inc(i,1,n)d[i][0]=i;
    56     p=log(n+1.0)/log(2.0);
    57     inc(j,1,p)
    58     for(i=1;i+succ(j-1)-1<=n;i++)
    59     d[i][j]=_min(d[i][j-1],d[i+succ(j-1)][j-1]);
    60     i=minn(1,n);
    61     j=dfs(i,1,i-1);
    62     ans[a[i].num][1]=j;
    63     j=dfs(i,i+1,n);
    64     ans[a[i].num][2]=j;
    65 //    printf("%d %d %d
    ",ans[i][0],ans[i][1],ans[i][2]);
    66     printf("YES
    ");
    67     inc(i,1,n)printf("%d %d %d
    ",ans[i][0],ans[i][1],ans[i][2]);
    68     }
    69     return 0;
    70 }
    View Code
  • 相关阅读:
    on() 和 click() 的区别
    net core swagger
    sgen.exe 未能运行
    SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
    net core 实现简单爬虫—抓取博客园的博文列表
    javascript基础 方法
    android通过httpClient请求获取JSON数据并且解析
    发布到IIS的时候用户 'WWW-6743CC520E9ASPNET' 登录失败
    WebServices生成发布过程及常见问题的解决方法
    Android、iPhone和Java三个平台一致的加密工具
  • 原文地址:https://www.cnblogs.com/onlyRP/p/4839349.html
Copyright © 2011-2022 走看看