2017.10.7北京清北综合强化班DAY7
1.计数
(count.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
给出m个数a[1],a[2],…,a[m]
求1~n中有多少数不是a[1],a[2],…,a[m]的倍数。
【输入】
输入文件名为count.in。
第一行,包含两个整数:n,m
第二行,包含m个数,表示a[1],a[2],…,a[m]
【输出】
输出文件名为count.out。
输出一行,包含1个整数,表示答案
【输入输出样例】
count.in |
count.out |
10 2 2 3 |
3 |
【数据说明】
对于60%的数据,1<=n<=106
对于另外20%的数据,m=2
对于100%的数据,1<=n<=109,0<=m<=20,1<=a[i]<=109
题解:
#include<iostream>
#include<cstdio>
using namespace std; int cnt,n,m,x,vis[]; int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d",&x);
for(int j=;j*x<=n;j++){
if(!vis[j*x]){
vis[j*x]=true;
cnt++;
}
}
}
printf("%d\n",n-cnt);
return ;
}
60暴力
考试时用的map判重全T =…=
正解:容斥原理...考试时想到了..可是当时不会容斥..
一个区间内某个数倍数的个数=r/x-(l-1)/x,可是1--n中12既是3的倍数,又是4.6.的倍数
会被筛掉好几次,所以答案=n/一个数-n/两个数的lcm+n/三个数的lcm.....
#include<iostream>
#include<cstdio>
#define LL long long
using namespace std; int n,m,ans,a[]; inline int read(){
char ch=getchar();int x=,f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
return x*f;
} LL gcd(LL x,LL y){
return y==?x:gcd(y,x%y);
} void dfs(int now,int cnt,LL lcm){
if(lcm>n)return;//加上剪枝108ms,不加600ms
if(now==m+){
if(cnt&)ans+=n/lcm;
else if(cnt)ans-=n/lcm;
return;
}
dfs(now+,cnt,lcm);
LL p=lcm/gcd(lcm,a[now])*a[now];
dfs(now+,cnt+,p);
} int main(){
n=read();m=read();
for(int i=;i<=m;i++)a[i]=read();
dfs(,,);
printf("%d\n",n-ans);
return ;
}
AC
2.第k大区间
(kth.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
定义一个长度为奇数的区间的值为其所包含的的元素的中位数。
现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少。
【输入】
输入文件名为kth.in。
第一行两个数n和k
第二行,n个数。(0<=每个数<231)
【输出】
输出文件名为kth.out。
一个数表示答案。
【输入输出样例】
kth.in |
kth.out |
4 3 3 1 2 4 |
2 |
【样例解释】
[l,r]表示区间l~r的值
[1,1]:3
[2,2]:1
[3,3]:2
[4,4]:4
[1,3]:2
[2,4]:2
【数据说明】
对于30%的数据,1<=n<=100;
对于60%的数据,1<=n<=300
对于80%的数据,1<=n<=1000
对于100%的数据,1<=n<=100000, k<=奇数区间的数
题目大意:定义一段奇数长度区间的值为它的中位数,求所有奇数区间值的第k大。
题解:二分答案
假设现在二分的答案为t,那么怎样统计比t大的区间的个数呢?设s[i]为1--i大于等于t的数的个数,
发现,如果一个区间的中位数的大小比t大,那么s[r]-s[l-1]>(r-l+1)/2,==> 2*s[r]-r>2*s[l-1]-(l-1),
我们用树状数组统计一下s[r]>s[l]的个数,因为r,l的奇偶性不同,要维护两个树状数组。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define maxn 100009
using namespace std; int n,l,r,mid,ans,a[maxn],b[maxn],tree[maxn*][];
LL k; void add(int pos,int p){
if(pos<=)return;
for(;pos<=maxn*;pos+=pos&(-pos))tree[pos][p]++;
} LL getsum(int pos,int p){
LL all=;if(pos<=)return ;
for(;pos;pos-=pos&(-pos))all+=tree[pos][p];
return all;
} bool check(int p){
LL s=;
memset(tree,,sizeof(tree));
for(int i=;i<=n;i++)b[i]=a[i]>=p?:,b[i]+=b[i-];
for(int i=;i<=n;i++)b[i]=*b[i]-i+n;
add(n,);//???
for(int i=;i<=n;i++){
s+=getsum(b[i],(i&)^);
add(b[i],(i&));
}
return s>=k;
} int main(){
scanf("%d%lld",&n,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]),r=max(r,a[i]);
while(l<=r){
mid=(l+r)>>;
if(check(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}
AC
3. 区间求和
(sum.cpp/c/pas)
时间限制:2s
内存限制:256MB
【问题描述】
有n个数,给定一个k,求所有长度大于等于k的区间中前k大数的总和。这样就比较简单相信大家都会,所以此题要求当k=1~n的总和,即求
【输入】
输入文件名为sum.in。
输入五个数n,a1,A,B,C。a1表示第一个数,A,B,C用来生成其余n-1个数。a(i)=(a(i-1)*A+B)mod C。1<=n<=1,000,000,0<=a1,A,B,C<=1,000,000,000
【输出】
输出文件名为sum.out。
一个数表示答案,最后答案对1,000,000,007取模。
【输入输出样例】
sum.in |
sum.out |
3 3 1 1 10 |
63 |
【样例解释】
三个数为3,4,5
K=1:[1,1]=3,[1,2]=[2,2]=4,[1,3]=[2,3]=[3,3]=5
(表示各个区间在k=1时的答案)
K=2:[1,2]=7,[2,3]=[1,3]=9
K=3:[1,3]=12
【数据说明】
对于30%的数据,1<=n<=100
对于60%的数据,1<=n<=300
对于80%的数据,1<=n<=1000
对于100%的数据,1<=n<=1000000
题解:树状数组...不会做...
首先我们讨论对于一个固定的区间[l,r]假设它的答案为ans,那么如果新增加一个数a[r+1],
对于新的区间[l,r+1],a[r+1]出现的次数为小于a[r+1]的数的次数+1。
所以我们要统计对于Ai<Aj &&i<j的个数,那么包含这两个数的区间为的个数为(n-j+1)*i,
Aj对答案的贡献为Aj*i*(n-j+1)。当Ai>Aj时同理,倒过来处理。
另外之前一直WA的原因是,离散化的时候应该双关键字查找,因为Ai<Aj时i<j。
还有模少了爆Int...
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define mod 1000000007
#define maxn 1000009
#define LL long long
using namespace std; LL n,ans,A,B,C,a[maxn],tree[maxn];
typedef pair<LL,int> PII;
PII b[maxn]; void add(int x,int p){
for(;x<=n;x+=x&(-x))tree[x]=(tree[x]+p)%mod;
} LL getsum(int x){
LL all=;
for(;x;x-=x&(-x))all=(all+tree[x])%mod;
return all;
} int main(){
scanf("%lld%lld%lld%lld%lld",&n,&a[],&A,&B,&C);
b[].first=a[];b[].second=;
for(int i=;i<=n;i++){
a[i]=(a[i-]*A+B)%C;
b[i].first=a[i];b[i].second=i;
}
sort(b+,b+n+);
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b+n+,make_pair(a[i],i))-b;
for(int i=;i<=n;i++){
add(a[i],i);
LL tmp=b[a[i]].first*1LL*(n-i+)%mod;
LL amp=getsum(a[i]);
ans=(ans%mod+tmp*amp%mod)%mod;
}
memset(tree,,sizeof(tree));
for(int i=n;i>=;i--){
LL tmp=(b[a[i]].first*1LL*i)%mod;
LL amp=getsum(a[i]);
ans=(ans%mod+tmp*amp%mod)%mod;
add(a[i],n-i+);
}
printf("%lld\n",ans);
return ;
}
AC
2017.10.7北京清北综合强化班DAY7的更多相关文章
- 2017.10.3北京清北综合强化班DAY3
括号序列(bracket) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的 ...
- 2017.10.4北京清北综合强化班DAY4
财富(treasure) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以 ...
- 2017.10.6北京清北综合强化班DAY6
题目大意:改变一个数的位置 把一个序列变成不下降序列 题解: 设置一个pre,如果破坏单调性,就把‘删除’这个.否则把pre修改为当前元素的值. 考试时这样得了90分,是因为我的做法只能过这样的数据 ...
- 2017.10.5北京清北综合强化班DAY5
拼不出的数lost.in/.out/.cpp[问题描述]3 个元素的集合{5, 1,2} 的所有子集的和分别是0,1, 2, 3, 5, 6, 7, 8.发现最小的不能由该集合子集拼出的数字是4.现在 ...
- 2017.10.1北京清北综合强化班DAY1
a[问题描述]你是能看到第一题的 friends 呢.——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx. 何大爷今天为字符串定义了新的权值计算方法.一个字符串 由小写字母组成,字符串 ...
- 2017.10.2北京清北综合强化班DAY2
a[问题描述]你是能看到第一题的 friends呢. —— hja世界上没有什么比卖的这 贵弹丸三还令人绝 ...
- 北京清北 综合强化班 Day4
财富(treasure) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以 ...
- 北京清北 综合强化班 Day3
括号序列(bracket) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的 ...
- 北京清北 综合强化班 Day2
a [问题描述] 你是能看到第一题的 friends呢. —— hja世界上没有什么比卖的这 贵弹丸三还令 ...
随机推荐
- predis操作大全
predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后 ...
- Jquery.ScrollLoading图片延迟加载技术
关于分屏加载图片,像天猫.京东等电商图片较多页面很长,就采用了延迟加载技术. 目前很流行的做法就是滚动动态加载,显示屏幕之外的图片默认是不加载的, 随着页面的滚动,显示区域图片才被动态加载. 原理其实 ...
- web前端基础知识学习网站推介
内容:一.基础知识及学习资料1. HTML入门学习:http://www.w3school.com.cn/html/index.aspHTML5 入门学习:http://www.w3school.co ...
- github使用——如何恢复被删去文件。
首先git删除文件包括以下几种情况 删除本地文件,但是未添加到暂存区: 删除本地文件,并且把删除操作添加到了暂存区: 把暂存区的操作提交到了本地git库: 把本地git库的删除记录推送到了远程服务器g ...
- OpenStack虚拟机创建过程中镜像格式的的变化过程
Glance用来作为独立的大规模镜像查找服务,当它与Nova和Swift配合使用时,就为OpenStack提供了虚拟机镜像的查找服务,像所有的OpenStack项目一样,遵循以下设计思想: 基于组件的 ...
- Windows 端口和所提供的服务
一 .端口大全 端口:0 服务:Reserved 说明:通常用于分析操作系统.这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果.一种典型的扫描,使 ...
- RHEL7 LAMP
准备篇: RHEL 7.0系统安装配置图解教程:http://www.osyunwei.com/archives/7702.html 一.使用系统镜像文件配置本地yum源 1.使用WinSCP.exe ...
- oracle 启动数据库与监听器
1.oracle 启动数据库与监听器 1)启动数据库 oracle用户进去 oracle/oracle sqlplus / as sysdba 然后startup 退出,然后启动监听进程 2)启动监听 ...
- 多校HDU5723 最小生成树+dfs回溯
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 经典的MapReduce1解析
MapReduce1任务图解 最顶层包含4个独立的实体客户端,提交MapReduce作业jobtracker,协调作业的运行.Jobtracker是一个Java应用程序,它的主类是JobTracker ...