• 8.27 悲伤赛


    今天是很神奇的一天

    我没有分。。。。

    原因是我a题卡了太久  以至于后面做疯了  然后 我做b题的时候炸了 所以b题后面一直在调试  也没有调试好 所以交的时候还在改题  越改越错越改越错  然后老板就开始评测了

    所以可以说是今天CocaCola WA0了;

    还有就是 今天告诉我了一个道理就是  千万要保存修改前的代码!!!!!

    还有就是知识盲区不要等待,遇到不会的地方一定不要等待 没有a的题要背着写一遍!!!!! (flag已立)

    A异或区间
    时间限制 : 10000 MS   空间限制 : - KB 
    问题描述

    何老板给你一个长度为的整数数列
    请你帮他找出满足下列条件的数字对的个数:
       
       
    ""表示“异或”,对应c++中的符号是"^"

    输入格式

    第一行,一个整数&N&
    第二行,个空格间隔的整数

    输出格式

    一个整数,表示满足条件的数字对的个数

    样例输入 1

    4
    2 5 4 6

    样例输出 1

    5

    样例说明:满足条件的数字对有[1,1],[2,2],[3,3],[4,4],[1,2]

    样例输入 2

    19
    885 8 1 128 83 32 256 206 639 16 4 128 689 32 8 64 885 969 1

    样例输出 2

    37

    样例输入 3

    9
    0 0 0 0 0 0 0 0 0

    样例输出 3

    45

     
    说说a题哈:a题最开始没有头绪
    后来发现了 a+b=a^b+(a&b>>1)
    想要靠a&b==0来判定
    但是显然不是
    后来知道是用前缀和来做的
    而且可以通过二分缩小
    #include<stdio.h>
    #include<bits/stdc++.h>
    #include<cctype> 
    using namespace std;
    long long a[200005],sum[200005],sx[200005],n,ans,l,r,j,mid;
    char buf[1<<20],*p1,*p2;
    #define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)
    template<class T> inline void read(T &n){
        char ch=GC;T w=1,x=0;
        while(!isdigit(ch)){if(ch=='-') w=-1;ch=GC;}
        while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=GC;}
        n=x*w;
    }
    int check(int x){
        
    l=x,r=n;j=x;
    
    while(l<=r)
    {
    mid=(l+r)/2;
    if((sum[mid]-sum[x-1])==(sx[mid]^sx[x-1]))l=mid+1,j=mid;
    else r=mid-1;
    }
    
    return j-x;
    }
    
    int main()
    {    
    read(n);
    ans+=n;
    for(int i=1;i<=n;i++)
    {
    read(a[i]);
    sum[i]=sum[i-1]+a[i];
    sx[i]=sx[i-1]^a[i];
    }
    
    for(int i=1;i<=n;i++)ans+=check(i);
    printf("%lld",ans);
    
    }

    b题老板说是板题 后来接之前考试的nonstop帮我的倍增代码搞

    但是后来dfs出了问题 两个独立循环套在了一个函数里面 就一直没调出来  然后改错了  凉凉~~~~

    B管辖
    时间限制 : - MS   空间限制 : - KB 
    评测说明 : 1s,256m
    问题描述

    何老板给你一棵树,树中共N个节点,编号1到N,1号点为根。
    每个节点都有一个权值,其中第i个节点的权值为 
    树中共有N-1条边,每条边都有一定的长度,第i条边长度为  。
    对于树中任意一点i,从i出发往根的路径中,距离i不超过的点,都可以管辖i号点。
    何老板想知道,每个点管辖的点有多少个(不包括自己)。他拜托你帮忙计算一下。

    输入格式

    第一行,一个整数N,
    第二行,N个空格间隔的整数,依次表示 
    接下来N-1行,每行两个整数描述一条边,其中第i行的两个整数  和 分别表示i+1号点的父亲节点为,号点的边长为

    输出格式

    一行,N个整数,依次表示1到N号点管辖的节点数。

    #include<bits/stdc++.h>
    #include<cctype>
    using namespace std;
    long long x,y,la[200005],ne[200005],to[200005],cnt,fa[200005][21],c[200005],n,dis[200005][21],a[200005],w[200005];
    char buf[1<<20],*p1,*p2;
    #define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)
    template<class T> inline void read(T &n){
    char ch=GC;T w=1,x=0;
    while(!isdigit(ch)){if(ch=='-') w=-1;ch=GC;}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=GC;}
    n=x*w;
    }
    void add(int x,int y,int s){
    ne[++cnt]=la[x];la[x]=cnt;to[cnt]=y;w[cnt]=s;
    }
    void dfs(int x){
    for(int i=1;i<=20;i++){
    dis[x][i]=dis[x][i-1]+dis[fa[x][i-1]][i-1];
    fa[x][i]=fa[fa[x][i-1]][i-1];
    }
    for(int i=la[x];i;i=ne[i]){
    int v=to[i];
    dis[v][0]=w[i];
    fa[v][0]=x,dfs(v);
    }
    }
    void ddfs(int x){
    for(int i=la[x];i;i=ne[i])ddfs(to[i]),c[x]+=c[to[i]];
    }
    int main(){

    read(n);
    for(int i=1;i<=n;i++)read(a[i]);
    for(int i=2;i<=n;i++){
    read(x),read(y);
    add(x,i,y);
    }
    dfs(1);
    for(int x=1;x<=n;x++)
    {
    long long u=x,y=a[x];
    for(int i=20;i>=0;i--)
    if(dis[u][i]<=y){
    y-=dis[u][i];
    u=fa[u][i];
    }
    c[fa[u][0]]--;
    c[fa[x][0]]++;
    }//差分
    ddfs(1);
    for(int i=1;i<=n;i++)printf("%lld ",c[i] );
    }

  • 相关阅读:
    数数小木块
    猴子吃桃问题
    整除个数
    大小写互换
    车牌号
    比较字母大小
    队花的烦恼一
    字母小游戏
    字符串逆序输出
    茵茵的第一课
  • 原文地址:https://www.cnblogs.com/cocacolalala/p/11418547.html
Copyright © 2020-2023  润新知