zoukankan      html  css  js  c++  java
  • NOIP模拟2017.6.11解题报告

    T1:

      水题;

    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define maxn 100005
    int n,ai[maxn],Max[maxn],bi[maxn],size;
    int tree[maxn];
    inline void in(int &now)
    {
        char Cget=getchar();now=0;
        while(Cget>'9'||Cget<'0') Cget=getchar();
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
    }
    inline void add(int x)
    {
        while(x<=n) tree[x]++,x+=x&(-x);
    }
    inline bool judge(int l,int r)
    {
        int res=0;l--;
        while(r) res+=tree[r],r-=r&(-r);
        while(l) res-=tree[l],l-=l&(-l);
        return res;
    }
    int lower_bound(int x)
    {
        int l=1,r=size,mid;
        while(l<=r)
        {
            mid=l+r>>1;
            if(bi[mid]==x) return mid;
            if(bi[mid]<x) l=mid+1;
            else r=mid-1;
        }
    }
    int main()
    {
        freopen("disk.in","r",stdin);
        freopen("disk.out","w",stdout);
        while(scanf("%d",&n)!=EOF)
        {
            for(int i=1;i<=n;i++) in(ai[n-i+1]),bi[i]=ai[n-i+1],tree[i]=0;
            sort(bi+1,bi+n+1),size=unique(bi+1,bi+n+1)-bi-1;
            for(int i=1;i<=n;i++) ai[i]=lower_bound(ai[i]);
            Max[n+1]=0;
            for(int i=n;i>0;i--) Max[i]=max(Max[i+1],ai[i]);
            bool ans=true;
            add(ai[1]);
            for(int i=2;i<n;i++)
            {
                if(ai[i]+1<Max[i+1])
                {
                    if(judge(ai[i]+1,Max[i+1]))
                    {
                        ans=false;
                        break;
                    }
                }
                add(ai[i]);
            }
            if(ans) puts("Y");
            else puts("J");
        }
        return 0;
    }

    T2:

      样例不过却ac,我也很无奈啊~~

    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define maxn 1005
    int x[maxn],y[maxn],bi[maxn<<1],size,n,cnt;
    int num[maxn<<1][maxn<<1],ans=0;
    inline void in(int &now)
    {
        int if_z=1;now=0;
        char Cget=getchar();
        while(Cget>'9'||Cget<'0')
        {
            if(Cget=='-')if_z=-1;
            Cget=getchar();
        }
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
        now*=if_z;
    }
    int dge(int xx,int yy)
    {
        int xx_=lower_bound(bi+1,bi+size+1,xx)-bi;
        int yy_=lower_bound(bi+1,bi+size+1,yy)-bi;
        if(bi[xx_]==xx&&yy==bi[yy_]) return num[xx_][yy_];
        return 0;
    }
    inline void Count(int a,int b)
    {
        int xa=x[a],ya=y[a],xb=x[b],yb=y[b];
        num[xa][ya]--,num[xb][yb]--;
        if(xa>xb) swap(xa,xb),swap(ya,yb);
        int dx=bi[xb]-bi[xa],dy=bi[yb]-bi[ya];
        int xxa,yya,xxb,yyb;
        xxa=bi[xa]+dy,yya=bi[ya]-dx;
        xxb=bi[xb]-dy,yyb=bi[yb]-dx;
        if(xxa!=xxb||yya!=yyb) ans+=dge(xxa,yya)*dge(xxb,yyb);
        else ans+=dge(xxa,yya)*(dge(xxb,yyb)-1);
        xxa=bi[xa]-dy,yya=bi[ya]+dx;
        xxb=bi[xb]+dy,yyb=bi[yb]+dx;
        if(xxa!=xxb||yya!=yyb) ans+=dge(xxa,yya)*dge(xxb,yyb);
        else ans+=dge(xxa,yya)*(dge(xxb,yyb)-1);
        num[xa][ya]++,num[xb][yb]++;
    }
    int main()
    {
        freopen("car.in","r",stdin);
        freopen("car.out","w",stdout);
        in(n);
        for(int i=1;i<=n;i++)
        {
            in(x[i]),in(y[i]);
            bi[++cnt]=x[i],bi[++cnt]=y[i];
        }
        sort(bi+1,bi+cnt+1),size=unique(bi+1,bi+cnt+1)-bi-1;
        for(int i=1;i<=n;i++)
        {
            x[i]=lower_bound(bi+1,bi+size+1,x[i])-bi;
            y[i]=lower_bound(bi+1,bi+size+1,y[i])-bi;
            num[x[i]][y[i]]++;
        }
        for(int i=1;i<=n;i++)
        {
            for(int v=i+1;v<=n;v++)
            {
                if(v==i) continue;
                Count(i,v);
            }
        }
        cout<<ans/2;
        return 0;
    }

    T3:

      坑爹!!!!

    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    #define maxn 30005
    #define ll long long
    ll n,ai[maxn],bi[maxn],size,root[maxn],tot;
    ll lc[maxn*30],rc[maxn*30],dis[maxn*30],m;
    inline void in(ll &now)
    {
        char Cget=getchar();now=0;
        while(Cget>'9'||Cget<'0')Cget=getchar();
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
    }
    void build(ll &now,ll l,ll r)
    {
        now=++tot;
        if(l==r) return;
        ll mid=l+r>>1;
        build(lc[now],l,mid);
        build(rc[now],mid+1,r);
    }
    void add(ll &now,ll pre,ll l,ll r,ll to)
    {
        now=++tot;dis[now]=dis[pre]+1;
        if(l==r) return;ll mid=l+r>>1;
        if(to<=mid) add(lc[now],lc[pre],l,mid,to),rc[now]=rc[pre];
        else add(rc[now],rc[pre],mid+1,r,to),lc[now]=lc[pre];
    }
    ll query(ll now,ll l,ll r,ll k)
    {
        if(l==r) return l;
        ll mid=l+r>>1;
        if(k<=dis[lc[now]]) return query(lc[now],l,mid,k);
        else return query(rc[now],mid+1,r,k-dis[lc[now]]);
    }
    int main()
    {
        freopen("rollcall.in","r",stdin);
        freopen("rollcall.out","w",stdout);
        in(n),in(m);
        for(ll i=1;i<=n;i++) in(ai[i]),bi[i]=ai[i];
        sort(bi+1,bi+n+1),size=unique(bi+1,bi+n+1)-bi-1;
        for(ll i=1;i<=n;i++) ai[i]=lower_bound(bi+1,bi+size+1,ai[i])-bi;
        build(root[0],1,size);
        for(ll i=1;i<=n;i++) add(root[i],root[i-1],1,size,ai[i]);
        ll pos;
        for(ll i=1;i<=m;i++) in(pos),printf("%I64d
    ",bi[query(root[pos],1,size,i)]);
        return 0;
    }
  • 相关阅读:
    2018年10月22日-Python day1
    Python list(列表)功能详解
    剑指offer(4):重建二叉树
    剑指offer(3):从尾到头打印单链表
    剑指offer(2):替换空格
    机器学习实战:第九章 树回归
    ubuntu 中查找文件的命令
    关于 c++ primer plus 中valarray类使用例程的一个记录
    vim 最基本操作
    如何在VS2015中使用strcpy函数
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6985118.html
Copyright © 2011-2022 走看看