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