/*
(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下午好的更多相关文章

  1. 清北考前刷题day1下午好

    水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...

  2. 清北考前刷题da7下午好

    三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...

  3. 清北考前刷题day3下午好

    /* 可以并查集维护 可以发现,某个联通快出现大于等于2个环,一定无法分配. 有解要么一个环,要么没有环. 一个环时答案等于点数乘2(顺时针或逆时针). 没有环是树,对于一个n个点的树,方案一定有n种 ...

  4. 清北考前刷题day6下午好

    /* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include&l ...

  5. 清北考前刷题day4下午好

    /* 辗转相除,每次计算多出现了几个数. */ #include<iostream> #include<cstdio> #include<cstring> #inc ...

  6. 清北考前刷题day2下午好

    #include<iostream> #include<cstdio> #include<cstring> #include<stack> #defin ...

  7. 清北考前刷题day4早安

      LI /* 没有考虑次大值有大于一个的情况 */ #include<iostream> #include<cstdio> #include<cstring> # ...

  8. 清北考前刷题day7早安

  9. 清北考前刷题day6早安

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

随机推荐

  1. 【转】Asp.net MVC Comet推送

    原文链接:http://www.cnblogs.com/kissdodog/p/4283485.html 一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发 ...

  2. node的express框架,核心第三方模块body-parser 获取我们所有post请求传过来数据

    - 安装 body-parser模块- npm install body-parser -S - 调用- let bodyParser=require('body-parser'); - 设置中间件- ...

  3. cdq分治入门--BZOJ1176: [Balkan2007]Mokia

    对w*w,w<=2000000的矩形,一开始全是0(或一开始全是s),n<=170000个操作,每次操作:矩阵内某点加上一个数,查某一个子矩阵的和,保证修改数<=160000,询问数 ...

  4. 洛谷 P4470 [BJWC2018]售票

    P4470 [BJWC2018]售票 C 市火车站最近出现了一种新式自动售票机.买票时,乘客要先在售票机上输入终点名称.一共有N 处:目的地,随着乘客按顺序输入终点名称的每个字母,候选终点站数目会逐渐 ...

  5. GETTING STARTED WITH THE OTTO JAVASCRIPT INTERPRETER

    原文: https://www.fknsrs.biz/blog/otto-getting-started.html.html GETTING STARTED WITH THE OTTO JAVASCR ...

  6. react 项目实战(十)引入AntDesign组件库

    本篇带你使用 AntDesign 组件库为我们的系统换上产品级的UI! 安装组件库 在项目目录下执行:npm i antd@3.3.0 -S 或 yarn add antd 安装组件包 执行:npm ...

  7. IEDA-maven引用本地jia包

    简单说下为啥用maven引用本地jar包:当在pom文件中配置需要引用了jar的坐标,但是maven引用不了(原因未知情况下),这种情况下就需要找开发提供相关依赖的的jar文件打成一个jar包发送过来 ...

  8. Python开发【面向对象编程】

    一.概述 面向过程:根据业务逻辑从上到下,完成代码: 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可: 面向对象:对函数进行分类和封装. 二.面向对象 1.类.对象.方法.实例 ...

  9. iOS 保存视频AVAssetWriter

    错误的CMTime导致保存的视频无效,比如: frameTime CMTime 1122 600ths of a second value CMTimeValue 1122timescale CMTi ...

  10. easyUI 动态添加窗体

    有一张页面A,在页面开头引用了jquery.easyUI.min.js. 现在想达到这么一种效果,点击页面A的一个按钮,弹出一个easyUI窗体.因为想分模块的原因,这个窗体对应的是另一张页面B.在点 ...