T1

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int N=;
int n,m,k,p;
int to[N],nex[N];
int a[N][N];
int main()
{
freopen("rotate.in","r",stdin);
freopen("rotate.out","w",stdout);
scanf("%d%d%d",&n,&p,&k);
for(int j=;j<=n;j++) to[j]=j;
for(int i=;i<=p;i++)
{
scanf("%d",&m);a[i][]=m;
for(int j=;j<=m;j++) scanf("%d",&a[i][j]);
}
for(int i=p;i>=;i--)
{
memset(nex,,sizeof nex);m=a[i][]; for(int j=;j<=m;j++) nex[a[i][j-]]=a[i][j];
nex[a[i][m]]=a[i][]; for(int j=;j<=n;j++)
if(nex[to[j]]) to[j]=nex[to[j]];
}
for(int j=;j<=n;j++)
printf("%d ",to[j]);
return ;
}

first 100

置换,没学过的话模拟就行。考察理解题意了。

正着做:置换的性质。(不知道也能做)

T2

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int N=1e4+;
int n,a,b,c,d;
int q[N];
long long 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=;i<=n;i++) scanf("%d",&q[i]); for(int i=,j;i<=n;i++)
{
int ans1,ans2;
ans1=ans2=q[i];
if(ans1<a||ans2>d) continue;
j=i;
for(j;j<=n;j++)
{
ans1&=q[j];ans2|=q[j];
if(ans1<a||ans2>d) break;
if(ans1<=b&&ans2>=c) ans++;
}
}
cout<<ans<<endl;
return ;
}

first 60

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<ctime>
using namespace std;
typedef long long LL;
const int N=1e5+;
const LL P=1e9+;
LL ans;
int s[N],sta[N][],sto[N][];
int worka(int l,int r)
{
int L=r-l+;
int t=log2(L);
return sta[l][t]&sta[r-(<<t)+][t];
}
int worko(int l,int r)
{
int L=r-l+;
int t=log2(L);
return sto[l][t]|sto[r-(<<t)+][t];
}
int n,a,b,c,d;
int main()
{
freopen("range.in","r",stdin);
freopen("range-me.out","w",stdout);
scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
for(int i=;i<=n;i++)
{
scanf("%d",&s[i]);
sta[i][]=sto[i][]=s[i];
} //预处理倍增,下一步能O(1)查询区间值
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
if(i+(<<j)- <=n )
{
sta[i][j]=sta[i][j-]&sta[i+(<<j)][j-];
sto[i][j]=sto[i][j-]|sto[i+(<<j)][j-];
}
//查找区间(具有单调性)
for(int i=;i<=n;i++)
{
int andans,orans;
// andans=orans=s[i];
int j=i;
while(j<=n)
{
int L=j,R=n+,mid;
andans=worka(i,j);
orans=worko(i,j);
while(R-L>)
{
mid=(L+R)>>;
if(worka(i,mid)==andans&&worko(i,mid)==orans)
L=mid;
else R=mid;
}
if(andans>=a&&andans<=b&& orans>=c&&orans<=d)
ans+=L-j+;
j=L;
} }
cout<<ans%P;
}

二分+st优化

先固定左端典,向右搜,查找区间个数。

怎么优化,二分 +倍增。

本来我想’与‘和’或‘是不满足 前缀差等于区间值的性质的。

其实我的想法太狭隘了,仔细想想:无论是’与‘还是’或‘ 都满足两段区间O(1)合成更大区间的性质。

比如f[1,6] & f[3,9],  可以看成f[1,3] & f[3,6]&f[6,9] &f[3,6] 一个数和本身的’‘与’还是本身无影响。

然后就能通过二分把n^n变成nlogn,

T3

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int N=;
const int P=1e9+;
int n,k;
int h[N],nex[N*],to[N*],cnt;
int w[N],sum[N],tot[N];//子树节点数,根到这的和
int x,y;
void add()
{
scanf("%d%d",&x,&y);
to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;
to[++cnt]=x,nex[cnt]=h[y],h[y]=cnt;
}
int vis[N];int ans;
void dfs(int Tot,int Sum,int last)
{
if(Tot==k)
{
int ss=Sum;
for(int i=;i<=n;i++)
if(vis[i])
for(int j=h[i];j;j=nex[j])
if(!vis[to[j]]) Sum++;
Sum=n--Sum;
ans=(1LL*ans+1LL*(<<Sum)%P)%P; Sum=ss;
}
if(Tot>k) return ;
for(int i=last;i<=n;i++)
if(vis[i])
{
int is=;
for(int j=h[i];j;j=nex[j])
if(!vis[to[j]]) {
vis[to[j]]=;
dfs(Tot+w[to[j]],Sum+,i);
vis[to[j]]=;
is=;
}
}
}
int main()
{
freopen("fruit.in","r",stdin);
freopen("fruit.out","w",stdout);
scanf("%d%d",&n,&k);
int is=;
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
if(!w[i]) is=;
}
for(int i=;i<n;i++) add(); vis[]=;
dfs(w[],,);
if(!is) ans--;
cout<<ans;
return ;
}

