清北考前刷题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 ...
随机推荐
- fd最大值和限制
fd的数量决定了fd的最大值 在Linux下,系统全部能够打开的fd总数为: /proc/sys/fs/file-max,取决于内存 The file-max file /proc/sys/fs/fi ...
- 593. Valid Square
Problem statement: Given the coordinates of four points in 2D space, return whether the four points ...
- node.js 读取文件--createReadStream
createReadStream 是fs模块里面读流的一个方法 这个方法基于fs模块的,所以我们先要引进fs模块 let fs=require("fs"); createReadS ...
- android开发里跳过的坑-android studio 错误 Could not find junit:junit:4.12
在导入一个新项目时,出现错误Could not find junit:junit:4.12,网上大多是说缺少junit的jar包,但我查看了安装目录下是有jnuit包的,并且新建的项目都没有问题.几经 ...
- Spring Cloud(5):Hystrix的使用
熔断:类似生活中的保险丝,电流过大就会熔断 降级:类似生活中的旅行,行李箱只有那么大,所以要抛弃一些非必需的物品 熔断降级应用: 某宝双十一商品下单,用户量巨大,于是考虑抛弃相关商品推荐等模块,确保该 ...
- html5视频播放器 一 (改写默认样式)
一个项目用到了html5视频播放器,于是就写了一个,走了很多坑,例如在chrome中加载视频出现加载异常等 先看看效果 是不是感觉换不错,以下是我播放器改写样式的布局. <!DOCTYPE ht ...
- MySQL JDBC URL参数(转)
MySQL的 JDBC URL格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] » [?propertyName1][=prope ...
- Vue.js组件的通信之父组件向子父组件的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Thread.run方法是同步方法
Thread.run方法是同步方法, 线程: package com.stono.thread.page005; public class MyThread extends Thread { @Ove ...
- HDU 5371 Manacher
点击打开链接 题意:给定一串数字.求最长的一段连续的数字,将它平均分为三段.满足第一段和第二段是回文的.第一段和第三段相等 思路:第一段和第二段是回文的.那么第二段和第三段也是回文的,将数列进行Man ...