zoukankan      html  css  js  c++  java
  • 第n次考试

    题目:

    1.堆方块 

    【题目描述】

    给定N个方块,排成一行,将它们编号1到N。

    再给出P个操作:

    M i j表示将i所在的那一堆移到j所在那一堆的顶上。

    C i表示一个询问,询问i下面有多少个方块。

    你需要写一个程序来完成这些操作。

    【输入文件】

    第一行一个整数P。

    接下来P行,每行一个操作。

    【输出文件】

    若干行,对应每个询问的答案。

    【样例输入】

    6

    M 1 6

    C 1

    M 2 4

    M 2 6

    C 3

    C 4

    【样例输出】

    1

    0

    2

    【数据规模】

    对于100%的数据 1<=P<=100000,1<=i,j<=N,1<=N<=30000

    2.点的数目

    【题目描述】

    在一维数轴上有N个正整数点,以1..N进行编号。某些点比较特殊,称之为“怪点”。给定M段区间,每段区间有且仅有一个“怪点”。请根据这M个区间,推断出总共有多少个“怪点”。如果推断不出来,则输出-1

    【输入格式】

    第一行为NM。紧接着的M行,每行代表一个区间。

    【输出格式】

    怪点的数目。推断不出,则输出-1

    【输入样例】

    5 3
    1 4
    2 5
    3 4

    【输出样例】

    1

    【样例解释】

    由第3段区间知道,点3或点4为怪点,而第12段区间恰好包括了点3或点4

    【数据范围】

    30%的数据,1<=N<=1000,1<=M<=200

    100%数据,1 <= N <= 200,000,1 <= M <= 100,000

    3. DORUCAK

    【题目描述】

    平面上y轴左边和右边各有一个凸多边形。求一条直线y=Ax+B,使得将这两个多边形都分成面积相等的两部分。

    【输入格式】

    第一行一个整数n,表示一个凸多边形有n个顶点;接下来的n行,每行两个实数x,y,表示这n个顶点的坐标;这个凸多边形在y轴左边。

    n+2行是一个整数m,表示国一个凸多边形有m个顶点,接下来的m行,每行两个实数x,y,表示这m个顶点的坐标。这个凸多边形在y轴右边。

    两个凸多边形的顶点都是按逆时针的顺序给出,多边形中没有三点共线。

    【输出格式】

    输出AB。答案保证存在,且唯一。A,B允许的误差范围为±0.001。

    【输入样例1

    -6.000 1.000 

    -2.000 2.000 

    -5.000 6.000 

    1.000 -1.000 

    3.000 -2.000 

    6.000 0.000 

    4.000 3.000 

    1.000 2.000

    【输出样例1

    -0.319961 1.556489

    【输入样例2

    -5.000 -1.000 

    -3.000 -1.000 

    -3.000 6.000 

    -5.000 6.000 

    3.222 2.000 

    5.000 1.000 

    5.000 4.000 

    3.222 3.000

    【输出样例2

    0.000000 2.500000

    【数据范围】

    50%的数据  3≤ N≤ 20, −1000 < X < 1000, −1000 < Y < 1000

    100%的数据 ≤ N≤ 5000 , −1000 < X < 1000, −1000 < Y < 1000

    题解:

    1.并查集,每一次合并,记录是第几个

    2.dp+单调队列优化

    注意条件告诉我们的是:

    1.i-j至少有一个奶牛

    2.i-j最多有一个奶牛

    然后就可以确定最大和最小的范围

    3.

    计算几何+二分

    二分枚举a,然后继续二分枚举b

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    const int N=30005;
    int m,f[N],d[N],last[N],x,y,sum[N];
    char s[5]; 
    int find(int x)
    {
        int x1;
        if (x!=f[x])x1=find(f[x]);else x1=x; 
        if (f[f[x]]!=x)d[x]+=d[f[x]];
        f[x]=x1;
        return x1;
    }
    int main()
    {
        freopen("cubes.in","r",stdin);
        freopen("cubes.out","w",stdout); 
        scanf("%d",&m);
        for (int i=1;i<N;i++)
         {
             last[i]=1;
             f[i]=i;
         }
        while (m--)
         {
             scanf("%s%d",&s,&x);
             int x1=find(x);
             if (s[0]=='M')
              {
                  scanf("%d",&y);
                 int y1=find(y); 
                if (x1==y1)continue;     
                  f[x1]=y1;
                  d[x1]=last[y1];
                last[y1]+=last[x1];
              }
             else printf("%d
    ",d[x]);
         } 
        return 0; 
    }
    #include<bits/stdc++.h>
    using namespace std;
    const int INF=2147483647,N=200010;
    int L[N],R[N],tr[N<<2],n,m;
    int Query(int node,int l,int r,int a,int b)
    {
        if(a<=0)a=1;
        if(a>b||b<=0)return 0; 
        if(l>=a&&r<=b)return tr[node];
        int mid=(l+r)>>1,ret=-INF;
        if(mid>=a)ret=Query(node<<1,l,mid,a,b);
        if(mid<b)ret=max(ret,Query(node<<1|1,mid+1,r,a,b));
        return ret;
    }
    void Modify(int node,int l,int r,int g,int d)
    {
        if(l==r){tr[node]=d;return;}
        int mid=(l+r)>>1;
        if(mid>=g)Modify(node<<1,l,mid,g,d);
        else Modify(node<<1|1,mid+1,r,g,d);
        tr[node]=max(tr[node<<1],tr[node<<1|1]);
    } 
    int main()
    {
        freopen("photo.in","r",stdin);
        freopen("photo.out","w",stdout);
        scanf("%d%d",&m,&n);m++;
        for(int i=1;i<=m;i++)R[i]=i-1;
        for(int i=1,a,b;i<=n;i++)
         {
            scanf("%d%d",&a,&b);
            L[b+1]=max(L[b+1],a);
            R[b]=min(R[b],a-1);
           }
        for(int i=2;i<=m;i++)L[i]=max(L[i],L[i-1]);
        for(int i=m-1;i>=1;i--)R[i]=min(R[i],R[i+1]);
        for(int i=1;i<m;i++)
         Modify(1,1,m,i,L[i]<=R[i]?Query(1,1,m,L[i],R[i])+1:-INF);
        printf("%d
    ",max(-1,Query(1,1,m,L[m],R[m])));
        return 0;        
    }
    #include<bits/stdc++.h>
    using namespace std;
    const int INF=2147483647,N=200010;
    int L[N],R[N],tr[N<<2],n,m;
    int Query(int node,int l,int r,int a,int b)
    {
        if(a<=0)a=1;
        if(a>b||b<=0)return 0; 
        if(l>=a&&r<=b)return tr[node];
        int mid=(l+r)>>1,ret=-INF;
        if(mid>=a)ret=Query(node<<1,l,mid,a,b);
        if(mid<b)ret=max(ret,Query(node<<1|1,mid+1,r,a,b));
        return ret;
    }
    void Modify(int node,int l,int r,int g,int d)
    {
        if(l==r){tr[node]=d;return;}
        int mid=(l+r)>>1;
        if(mid>=g)Modify(node<<1,l,mid,g,d);
        else Modify(node<<1|1,mid+1,r,g,d);
        tr[node]=max(tr[node<<1],tr[node<<1|1]);
    } 
    int main()
    {
        freopen("photo.in","r",stdin);
        freopen("photo.out","w",stdout);
        scanf("%d%d",&m,&n);m++;
        for(int i=1;i<=m;i++)R[i]=i-1;
        for(int i=1,a,b;i<=n;i++)
         {
            scanf("%d%d",&a,&b);
            L[b+1]=max(L[b+1],a);
            R[b]=min(R[b],a-1);
           }
        for(int i=2;i<=m;i++)L[i]=max(L[i],L[i-1]);
        for(int i=m-1;i>=1;i--)R[i]=min(R[i],R[i+1]);
        for(int i=1;i<m;i++)
         Modify(1,1,m,i,L[i]<=R[i]?Query(1,1,m,L[i],R[i])+1:-INF);
        printf("%d
    ",max(-1,Query(1,1,m,L[m],R[m])));
        return 0;        
    }
    #include<bits/stdc++.h>
    using namespace std;
    #define sqr(x) ((x)*(x))
    const int N=10005;
    int n[3];
    double K,B,Px,Py,Qx,Qy,X,Y,x[3][N],y[3][N],s[2];
    double Xot(double x1,double y1,double x2,double y2)
    {
        return x1*y2-x2*y1;
    }
    bool Is(double x1,double y1,double x2,double y2)
    {
        double s1=Xot(x1-Qx,y1-Qy,Px-Qx,Py-Qy);
        double s2=Xot(Px-Qx,Py-Qy,x2-Qx,y2-Qy);
        if (s1*s2<=0) return false;
        X=(x1*s2+x2*s1)/(s1+s2);
        Y=(y1*s2+y2*s1)/(s1+s2);
        return true;
    }
    double Area(int k)
    {
        Px=-1E5;Py=K*Px+B;
        Qx=1E5;Qy=K*Qx+B;
        n[2]=0;
        for (int i=1;i<=n[k];i++)
         {
            if (Is(x[k][i-1],y[k][i-1],x[k][i],y[k][i]))
             x[2][++n[2]]=X,y[2][n[2]]=Y;
            if (Xot(x[k][i]-Px,y[k][i]-Py,Qx-Px,Qy-Py)>0)
             x[2][++n[2]]=x[k][i],y[2][n[2]]=y[k][i];
         }
        double res=0;
        for (int i=2;i<n[2];i++)
         res+=Xot(x[2][i]-x[2][1],y[2][i]-y[2][1],
        x[2][i+1]-x[2][1],y[2][i+1]-y[2][1]);
        return abs(res);
    }
    int main()
    {
        freopen("dorucak.in","r",stdin);
        freopen("dorucak.out","w",stdout);
        for (int k=0;k<2;k++)
         {
            scanf("%d",&n[k]);
            for (int i=1;i<=n[k];i++)
             scanf("%lf%lf",&x[k][i],&y[k][i]);
            x[k][0]=x[k][n[k]];
            y[k][0]=y[k][n[k]];
            for (int i=2;i<n[k];i++)
             s[k]+=Xot(x[k][i]-x[k][1],y[k][i]-y[k][1]
             ,x[k][i+1]-x[k][1],y[k][i+1]-y[k][1]);
            s[k]=abs(s[k]);
        }
        double LK=-1E5,RK=1E5;
        while (LK+1E-5<RK)
         {
            K=(LK+RK)/2.0;
            double LB=-1E5,RB=1E5;
            while (LB+1E-5<RB)
             {
                B=(LB+RB)/2.0;
                if (Area(0)*2.0<=s[0])LB=B;
                else RB=B;
             }
            B=(LB+RB)/2.0;
            if (Area(1)*2.0<=s[1])LK=K;
            else RK=K;
        }
        printf("%.6lf %.6lf
    ",K,B);
        return 0;
    }
  • 相关阅读:
    段落某些子段高量
    CSS 知识点
    PHP 表单与音频知识点及使用
    PHP 标签、表格的知识点与超链接的结合使用
    PHP课程第一天知识点
    java ArrayList集合
    java 引用数据类型(类)
    java 方法重载
    java 方法
    java 二维数组
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7635112.html
Copyright © 2011-2022 走看看