3 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int MAX=1e6+100; int n,q,ans=0; int p[MAX]; int main(){ scanf("%d%d",&n,&q); int l,r; for (int i=1;i<=q;i++){ scanf("%d%d",&l,&r); p[l]++; p[r+1]--; } for (int i=1;i<=n;i++){ p[i]=p[i-1]+p[i]; if (p[i]%2!=0)ans++; } printf("%d",ans); return 0; }
-
0
证明差分: 序列a[n]为一串数组,例如1 2 3 4 5…… 如果b[n]为a[n]的差分数组 根据差分的定义可得 b[1]=a[1]-a[0] b[2]=a[2]-a[1] …… b[n]=a[n]-a[n-1] 转化一下,求数组b的前缀和,根据上面公式可得 得b[1]+b[2]+b[3]+...+b[i] = a[1]+(a[2]-a[1])+(a[3]-a[2])+...+(a[i]-a[i-1])=a[i] 由此可知,原序列为差分序列的前缀和序列 a[i] = b[1]+b[2]+b[3]+...+b[i] 当我想给数组a的区间[x,y]全部增加 对差分数组是如下操作的 b[x] += c; b[y+1] -= c; //把a序列分为[1,x-1],[x,y],[y+1,n]三部分,由差分定义和与前缀和关系可得 a[x-1] = b[1]+b[2]+...+b[x-1]; //b[1]~b[x-1]中所有值都未改变,a[x-1]也不变 a[x] = b[1]+b[2]+...+b[x-1]+b[x]; //b[x] += c,所以a[x] += c a[x+1] = b[1]+b[2]+...+b[x-1]+b[x]+b[x+1]; //b[x] += c,所以a[x+1] += c ... //一直到 a[y] = b[1]+b[2]+...b[x]+...+b[y];//b[x] += c,所以a[y] += c a[y+1] = b[1]+b[2]+...b[x]+...+b[y]+b[y+1];//b[x] += c,b[y+1] -= c;所以a[y+1]不变 //所以由此可知上面的两个语句(b[x] += c;b[y+1] -= c)可以实现a数组在区间[x,y]内的所有值都加上了常数c 代码: #include<iostream> using namespace std; int n,m,diff[1000005],ans,x,y;//diff为差分数组初始全为0 int main() { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>x>>y; diff[x]+=1; diff[y+1]-=1;//差分操作 } for(int i=1;i<=n;i++) { diff[i]=diff[i-1]+diff[i];//对差分数组求前缀和就得到了a[i] } //因为原数组a都是0,所以此时对差分求完前缀和也就是我们需要的数组 for(int i=1;i<=n;i++) { if(diff[i]%2) ans++;//如果元素%2==1说明面朝上,加1 } cout<<ans; return 0; }
- 1
信息
- ID
- 535
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 129
- 已通过
- 57
- 上传者