0分

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const LL P= 1e9+;
const int N=;
int n,k;
int a[N];
int h[N],nex[N*],to[N*],cnt;
LL f[N][N];
int x,y;
void add()
{
scanf("%d%d",&x,&y);
to[++cnt]=y,nex[cnt]=h[x],h[x]=cnt;
to[++cnt]=x,nex[cnt]=h[y],h[y]=cnt;
}
int dfs(int x,int fa)
{
int sum=,tmp;
for(int i=h[x];i;i=nex[i])
{
if(to[i]==fa) continue;
for(int j=;j<=n-a[to[i]];j++)
f[to[i]][j+a[to[i]]]=f[x][j];
tmp=dfs(to[i],x);
for(int j=;j<=n;j++)
f[x][j]=(f[x][j]*(<<(tmp-))+f[to[i]][j])%P;
sum+=tmp;
}
return sum;
}
int main()
{
freopen("d.in","r",stdin);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<n;i++) add(); f[][a[]]=;
dfs(,);
printf("%lld",(f[][k]));
}

树上dp

说到T3我就不得不吐槽一下,我投入了整套题考试总时间中超过一半的时间,结果0分。遗憾啊。

搜索 搜重了,不知道怎么去重。

正解是个背包(我没看出来。。。),f[i][j]表示在i节点及其子树中拿j个果子的方案数,。

转移的话先遍历子节点,再根据已有信息更新其他字节点,和其父节点。

  dp[x][j] = ((1<<(tmp-1) * dp[x][j] % mod + dp[son][j])% mod

(除了直接相连的边必须断掉之外,其他边怎样都行,2^n 种状态。

Day5下的更多相关文章

  1. python基础六

    模块 1.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻辑上 ...

  2. 【python自动化第五篇:python入门进阶】

    今天内容: 模块的定义 导入方法 import的本质 导入优化 模块分类 模块介绍 一.模块定义: 用来在逻辑上组织python代码(变量,函数,逻辑,类):本质就是为了实现一个功能(就是以.py结尾 ...

  3. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  4. Kakfa揭秘 Day5 SocketServer下的NIO

    Kakfa揭秘 Day5 SocketServer下的NIO 整个Kafka底层都是基于NIO来进行开发的,这种消息机制可以达到弱耦合的效果,同时在磁盘有很多数据时,会非常的高效,在gc方面有非常大的 ...

  5. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  6. python笔记 - day5

    python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...

  7. python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理

    python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...

  8. Catalyst揭秘 Day5 optimizer解析

    Catalyst揭秘 Day5 optimizer解析 Optimizer是目前为止中catalyst中最重要的部分.主要作用是把analyzed logicalPlan变成optimized Log ...

  9. Spark Streaming揭秘 Day5 初步贯通源码

    Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...

随机推荐

  1. java 获取前几天时间

    java   获取前几天时间 一.toLocaleString()函数过时: //当前时间   Date endDate=new Date();   String endTime=endDate.to ...

  2. namespace/symbol/:keyword/::keyword in Clojure

    此文已由作者张佃鹏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.关键字(:keyword/::keyword):   最近在学习使用clojure.spec(验证数据的 ...

  3. Docker-教程(一)CentOS Docker 安装

    Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...

  4. mybatis新增对象自动生成uuid方案

    mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写 ...

  5. 个人JS体系完善(一)

    个人JS体系整理(一) 一. 原型 JS每声明一个Function,都有Prototype原型,Prototype原型是函数的一个默认属性,在函数的创建过程中由JS编译器自动添加,也就是说每当生产一个 ...

  6. TensorFlow创建变量

    1 使用tf.Variable函数创建变量 tf.Variable(initial_value=None,trainable=True,collections=None,validate_shape= ...

  7. 读懂sql_trace

    TKPROF: Release 11.2.0.1.0 - Development on 星期一 11月 3 21:39:41 2014 Copyright (c) 1982, 2009, Oracle ...

  8. sql_trace基本用法

    sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句. 一.概述:    SQL_TRACE是Oracle的一个非常强大的工 ...

  9. 7、OpenCV Python 高斯模糊

    __author__ = "WSX" import cv2 as cv import numpy as np #高斯模糊 基于权重(卷积) #高斯模糊 去燥效果很好 #高斯模糊 d ...

  10. 老男孩Day6作业:计算器

    作业需求: 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) ...