刷题#R10
来源:互联网 发布:东莞制造业知乎 编辑:程序博客网 时间:2024/06/07 11:17
T1
理解题意,模拟即可。
T2
and是递减的,or是递增的。
用倍增预处理。
然后枚举左端点,二分右端点的范围或者用倍增求右端点的范围。
建议用倍增法,因为二分好像很慢,我的二分T掉三个点,二倍增查找0.1秒。
T3
树上dp+dfs来优化。
分析:显然的,树形dp,状态也很好想到:f[i][j]表示以i为根的子树收集到j个果子的方案数.转移的话就相当于是背包问题,每个子节点可以选或不选.如果不选子节点k的话,那么以k为根的子树的边无论断不断都没关系,贡献就是f[i][j] * 2^(size[k]).如果选的话,枚举一下收集到多少个果子,对答案的贡献就是f[i][j - p] * f[k][p].基本的计数原理.
不过这个转移是O(n^3)的,怎么优化呢?状态定义为这个样子是没法继续优化的,如果把状态的表示改成dfs到第i个点,收集到j个果子的方案数,就能够神奇地做到O(n^2)了.因为dfs是每次先向下递归,然后子节点向上回溯嘛,向下递归的时候就用父节点的状态去更新子节点的状态,向上回溯就用子节点的答案去更新父节点的答案.也就是说:向下走,更新状态;向上走,统计答案.
T1
#include<iostream>#include<cstdio>using namespace std;int n,m,p,k,a[1009],b[1009],c[1009][1009];int main(){ freopen("rotate.in","r",stdin); freopen("rotate.out","w",stdout); scanf("%d%d%d",&n,&p,&k); for(int i=1;i<=n;i++) b[i]=i; for(int i=1;i<=p;i++) { scanf("%d",&m); for(int j=1;j<=m;j++) scanf("%d",&c[i][j]); c[i][0]=m; } for(int i=p;i>=1;i--) { m=c[i][0]; int t=b[c[i][m]]; for(int j=m;j>1;j--) { b[c[i][j]]=b[c[i][j-1]]; } b[c[i][1]]=t; } for(int i=1;i<=n;i++) a[b[i]]=i; for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0;}
T2
倍增查找
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define LL long longusing namespace std;const int MOD=(1e9)+7;const int N=100009;int n,a[N];int f[N][50],g[N][50];int A,B,C,D;LL ans;int main(){ freopen("range.in","r",stdin); freopen("range.out","w",stdout); scanf("%d%d%d%d%d",&n,&A,&B,&C,&D); for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i][0]=g[i][0]=a[i]; for(int j=1;(1<<j)<=n;++j) { for(int i=1;i<=n;i++) { if(i+(1<<j)-1>n) break; f[i][j]=f[i][j-1] & f[i+(1<<j-1)][j-1]; g[i][j]=g[i][j-1] | g[i+(1<<j-1)][j-1]; } }//倍增预处理 for(int l=1;l<=n;l++) { if(g[l][0]>D||f[l][0]<A) continue; int i,j,L=l,R,andn=(1<<20)-1,orn=0; for(i=20;i>=0;i--) { if(L+(1<<i)-1>n) continue; if(((andn&f[L][i])>B)||((orn|g[L][i])<C)) { andn &=f[L][i]; orn |=g[L][i]; L+=(1<<i); } } R=L; for(i=20;i>=0;i--) { if(R+(1<<i)-1>n) continue; if(((andn&f[R][i])>=A)&&((orn|g[R][i])<=D)) { andn &=f[R][i]; orn |=g[R][i]; R+=(1<<i); } } R--; if(R-L+1>0) ans+=(R-L+1); } ans%=MOD; printf("%lld\n",ans); return 0;}
二分(70分)
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define LL long longusing namespace std;const int MOD=(1e9)+7;const int N=100009;int n,a[N];int f[N][50],g[N][50];int A,B,C,D;LL ans;int ask_and(int l,int r){ int t=r-l+1; t=log2(t); return f[l][t] & f[r-(1<<t)+1][t];}int ask_or(int l,int r){ int t=r-l+1; t=log2(t); return g[l][t] | g[r-(1<<t)+1][t]; }int main(){ freopen("range.in","r",stdin); freopen("range.out","w",stdout); scanf("%d%d%d%d%d",&n,&A,&B,&C,&D); for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i][0]=g[i][0]=a[i]; for(int j=1;(1<<j)<=n;++j) { for(int i=1;i<=n;i++) { if(i+(1<<j)-1>n) break; f[i][j]=f[i][j-1] & f[i+(1<<j-1)][j-1]; g[i][j]=g[i][j-1] | g[i+(1<<j-1)][j-1]; } }//倍增预处理 for(int i=1;i<=n;i++) { if(f[i][0]<A||g[i][0]>D) continue; int L,R,andn,orn,mid; for(int j=i;j<=n;j++) { andn=ask_and(i,j); orn=ask_or(i,j); L=j,R=n+1; while(L<=R) { mid=(L+R)>>1; if(orn==ask_or(i,mid) && andn==ask_and(i,mid)) L=mid+1; else R=mid-1; } if(orn<=D&&orn>=C&&andn<=B&&andn>=A) ans+=R-j+1; j=R; } } ans%=MOD; printf("%lld\n",ans); return 0;}
T3
std
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;typedef long long LL;LL mod = 1e9+7;int n,k;int a[1005];int H[1005],X[2005],P[2005],tot;inline void add(int x,int y){ P[++tot]=y;X[tot]=H[x];H[x]=tot;}LL pw2[1005];LL dp[1005][1005];int dfs(int x,int fa){ int siz=1; for(int i=H[x];i;i=X[i]){ if(fa == P[i]) continue; for(int j=0;j<=n-a[P[i]];j++){ dp[P[i]][j+a[P[i]]] = dp[x][j]; } int tmp = dfs(P[i],x); for(int j=0;j<=n;j++){ dp[x][j] = (pw2[tmp-1] * dp[x][j] % mod + dp[P[i]][j])% mod; } siz+=tmp; } return siz;}int main(){ freopen("fruit.in","r",stdin); freopen("fruit.out","w",stdout); scanf("%d%d",&n,&k); pw2[0]= 1; for(int i=1;i<=n;i++) pw2[i] = pw2[i-1] * 2 % mod; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); add(x,y);add(y,x); } dp[1][a[1]] = 1; dfs(1,0); printf("%d\n",(int)dp[1][k]); return 0;}
阅读全文
0 0
- 刷题#R10
- ndk-r10 Eclipse配置
- android-ndk r10环境搭建
- freescale R10 ipu lib 分析 - ipu_capture.c
- freescale R10 ipu lib 分析 - ipu_device.c
- freescale R10 ipu lib 分析 - ipu_common.c
- freescale R10 ipu lib 分析 - ipu_param_mem.h
- freescale R10 ipu lib 分析 - ipu_ic.c
- freescale R10 ipu lib 分析 - ipu_ic.c
- freescale R10 ipu lib 分析 - ipu_capture.c
- freescale R10 ipu lib 分析 - ipu_device.c
- freescale R10 ipu lib 分析 - ipu_common.c
- freescale R10 ipu lib 分析 - ipu_param_mem.h
- freescale R10 ipu lib 分析 - ipu_capture.c
- freescale R10 ipu lib 分析 - ipu_device.c
- freescale R10 ipu lib 分析 - ipu_common.c
- freescale R10 ipu lib 分析 - ipu_common.c
- freescale R10 ipu lib 分析 - ipu_param_mem.h
- MySQL explain执行计划解读
- 一个简单地程序示例剖析类加载机制
- 洛谷 3932 浮游大陆的68号岛 前缀和
- bzoj5056: OI游戏
- 手把手教Redis安装
- 刷题#R10
- 阿里云ECS的1M带宽能干嘛?
- 编写服务器和客户端
- 百度前端技术学院-任务四模拟队列
- Windows环境搭建Tomcat+Nginx的负载均衡and动静资源分离
- 【codevs 3377】[Mz]接水问题2
- PyTorch笔记1-PyTorch简介
- Python网络编程
- Python学习笔记--conda资料的介绍