BZOJ3547 : [ONTAK2010]Matchings
树形DP
f[i][0]表示不向下连边的最大匹配数
f[i][1]表示向下连一条边的最大匹配数
h[][]表示对应的方案数
为了防止爆栈用BFS
为了防止MLE:
1.数组循环利用,比如存边的数组在存完边后可以用来当dp数组
2.BFS时判断哪些点已经走过的bool数组改成bitset
3.能不开数组就不开数组,如前缀积
4.对于数值不超过n的数组,改成手写的3个unsigned char组合而成的数据类型,可以压缩1/4内存
5.记录方案的数组只要开int,计算时强制转化成long long
压了好久内存,终于从77M压到了31M…我发现bool占用空间居然和char是一样的!结构体占用内存是按照里面最大的那种数据类型为基准计算的。
- #include<cstdio>
- #include<bitset>
- typedef long long ll;
- const int N=1500001;
- int n,m,i,j,x,y,g[N],v[N<<1],ed,head,tail,maxv,pre,now,t0,t1;
- std::bitset<N>in;
- struct Num{
- unsigned char a,b,c;
- Num(){a=b=c=0;}
- Num(int x){a=x&255,x>>=8,b=x&255,c=x>>8;}
- }nxt[N<<1],q[N];
- inline int Real(Num x){return (int)x.a|(int)x.b<<8|(int)x.c<<16;}
- inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
- inline void add(int x,int y){v[++ed]=y;nxt[ed]=Num(g[x]);g[x]=ed;}
- inline ll mul(ll a,ll b){return a*b%m;}
- inline void max(int b){if(maxv<b)maxv=b;}
- int main(){
- read(n);
- for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
- read(m);
- in[Real(q[head=tail=1]=Num(1))]=1;
- while(head<=tail)for(i=g[x=Real(q[head++])],g[x]=tail+1;i;i=Real(nxt[i]))if(!in[v[i]])in[Real(q[++tail]=Num(v[i]))]=1;
- for(i=1;i<=n*2;i++)nxt[i]=Num(v[i]=0);
- for(i=n;i;i--){
- v[x=Real(q[i])]=1;
- if(g[x]>g[Real(q[i+1])]-1)continue;
- maxv=-N;head=g[x];tail=g[Real(q[i+1])]-1;now=0;
- for(j=head;j<=tail;j++){
- y=Real(q[j]),t0=Real(nxt[y]),t1=Real(nxt[y+n]);
- if(t0>t1){
- now+=t0;
- v[x]=mul(v[x],v[y]);
- v[y+n]=v[y];
- max(0);
- }else if(t0==t1){
- now+=t0;
- v[x]=mul(v[x],v[y]+v[y+n]);
- v[y+n]=(v[y]+v[y+n])%m;
- max(0);
- }else{
- now+=t1;
- v[x]=mul(v[x],v[y+n]);
- max(t0-t1);
- }
- g[y]=v[y+n];
- }
- nxt[x]=Num(now);now+=maxv+1;
- nxt[x+n]=Num(now);
- pre=g[Real(q[tail+1])]=1;
- for(j=tail-1;j>=head;j--)g[Real(q[j])]=mul(g[Real(q[j])],g[Real(q[j+1])]);
- for(j=head;j<=tail;j++){
- y=Real(q[j]),t0=Real(nxt[y]),t1=Real(nxt[y+n]);
- if(t0>=t1){
- if(maxv==0)v[x+n]=(v[x+n]+mul(mul(pre,g[Real(q[j+1])]),v[y]))%m;
- }else{
- if(maxv==t0-t1)v[x+n]=(v[x+n]+mul(mul(pre,g[Real(q[j+1])]),v[y]))%m;
- }
- pre=mul(pre,v[y+n]);
- }
- }
- if(Real(nxt[1])>Real(nxt[1+n]))printf("%d\n%d",Real(nxt[1]),v[1]%m);
- else if(Real(nxt[1])==Real(nxt[1+n]))printf("%d\n%d",Real(nxt[1]),(v[1]+v[1+n])%m);
- else printf("%d\n%d",Real(nxt[1+n]),v[1+n]%m);
- return 0;
- }
BZOJ3547 : [ONTAK2010]Matchings的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [ACM_动态规划] ZOJ 1425 Crossed Matchings(交叉最大匹配 动态规划)
Description There are two rows of positive integer numbers. We can draw one line segment between any ...
- 【BZOJ】【3550】【ONTAK2010】Vacation
网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...
- BZOJ3550: [ONTAK2010]Vacation
3550: [ONTAK2010]Vacation Time Limit: 10 Sec Memory Limit: 96 MBSubmit: 91 Solved: 71[Submit][Stat ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- POJ 1692 Crossed Matchings(DP)
Description There are two rows of positive integer numbers. We can draw one line segment between any ...
- BZOJ 3544: [ONTAK2010]Creative Accounting( BST )
题意 : 一段序列 , 求一段子序列和取余 M 的最大值 其实是一道水题... 前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) ...
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
随机推荐
- HDU 1285 拓普排序 基本模板例题 确定比赛名次
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- MySql 插入数据中文乱码
在数据库连接URL后加上characterEncoding=UTF-8 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ssm ...
- Python字符串与数字互转,数字格式化
# -*- coding: gbk -*- import re #将数字格式化为带三位数逗号的字符串 def formatNumber(number): numStr='%d'%number form ...
- 《ASP.NET1200例》<ItemTemplate>标签在html里面有什么具体的作用
严格的来说 <ItemTemplate> 在html中无意义,他只是针对诸如 Repeater.DataList.GridView中的一个模板 至于里面的含义,你可以这样想,既然Repea ...
- Remove Duplicates from Sorted List | & ||
Remove Duplicates from Sorted List I Given a sorted linked list, delete all duplicates such that eac ...
- Java for LeetCode 077 Combinations
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
- ShortestPath:Silver Cow Party(POJ 3268)
牛的聚会 题目大意:一群牛在一块农田的不同的点,现在他们都要去到同一个地方开会,然后现在从那个地方回到原来的位置,点与点之间的连线都是单向的,并且通过一个路径需要一定时间,问你现在哪只牛需要最多的时间 ...
- protostuff简单应用
protobuf是谷歌推出的与语言无关.平台无关的通信协议,一个对象经过protobuf序列化后将变成二进制格式的数据,所以他可读性差,但换来的是占用空间小,速度快.居网友测试,它的序列化效率是xml ...
- mysql多实例(个人的情况,不是大众的)里面有配置好的脚本+主从复制
[root@DB-S ~]# ll /usr/local/|grep mysql lrwxrwxrwx. 1 root root 21 Jun 14 01:52 mysql -> /alidat ...
- CI中写原生SQL(封装查询)
封装查询 封装,通过让系统为你组装各个查询语句,能够简化你的查询语法.参加下面的范例: $sql = "SELECT * FROM some_table WHERE id = ? AND s ...