清北考前刷题da5下午好




/*
(4,1)*(3,1)*(2,1)的话1变成2然后一直是2
2变成1然后变成3
3变成1然后变成4
4变成1
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 1007 using namespace std;
int n,m,p,k,ans,cnt,tmp;
int a[N],pos[N];
struct node{
int len,q[N];
}s[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
freopen("rotate.in","r",stdin);
freopen("rotate.out","w",stdout);
n=read();p=read();k=read();
for(int i=;i<=n;i++) a[i]=i,pos[i]=i;
for(int i=p;i>=;i--)
{
s[i].len=read();
for(int j=;j<=s[i].len;j++) s[i].q[j]=read();
}
for(int i=;i<=p;i++)
{
for(int j=;j<=s[i].len;j++)
{
int x=s[i].q[j],y=s[i].q[];
swap(a[pos[x]],a[pos[y]]);
swap(pos[x],pos[y]);
}
}
for(int i=;i<=n;i++) printf("%d ",a[i]);
return ;
}



/*
60线段树
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define mod 1000000007
#define N 1003
#define ll long long using namespace std;
int n,a,b,c,d,ans,cnt;
int And[N][N],Or[N][N];
int s[N];
struct tree{
int l,r,sum1,sum2;
}tr[N<<]; bool cmp(int a,int b){return a>b;} inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void pushup(int k)
{
tr[k].sum1=tr[k<<].sum1 & tr[k<<|].sum1;
tr[k].sum2=tr[k<<].sum2 | tr[k<<|].sum2;
} void build(int k,int l,int r)
{
tr[k].l=l;tr[k].r=r;
if(l==r)
{
tr[k].sum1=read();
tr[k].sum2=tr[k].sum1;
return;
}
int mid=l+r>>;
build(k<<,l,mid);build(k<<|,mid+,r);
pushup(k);
} int query1(int k,int l,int r)
{
if(tr[k].l==l && tr[k].r==r) return tr[k].sum1;
int mid=tr[k].l+tr[k].r>>;
pushup(k);
if(r<=mid) return query1(k<<,l,r);
else if(l>mid) return query1(k<<|,l,r);
else return query1(k<<,l,mid) & query1(k<<|,mid+,r);
} int query2(int k,int l,int r)
{
if(tr[k].l==l && tr[k].r==r) return tr[k].sum2;
int mid=tr[k].l+tr[k].r>>;
pushup(k);
if(r<=mid) return query2(k<<,l,r);
else if(l>mid) return query2(k<<|,l,r);
else return query2(k<<,l,mid) | query2(k<<|,mid+,r);
} int main()
{
freopen("range.in","r",stdin);
freopen("range.out","w",stdout);
n=read();a=read();b=read();c=read();d=read();
build(,,n);
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
And[i][j]=query1(,i,j),Or[i][j]=query2(,i,j);
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
if(And[i][j]<=b && And[i][j]>=a && Or[i][j]<=d && Or[i][j]>=c)
{
ans++;
if(ans>mod) ans-=mod;
}
printf("%d\n",ans);
return ;
}
/*
有单调性
枚举左端点,二分右端点,ST表处理,计算答案。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath> #define N 100007
#define ll long long
#define mod 1000000007 using namespace std;
int n,a,b,c,d,ans;
int st1[N][],st2[N][];
int s[N];ll cnt; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int query1(int l,int r)
{
int len=r-l+,p=log2(len);
return st1[l][p] & st1[r-(<<p)+][p];
} int query2(int l,int r)
{
int len=r-l+,p=log2(len);
return st2[l][p] | st2[r-(<<p)+][p];
} int main()
{
freopen("range.in","r",stdin);
freopen("range.out","w",stdout);
n=read();a=read();b=read();c=read();d=read();
for(int i=;i<=n;i++)
s[i]=read(),st1[i][]=st2[i][]=s[i]; for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
st1[i][j]=st1[i][j-] & st1[i+(<<(j-))][j-],
st2[i][j]=st2[i][j-] | st2[i+(<<(j-))][j-]; int sum1,sum2,L,R,mid;ans=,cnt=;
for(int i=;i<=n;i++)
{
sum1=sum2=s[i];
for(int j=i;j<=n;j++)
{
sum1=query1(i,j);sum2=query2(i,j);
L=j,R=n+;
while(L<=R)
{
mid=L+R>>;
if(query1(i,mid)==sum1 && query2(i,mid)==sum2) ans=mid,L=mid+;
else R=mid-;
}
if(a<=sum1 && sum1<=b && c<=sum2 && sum2<=d) cnt+=ans-j+;j=ans;
}
}
printf("%I64d\n",cnt%mod);
return ;
}



/*
不先考虑k个,1~n先都考虑。
按子树为单位树形dp
f[x][j]表示以x为根的子树有j个果子方案数。
x显然果子必须拿,其他的果子需要分配。
但如果有很多孩子,那么挨个分配会T。
所以考虑树形dp常用策略把子树编号。
考虑孩子的每个前缀分多少,还剩多少。
就是每个前缀的max而不是子集的max。
所以要设计前缀的状态:g[i][j]表示以i为结尾的前缀分j个果子的方案数。
就转化为了背包问题。
但直接转移是n^3的,考虑优化。
可以看出枚举每个前缀是不必要的。
从根节点递归到子节点往上反的时候子节点的状态先继承父节点的状态,然后进行转移。
这样每个点都会从左到右把它儿子的每个前缀计算答案并取max。详见代码。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define mod 1000000007
#define N 1007
#define ll long long using namespace std;
int n,m,ans,cnt;
ll f[N][N],p[N];
int val[N],head[N];
struct edge{
int u,v,net;
}e[N<<]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].net=head[u];head[u]=cnt;
} int dp(int u,int fa)
{
int siz=;
for(int i=head[u];i;i=e[i].net)
{
int v=e[i].v;
if(v==fa) continue;
for(int j=;j<=n-val[v];j++) f[v][j+val[v]]=f[u][j];
int tmp=dp(v,u);
for(int j=;j<=n;j++)
f[u][j]=(p[tmp-]*f[u][j]%mod+f[v][j])%mod;
siz+=tmp;
}return siz;
} int main()
{
int x,y,z;
n=read();m=read();p[]=;
for(int i=;i<=n;i++)p[i]=(p[i-]*)%mod;
for(int i=;i<=n;i++) val[i]=read();
for(int i=;i<n;i++)
{
x=read();y=read();
add(x,y);add(y,x);
}
f[][val[]]=;dp(,);
printf("%d\n",int(f[][m]));
return ;
}
清北考前刷题da5下午好的更多相关文章
- 清北考前刷题day1下午好
水题(water) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...
- 清北考前刷题da7下午好
三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...
- 清北考前刷题day3下午好
/* 可以并查集维护 可以发现,某个联通快出现大于等于2个环,一定无法分配. 有解要么一个环,要么没有环. 一个环时答案等于点数乘2(顺时针或逆时针). 没有环是树,对于一个n个点的树,方案一定有n种 ...
- 清北考前刷题day6下午好
/* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include&l ...
- 清北考前刷题day4下午好
/* 辗转相除,每次计算多出现了几个数. */ #include<iostream> #include<cstdio> #include<cstring> #inc ...
- 清北考前刷题day2下午好
#include<iostream> #include<cstdio> #include<cstring> #include<stack> #defin ...
- 清北考前刷题day4早安
LI /* 没有考虑次大值有大于一个的情况 */ #include<iostream> #include<cstdio> #include<cstring> # ...
- 清北考前刷题day7早安
- 清北考前刷题day6早安
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
随机推荐
- web环境搭建
[服务器] 硬件设备---计算机 软件 [作用] 作为web服务器运行.可以管理web项目 [目录说明] bin :存放各类可以执行文件,如:startup.bat conf:存放各类配置文件,常用配 ...
- 下载Spring4.1.x源码并用IntelliJ IDEA打开-----
下载Spring4.1.x源码并用IntelliJ IDEA打开-------https://blog.csdn.net/boling_cavalry/article/details/79426075 ...
- 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...
- poj 1330lca模板题离线算法
#include<iostream> #include<vector> using namespace std; const int MAX=10001; int pre[MA ...
- [NOIP2005] 普及组 循环
陶陶摘苹果 校门外的树 采药 以上三道都不是重点 循环 题目描述 乐乐是一个聪明而又勤奋好学的孩子.他总喜欢探求事物的规律.一天,他突然对数的正整数次幂产生了兴趣. 众所周知,2的正整数次幂最后一位数 ...
- iOS 自己主动释放手动释放混编
当项目为手动释放时,Build Settings中,Objective-c Automatic Reference Conting 为YES 时,想要手动管理一些文件,在CompileSources中 ...
- Linux学习系列之MySQL备份
MySQL排除表备份 #!/bin/bash #created by 90root #date: 20160809 date_y=$(date +%Y) date_m=$(date +%m) time ...
- NYOJ 298-点的变换(经典矩阵解决点平移、缩放、翻转和旋转)
题目地址:NYOJ 298 思路:该题假设用对每一个点模拟的操作.时间复杂度为O(n+m),结果肯定超时.然而利用矩阵乘法能够在O(m)的时间内把全部的操作合并为一个矩阵,然后每一个点与该矩阵相乘能够 ...
- OpenLayers 3+Geoserver+PostGIS实现点击查询
WebGIS开发中,点击查询是最经常使用的一种查询方式,在ArcGIS api 中.这样的查询叫IdentifyTask,主要作用是前台提交參数.交ArcServer查询分析返回. 本文从开源框架的角 ...
- CentOS 6.4安装Ganglia
samba 1.这里安装的是3.1.7版本,web前端是最新版本,安装前期环境(yum源用的是本地的) yum -y insatll php php-gd rrdtools apr-devel apr ...