zoukankan      html  css  js  c++  java
  • 清北考前刷题day1早安

    立方数(cubic)

    Time Limit:1000ms   Memory Limit:128MB

     

    题目描述

    LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。

    现在给定一个数P,LYK想要知道这个数是不是立方数。

    当然你有可能随机输出一些莫名其妙的东西来骗分,因此LYK有T次询问~

     

    输入格式(cubic.in)

        第一行一个数T,表示有T组数据。

        接下来T行,每行一个数P。

     

    输出格式(cubic.out)

    输出T行,对于每个数如果是立方数,输出“YES”,否则输出“NO”。

     

    输入样例

    3

    8

    27

    28

     

    输出样例

    YES

    YES

    NO

     

    数据范围

    对于30%的数据p<=100。

    对于60%的数据p<=10^6。

    对于100%的数据p<=10^18,T<=100。

     

     

     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define ll long long
    #define K 1000001
    
    using namespace std;
    ll T,n,x,ans,cnt;
    
    inline ll read()
    {
        ll x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    int main()
    {
    //    freopen("cubic.in","r",stdin);
    //    freopen("cubic.out","w",stdout);
        T=read();
        while(T--)
        {
            x=read();bool flag=0;
            for(ll i=1;i<=K;i++)
            {
                if(x==i*i*i) 
                {
                    printf("YES
    ");
                    flag=1;break;
                }
            }
            if(!flag){printf("NO
    ");}
        }
        return 0;
    }

     

    立方数2(cubicp)

    Time Limit:1000ms   Memory Limit:128MB

     

    题目描述

    LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数。

    LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立方数的差,则这个数就是“立方差数”,例如7(8-1),26(27-1),19(27-8)都是立方差数。

    现在给定一个数P,LYK想要知道这个数是不是立方差数。

    当然你有可能随机输出一些莫名其妙的东西,因此LYK有T次询问~

    这个问题可能太难了…… 因此LYK规定P是个质数!

     

    输入格式(cubicp.in)

        第一行一个数T,表示有T组数据。

        接下来T行,每行一个数P。

     

    输出格式(cubicp.out)

    输出T行,对于每个数如果是立方差数,输出“YES”,否则输出“NO”。

     

    输入样例

    5

    2

    3

    5

    7

    11

     

    输出样例

    NO

    NO

    NO

    YES

    NO

     

     

    数据范围

    对于30%的数据p<=100。

    对于60%的数据p<=10^6。

    对于100%的数据p<=10^12,T<=100。

     

     

     

    /*X^3-Y^3=(x-y)(x^2+xy+y^2)
    p是素数 ->(x-y)=1; y=x-1
    x^2+x(x-1)+(x-1)^2=p
    
    若p不是素数可以枚举p的因数d,就是枚举(x-y)。把(x-1)改为x-d。
    */
    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<map>
    #include<set>
    #include<string>
    using namespace std;
    int main()
    {
        freopen("cubicp.in","r",stdin);
        freopen("cubicp.out","w",stdout);
        int t,flag;
        scanf("%d",&t);
        long long p;
        while(t--)
        {
            flag=0;
            scanf("%I64d",&p);
            for(int i=1;i<=1e6+10;i++)
            {
                if(3ll*i*i+3*i+1==p)
                {
                    flag=1;
                    break;
                }
                if (3ll*i*i+3*i+1>p) break;
            }
            if(flag) printf("YES
    ");
            else printf("NO
    ");
        }
        return 0;
    }

     

     

    猜数字(number)

    Time Limit:1000ms   Memory Limit:128MB

     

    题目描述

        LYK在玩猜数字游戏。

        总共有n个互不相同的正整数,LYK每次猜一段区间的最小值。形如[li,ri]这段区间的数字的最小值一定等于xi。

        我们总能构造出一种方案使得LYK满意。直到…… LYK自己猜的就是矛盾的!

        例如LYK猜[1,3]的最小值是2,[1,4]的最小值是3,这显然就是矛盾的。

        你需要告诉LYK,它第几次猜数字开始就已经矛盾了。

     

    输入格式(number.in)

        第一行两个数n和T,表示有n个数字,LYK猜了T次。
        接下来T行,每行三个数分别表示li,ri和xi。

     

    输出格式(number.out)

    输出一个数表示第几次开始出现矛盾,如果一直没出现矛盾输出T+1。

     

    输入样例

    20 4

    1 10 7

    5 19 7

    3 12 8

    1 20 1

     

    输出样例

    3

     

    数据范围

    对于50%的数据n<=8,T<=10。

    对于80%的数据n<=1000,T<=1000。

    对于100%的数据1<=n,T<=1000000,1<=li<=ri<=n,1<=xi<=n(但并不保证一开始的所有数都是1~n的)。

     

    Hint

    建议使用读入优化

    inline int read()

    {

           int x = 0, f = 1;

           char ch = getchar();

           for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;

           for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';

           return x * f;

    }

    /*
    二分答案 出现矛盾的时间
    判定性
    按xi从大到小排序后,在[l,r]内,若之前以被覆盖过,则矛盾。
    要求互不相同,若[1,10]->7 [5,19]->7 则说明[5,10]->7,[1,4]和[11,19]最小值大于7;
    所以可以合并xi相同的区间,区间交。
    从大到小枚举xi判断是否有大于xi的区间并覆盖了这个区间。
    
    可用线段树
    查询:区间最小值是否为0
    修改:区间改为1,不是修改区间的交,而是最小值为xi的区间并。
    O(nlgn^2n);
    
    正解并查集
    f[i]表示以i开始最近的没被覆盖过的位置是哪个。
    若[1,6]->7 则f[1]...f[6]=7
    
    for(int i=f[1];i<=r;i=f[i+1])
    
    f[l]是否>r
    
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    #define N 1000007
    
    using namespace std;
    int n,q,ans;
    int f[N];//f[i]表示以i开始最近的没被覆盖过的位置是哪个。
    struct node{
        int x,y,z;
    }p[N],t[N];
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    bool cmp(node x,node y){return x.z>y.z;}
    inline int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
    
    inline bool check(int k)
    {
        int x,y,lmin,lmax,rmin,rmax;
        for(int i=1;i<=n;i++)f[i]=i;
        for(int i=1;i<=k;i++)t[i]=p[i];
        sort(t+1,t+k+1,cmp);
        lmin=lmax=t[1].x;rmin=rmax=t[1].y;
        for(int i=2;i<=k;i++)
        {
            if(t[i].z<t[i-1].z)
            {
                if(find(lmax)>rmin) return 1;
                for(int j=find(lmin);j<=rmax;j++)
                  f[find(j)]=find(rmax+1);
                lmin=lmax=t[i].x;
                rmin=rmax=t[i].y;
            }
            else
            {
                lmin=min(lmin,t[i].x);
                lmax=max(lmax,t[i].x);
                rmin=min(rmin,t[i].y);
                rmax=max(rmax,t[i].y);
                if(lmax>rmin) return 1;
            }
        }
        if(find(lmax)>rmin) return 1;
        return 0;
    }
    
    int main()
    {
        int x,y,mid;
        n=read();q=read();
        for(int i=1;i<=q;i++)
          p[i].x=read(),p[i].y=read(),p[i].z=read();
        x=1,y=q;ans=q+1;
        while(x<=y)
        {
            mid=x+y>>1;
            if(check(mid)) ans=mid,y=mid-1;
            else x=mid+1;
        }
        printf("%d
    ",ans);
        return 0;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    1053: 正弦函数
    1052: 数列求和4
    1051: 平方根的和
    1050: 阶乘的累加和
    POJ 1321 棋盘问题(搜索的方式)
    HDU 1176 免费馅饼
    BZOJ 2423 (求LCS的长度和种类数)
    HDU 2612 (2次BFS,有点小细节)
    POJ 1088 滑雪(模板题 DFS+记忆化)
    HRBUST 1186 青蛙过河 (思路错了)
  • 原文地址:https://www.cnblogs.com/L-Memory/p/7750883.html
Copyright © 2011-2022 走看看