/*
(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. Android : reletive layout

    在兄弟的上下左右: android:layout_toRightOf="@id/btn1"/> android:layout_toLeftOf="@id/img1& ...

  2. CodeForcesGym 100517H Hentium Scheduling

    Hentium Scheduling Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  3. mvc 下 使用kindeditor 配置信息

    先去下载: http://code.google.com/p/kindeditor/downloads/list引用: LitJSON.dll文件<script src="~/kind ...

  4. HDU 2647 逆向拓扑排序

    令每一个员工都有一个自己的等级level[i] , 员工等级越高,那么工资越高,为了使发的钱尽可能少,所以每一级只增加一单位的钱 输入a b表示a等级高于b,那么我们反向添加边,令b—>a那么i ...

  5. 【bzoj3505】[Cqoi2014]数三角形

    [bzoj3505][Cqoi2014]数三角形 2014年5月15日3,5230 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4×4的网格上的一个三角 ...

  6. cdq分治入门--BZOJ3262: 陌上花开

    n<=100000个人,每个人三个属性Ai,Bi,Ci,一个人i的等级为Ai>=Aj,Bi>=Bj,Ci>=Cj的人数,求每个等级有多少人. 裸的三维偏序.按照常规思路,一维排 ...

  7. PHP PDO使用

    PHP操作MySQL数据库方式有三种: *1. mysql 最原始的.纯过程化的 如连接: mysql_connect(主机名,账号,密码); 2. mysqli 改进版的.兼容过程化和面向对象化操作 ...

  8. Codeforces 651B Beautiful Paintings【贪心】

    题意: 给定序列,重新排序,使严格上升的子序列最多.求这些子序列总长度. 分析: 贪心,统计每个元素出现次数,每次从剩余的小的开始抽到大的,直到不再剩余元素. 代码: #include<iost ...

  9. openstack setup demo Enviroment

    Enviroment 本文包含以下部分. Host networking Network Time Protocol (NTP) OpenStack packages SQL database NoS ...

  10. AIM Tech R3 div2 E Centroid

    思路很明显了,假设是点x,则看它的子树中是否有大于n/2的,如果有,则在该子树中剪去它可以剪的且小于n/2的,接到点x上. 则统计出在以x点为根的子树中,它的各子树可以剪去的且小于n/2的最大子子树. ...