zoukankan      html  css  js  c++  java
  • 2012暑假集训内部测试赛3

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2427

    线段树+离散化  不离散化不知道会不会超时 一直RE 可能N值没有说的那么小吧 题意有问题 按1W开数组就RE 按10W开就A了

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<algorithm>
      4 #include<iostream>
      5 using namespace std;
      6 #define N 100001
      7 int s[N*6],num,f[100011],po[100011][2];
      8 struct node
      9 {
     10     int li,num;
     11 }line[200011];
     12 void build(int l,int r,int w)
     13 {
     14     s[w] = -1;
     15     if(l==r)
     16     {
     17         return ;
     18     }
     19     int m = (l+r)/2;
     20     build(l,m,2*w);
     21     build(m+1,r,2*w+1);
     22 }
     23 void add(int a,int b,int da,int l,int r,int w)
     24 {
     25     if(l==a&&b==r)
     26     {
     27         s[w] = da;
     28         return ;
     29     }
     30     int m = (l+r)/2;
     31     if(s[w]>0)
     32     {
     33         s[2*w] = s[w];
     34         s[2*w+1] = s[w];
     35         s[w] = -1;
     36     }
     37     if(b<=m)
     38         add(a,b,da,l,m,2*w);
     39     else
     40         if(a>m)
     41             add(a,b,da,m+1,r,2*w+1);
     42         else
     43         {
     44             add(a,m,da,l,m,2*w);
     45             add(m+1,b,da,m+1,r,2*w+1);
     46         }
     47 }
     48 void search(int l,int r,int w)
     49 {
     50     if(s[w]>0)
     51     {
     52         f[s[w]] = 1;
     53         return ;
     54     }
     55     if(l==r)
     56         return ;
     57     int m = (l+r)/2;
     58     search(l,m,2*w);
     59     search(m+1,r,2*w+1);    
     60 }
     61 bool cmp(node a,node b)
     62 {
     63     return a.num<b.num;
     64 }
     65 int main()
     66 {
     67     int n,i,j,t,a,b;
     68     scanf("%d", &t);
     69     while(t--)
     70     {
     71         memset(f,0,sizeof(f));    
     72         num = 0;        
     73         scanf("%d", &n);
     74         build(1,N,1);    
     75         for(i = 0; i < n ;i++)
     76         {
     77             scanf("%d%d", &po[i][0],&po[i][1]);
     78             line[2*i].li = i+1;
     79             line[2*i].num = po[i][0];
     80             line[2*i+1].li = -(i+1);
     81             line[2*i+1].num = po[i][1];
     82         }
     83         sort(line,line+2*n,cmp);    
     84         int te = line[0].num,g = 1;
     85         for(i = 0 ; i < 2*n ; i++)
     86         {
     87             if(te!=line[i].num)
     88             {
     89                 te = line[i].num;
     90                 g++;
     91             }
     92             if(line[i].li>0)
     93             {
     94                 po[line[i].li][0]=g;
     95             }
     96             else
     97                 po[-line[i].li][1]=g;
     98         }
     99         for(i = 1; i <= n ; i++)
    100         {
    101             add(po[i][0],po[i][1],i,1,N,1);
    102         }
    103         search(1,N,1);
    104         for(i = 1; i <= n ; i++)
    105             if(f[i])
    
    106                 num++;
    107         printf("%d\n",num);
    108     }
    109     return 0;
    110 } 

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2430

    DP 前一个的1或者最高 到这一个1或者最高 中间选一个最优的

    View Code
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string.h>
     4 #include<cmath>
     5 using namespace std;
     6 int main()
     7 {
     8     int i,j,n,m,x,a[111],k;
     9     double dp[111][111];
    10     while(scanf("%d",&n)!=EOF)
    11     {
    12         memset(dp,0,sizeof(dp));
    13         for(i = 1; i <= n ; i++)
    14         scanf("%d",&a[i]);
    15         scanf("%d", &k);
    16         if(n==1)
    17         {
    18             printf("0.000000\n");
    19             continue;
    20         }
    21         for(i = 2; i <= n ; i++)
    22         {
    23             x = a[i-1];
    24             if(dp[i][1]<dp[i-1][x]+sqrt(k*k+(x-1)*(x-1)))
    25             dp[i][1] = dp[i-1][x]+sqrt(k*k+(x-1)*(x-1));
    26             if(dp[i][1]<dp[i-1][1]+k)
    27             dp[i][1] = dp[i-1][1]+k;
    28             if(dp[i][a[i]]<dp[i-1][x]+sqrt(k*k+(x-a[i])*(x-a[i])))
    29             dp[i][a[i]] = dp[i-1][x]+sqrt(k*k+(x-a[i])*(x-a[i]));
    30             if(dp[i][a[i]]<dp[i-1][1]+sqrt(k*k+(a[i]-1)*(a[i]-1)))
    31             dp[i][a[i]] = dp[i-1][1]+sqrt(k*k+(a[i]-1)*(a[i]-1));
    32         }
    33         if(dp[n][1]>dp[n][a[n]])
    34         printf("%.6lf\n",dp[n][1]);
    35         else
    36         printf("%.6lf\n",dp[n][a[n]]);
    37     }
    38     return 0;
    39 }
    40  

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2429

    模拟 这题WA惨了 最后两分钟交对 好险。。

    x不能为负值 就算最后有符合的负值也是输出-1 考虑两种情况x为0或者不为0的情况

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int main()
     4 {
     5     int i,j,n,f[401],m;
     6     long long  k,a[61],stack[401],b[61];
     7     while(scanf("%d",&n)!=EOF)
     8     {
     9         int top =200;
    10         memset(stack,0,sizeof(stack));
    11         memset(f,0,sizeof(f));
    12         for(i = 1; i <= n ; i++)
    13         {
    14             scanf("%lld",&a[i]);
    15             b[i] = a[i];
    16         }
    17         scanf("%lld", &k);
    18         for(j = 1; j <= n ; j++)
    19         {
    20             if(a[j]==-1)
    21                 a[j]=0;
    22             if(a[j]==0)
    23             {
    24                 top--;
    25                 long long  x = stack[top];
    26                 top--;
    27                 x+=stack[top];
    28                 stack[top++] = x;
    29             }
    30             else
    31                 stack[top++] = a[j];
    32         }
    33         top--;
    34         if(stack[top]==k)
    35         {
    36             printf("0\n");
    37             continue;
    38         }
    39         top = 200;
    40         for(j = 1; j <= n ; j++)
    41         {
    42             if(b[j]==-1)
    43             {
    44                 f[top]=1;
    45                 stack[top++] = 0;
    46             }
    47             else
    48             if(b[j]==0)
    49             {
    50                 top--;
    51                 long long  x = stack[top];
    52                 top--;
    53                 x+=stack[top];
    54                 if(f[top]||f[top+1])
    55                 {
    56                     f[top] = 1;
    57                 }
    58                 stack[top++] = x;        
    59             }
    60             else
    61                 stack[top++] = b[j];
    62         }
    63         top--;
    64         if(!f[top]&&stack[top]==k)
    65         {
    66             printf("0\n");
    67             continue;
    68         }
    69         if(f[top]&&k-stack[top]>0)
    70             printf("%lld\n",k-stack[top]);
    71         else
    72             printf("-1\n");
    73     }
    74     return 0;
    75 } 
  • 相关阅读:
    html添加遮罩层
    html绝对定位如何居中
    springboot上传文件到本地服务器
    遍历一个文件目录,把所有的子目录都列出来
    Java判断cookie中是否有某个具体的cookie
    Redis 如何打开rdb 文件
    crontab -e 如何保存退出
    linux服务器设备上没有空间
    IDEA的SonarLint插件报错Unable to create symbol table for
    使用Rome读取RSS报错,org.xml.sax.SAXParseException: 前言中不允许有内容。
  • 原文地址:https://www.cnblogs.com/shangyu/p/2659191.html
Copyright © 2011-2022 走看看