Day5下
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下的更多相关文章
- python基础六
模块 1.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻辑上 ...
- 【python自动化第五篇:python入门进阶】
今天内容: 模块的定义 导入方法 import的本质 导入优化 模块分类 模块介绍 一.模块定义: 用来在逻辑上组织python代码(变量,函数,逻辑,类):本质就是为了实现一个功能(就是以.py结尾 ...
- C++程序结构---1
C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...
- Kakfa揭秘 Day5 SocketServer下的NIO
Kakfa揭秘 Day5 SocketServer下的NIO 整个Kafka底层都是基于NIO来进行开发的,这种消息机制可以达到弱耦合的效果,同时在磁盘有很多数据时,会非常的高效,在gc方面有非常大的 ...
- Python学习记录day5
title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...
- python笔记 - day5
python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...
- python_way ,day5 模块,模块3 ,双层装饰器,字符串格式化,生成器,递归,模块倒入,第三方模块倒入,序列化反序列化,日志处理
python_way.day5 1.模块3 time,datetime, json,pickle 2.双层装饰器 3.字符串格式化 4.生成器 5.递归 6.模块倒入 7.第三方模块倒入 8.序列化反 ...
- Catalyst揭秘 Day5 optimizer解析
Catalyst揭秘 Day5 optimizer解析 Optimizer是目前为止中catalyst中最重要的部分.主要作用是把analyzed logicalPlan变成optimized Log ...
- Spark Streaming揭秘 Day5 初步贯通源码
Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...
随机推荐
- UWP&WP8.1 附加属性 和WebView的NavigateToString方法XAML绑定方法
附加属性,即为添加一个没有的属性的. 使用方法和依赖属性相似,个人理解就是特殊形式的依赖属性. 经常的用处,以一个简单的来说,比如一个控件的某一个属性我们想在XAML中给其绑定数据.但是我们在XAML ...
- upper_bound下确界
//uppper_bound上确界找出首个大于某值的元素 #include<algorithm> #include<iostream> using namespace std; ...
- new types may not be defined in a return type(c++语言编译错误,处理)
在写程序的时候,定义类时要在大括号后面加上: class Point{ public: Point(int a,int b); Point(const Point &p); int getx( ...
- Python Flask-web表单
Flask-WTF扩展可以把处理web表单的过程变成一种愉悦的体验. 一.跨站请求伪造保护 默认情况下,Flask-WTF能够保护所有表单免受跨站请求伪造的攻击.恶意网站把请求发送到被攻击者已登录的网 ...
- sublime安装插件autoprefixer
安装插件autoprefixer步骤: 1.确保Node.js已经安装,未安装请 点击 这里>> 2.下载autoprefixer插件 https://github.com/sindres ...
- [转]关于TDD、BDD和DDD的一些看法
在实际的项目中,我们可能随时面对各种不同的需求,它的各个方面的要素决定了我们所采用的开发模式. 比如,它的复杂度如何?所有的需求是否足够清晰?开发人员对相关的业务是否足够了解?项目的工期是否合理?种种 ...
- C++11 特性:成员函数引用限定 (Reference qualifier)
学了这么多年C++今天拜读scott meyes的more effective cpp第一次看到这种写法... 引用限定可以让成员函数只能被左值对象调用或者只能被右值对象调用: #include &l ...
- linux线程切换和进程切换
进程切换分两步: 1.切换页目录以使用新的地址空间 2.切换内核栈和硬件上下文 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的. ...
- atcoder 2643 切比雪夫最小生成树
There are N towns on a plane. The i-th town is located at the coordinates (xi,yi). There may be more ...
- [ZJOI2008]生日聚会 BZOJ1037 dp
题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: 对于任意连续 ...