• 清北刷题冲刺 10-28 a.m


    立方数

    (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<algorithm>
    using namespace std;
    struct node{
        long long v;
        int id;
        bool ok;
    }q[110];
    bool cmp1(node x,node y){return x.v<y.v;}
    bool cmp2(node x,node y){return x.id<y.id;}
    long long qread(){
        long long i=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar();
        return i;
    }
    int T;
    int main(){
        freopen("cubic.in","r",stdin);freopen("cubic.out","w",stdout);
    //    freopen("Cola.txt","r",stdin);
        scanf("%d",&T);
        for(int i=1;i<=T;i++){
            q[i].v=qread();
            q[i].id=i;
        }
        sort(q+1,q+T+1,cmp1);
        int l=1;
        for(int i=1;i<=1000000;i++){
            long long now=1LL*i*i*i;
            if(now>q[T].v)break;
            while(now==q[l].v)q[l].ok=1,l++;
            while(now>q[l].v)l++;
            while(now==q[l].v)q[l].ok=1,l++;
            if(l>T)break;
        }
        sort(q+1,q+T+1,cmp2);
        for(int i=1;i<=T;i++){
            if(q[i].ok)puts("YES");
            else puts("NO");
        }
        fclose(stdin);fclose(stdout);
        return 0;
    }
    100分

    立方数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。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n;
    struct node{
        long long v;
        int id;
        bool ok;
    }q[110];
    bool cmp1(node x,node y){return x.v<y.v;}
    bool cmp2(node x,node y){return x.id<y.id;}
    long long qread(){
        long long i=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar();
        return i;
    }
    int main(){
        freopen("cubicp.in","r",stdin);freopen("cubicp.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)q[i].v=qread(),q[i].id=i;
        sort(q+1,q+n+1,cmp1);
        int l=1;
        for(int i=1;i<=1000000;i++){
            int j=i+1;
            long long now=1LL*i*i+1LL*i*j+1LL*j*j;
            if(now>q[n].v)break;
            while(now==q[l].v)q[l].ok=1,l++;
            while(now>q[l].v)l++;
            while(now==q[l].v)q[l].ok=1,l++;
            if(l>n)break;
        }
        sort(q+1,q+n+1,cmp2);
        for(int i=1;i<=n;i++){
            if(q[i].ok)puts("YES");
            else puts("NO");
        }
        fclose(stdin);fclose(stdout);
        return 0;
    }
    100分

    猜数字

    (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;

    }

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 1000010
    #define INF 1000001
    using namespace std;
    int n,T,opv,opx,cnt;
    bool use[maxn];
    struct node{
        int l,r,v;
        bool operator < (const node x)const{
            if(v!=x.v)return v>x.v;
            if(l!=x.l)return l<x.l;
            if(r!=x.r)return r<x.r;
        }
    }a[maxn],b[maxn],qujian[maxn];
    int q[maxn];
    void change(){
        q[opx]=opv;
    }
    int find(int l,int r){
        int mn=0x7fffffff;
        for(int i=l;i<=r;i++)mn=min(mn,q[i]);
        return mn;
    }
    bool flag=0;
    int opl,opr;
    void dfs(int pos){
        if(flag)return;
        if(pos==cnt+1){
            if(find(opl,opr)<opv)return;
            flag=1;return;
        }
        for(int i=qujian[pos].l;i<=qujian[pos].r;i++){
            if(q[i]<1000000)continue;
            int w=q[i];
            q[i]=qujian[pos].v;
            dfs(pos+1);
            if(flag)return;
            q[i]=w;
        }
    }
    bool check(int x){
        cnt=0;
        memset(q,0x7f,sizeof(q));
        memset(use,0,sizeof(use));
        for(int i=1;i<=x-1;i++)b[i]=a[i];
        sort(b+1,b+x);
        int l=0,r=0x7fffffff,vnow;
        for(int i=1;i<=x-1;i++){
            if(i==1||b[i].v!=b[i-1].v){
                if(i!=1){
                    qujian[++cnt].l=l;
                    qujian[cnt].r=r;
                    qujian[cnt].v=vnow;
                }
                l=0,r=0x7fffffff;
            }
            l=max(l,b[i].l),r=min(r,b[i].r);
            vnow=b[i].v;
            if(l>r)return 1;//不合法 
        }
        cnt=cnt+1;
        qujian[cnt].l=l;
        qujian[cnt].r=r;
        qujian[cnt].v=vnow;
        opl=a[x].l,opr=a[x].r;opv=a[x].v;
        flag=0;
        dfs(1);
        if(flag==0)return 1;
        return 0;
    }
    int int_qread(){
        int i=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar();
        return i;
    }
    int main(){
    //    freopen("Cola.txt","r",stdin);
        freopen("number.in","r",stdin);freopen("number.out","w",stdout);
        n=int_qread();T=int_qread();
        for(int i=1;i<=T;i++){
            a[i].l=int_qread();
            a[i].r=int_qread();
            a[i].v=int_qread();
        }
        int ans=T+1;
        for(int i=2;i<=T;i++){
            if(check(i)){
                ans=i;
                break;
            }
        }
        printf("%d",ans);
        fclose(stdin);fclose(stdout);
        return 0;
    }
    40分 暴力
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 1000010
    using namespace std;
    int n,q,ans;
    int fa[maxn];
    struct node{
        int l,r,v;
    }p[maxn],t[maxn];
    int qread(){
        int i=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar();
        return i;
    }
    bool cmp(node x,node y){return x.v>y.v;}
    int find(int x){
        if(x==fa[x])return x;
        return fa[x]=find(fa[x]);
    }
    bool check(int k){
        int lmn,lmx,rmn,rmx;
        for(int i=1;i<=n+1;i++)fa[i]=i;
        for(int i=1;i<=k;i++)t[i]=p[i];
        sort(t+1,t+k+1,cmp);
        lmn=lmx=t[1].l;
        rmn=rmx=t[1].r;
        for(int i=2;i<=k;i++){
            if(t[i].v<t[i-1].v){
                if(find(lmx)>rmn)return 1;
                for(int j=find(lmn);j<=rmx;j++)
                    fa[find(j)]=find(rmx+1);
                lmn=lmx=t[i].l;
                rmn=rmx=t[i].r;
            }
            else{
                lmn=min(lmn,t[i].l);
                lmx=max(lmx,t[i].l);
                rmn=min(rmn,t[i].r);
                rmx=max(rmx,t[i].r);
                if(lmx>rmn)return 1;
            }
        }
        if(find(lmx)>rmn)return 1;
        return 0;
    }
    int main(){
        freopen("number.in","r",stdin);freopen("number.out","w",stdout);
        int l,r,mid;
        n=qread();q=qread();
        for(int i=1;i<=q;i++)
            p[i].l=qread(),p[i].r=qread(),p[i].v=qread();
        l=1,r=q;ans=q+1;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid))ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%d",ans);
    }
    100分 并查集
    预计得分100+100+50
    实际得分100+0+0
    T2有一句话忘写了,导致输出顺序错误
    T3有一个无用数祖忘删了,爆了空间
    这次考试太不谨慎
    把不该犯的错误改过来之后是100+100+40
    小结
  • 相关阅读:
    浏览器之window对象--javascript
    CSS3盒子模型
    CSS3动画以及animation事件
    CSS3响应式布局
    原生JS实现tab切换--web前端开发
    html5表单与PHP交互
    UITableView 的坑
    多线程:Operation(二)
    多线程:Operation(一)
    GCD(Swift)
  • 原文地址:https://www.cnblogs.com/thmyl/p/7746049.html
Copyright © 2020-2023  润新知