Vijos p1892 树上的最大匹配 树形DP+计数 被卡常我有特殊技巧heheda
此题需要手动开栈:
int size=<<; //256MB
char *p=(char*)malloc(size)+size;
__asm__("movl %0, %%esp\n" :: "r"(p));
还需要卡评测机←十分的神
卡了30多次评测机终于屈服了,一开始我盲目乱提交,总是T,后来上网找了一下解决卡常数方法,如下:
没错,从那之后我提交就在程序最后加// orz ...,把人差不多都%了个遍,但都是90分,%charge时只是80分,但当我%马神(Godder)时成功AC!所以以后被卡常时就%%Godder,说不定就能AC。OI隐藏技能
以下是我的ACcode,重点在倒数第二行,保我AC的那一行
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
inline const int max(const int &a,const int &b){return a>b?a:b;}
inline const int min(const int &a,const int &b){return a<b?a:b;}
const int N=;
struct charge{
int nxt,to;
}e[N<<];
int cnt=,point[N],r[N],sr[N],et[N],f[N][];
long long M,g[N][];
void read(int &sum)
{
char c=getchar();sum=;
while (c<''||c>'') c=getchar();
while (''<=c&&c<='') sum=sum*+c-,c=getchar();
}
void insect(int x,int y){e[++cnt].nxt=point[x];point[x]=cnt;e[cnt].to=y;}
void dp(int x,int fa)
{
long long tp; int mx,j,sz=;
g[x][]=;
for (int i=point[x];i;i=e[i].nxt) if (e[i].to!=fa)
{
j=e[i].to;
dp(j,x); tp=;
mx=max(f[j][],f[j][]); f[x][]+=mx;
if (f[j][]==mx) tp=g[j][];
if (f[j][]==mx) tp+=g[j][];
g[x][]=(g[x][]*tp)%M;
}
for (int i=point[x];i;i=e[i].nxt)
if (e[i].to!=fa) et[++sz]=e[i].to;
r[sz+]=; sr[sz+]=;
for3 (i,sz,)
{
mx=max(f[et[i]][],f[et[i]][]);
r[i]=r[i+]+mx;
tp=;
if (f[et[i]][]==mx) tp=g[et[i]][];
if (f[et[i]][]==mx) tp+=g[et[i]][];
sr[i]=(sr[i+]*tp)%M;
}
long long sl=; int l=;
for1 (i,,sz)
{
mx=l+r[i+]+f[et[i]][]+;
if (mx>f[x][])
{
f[x][]=mx;
g[x][]=((sl*sr[i+])%M*g[et[i]][])%M;
}
else if (mx==f[x][])
g[x][]=(g[x][]+(((sl*sr[i+])%M*g[et[i]][])%M))%M;
mx=max(f[et[i]][],f[et[i]][]);
l+=mx; tp=;
if (f[et[i]][]==mx) tp=g[et[i]][];
if (f[et[i]][]==mx) tp+=g[et[i]][];
sl=(sl*tp)%M;
}
}
void outit()
{
int mx=max(f[][],f[][]),ans=;
if (mx==f[][]) ans=g[][];
if (mx==f[][]) ans+=g[][];
printf("%d\n%lld\n",mx,ans%M);
}
int main()
{
int size=<<; //256MB
char *p=(char*)malloc(size)+size;
__asm__("movl %0, %%esp\n" :: "r"(p));
memset(point,,sizeof(point));
memset(f,,sizeof(f));
memset(g,,sizeof(g));
int n,i,x,y;
read(n);
for2 (i,,n)
{
read(x); read(y);
insect(x,y); insect(y,x);
}
scanf("%lld\n",&M);
dp(,-);
outit();
return ;
// orz Godder
}
然后就行了。
Vijos p1892 树上的最大匹配 树形DP+计数 被卡常我有特殊技巧heheda的更多相关文章
- 【vijos】1770 大内密探(树形dp+计数)
https://vijos.org/p/1770 不重不漏地设计状态才能正确的计数QAQ 虽然可能最优化是正确的,但是不能保证状态不相交就是作死.... 之前设的状态错了... 应该设 f[i][0] ...
- BZOJ_4033_[HAOI2015]树上染色_树形DP
BZOJ_4033_[HAOI2015]树上染色_树形DP Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的 ...
- 2021.07.17 P3177 树上染色(树形DP)
2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...
- 【vijos】1892 树上的最大匹配(树形dp+计数)
https://vijos.org/p/1892 这个必须得卡评测机+手动开栈才能卡过QAQ 手动开栈我百度的... int size=256<<20; //256MB char *p=( ...
- Vijos p1770 大内密探 树形DP+计数
4天终于做出来了,没错我就是这么蒟蒻.教训还是很多的. 建议大家以后编树形DP不要用记忆化搜索,回溯转移状态个人感觉更有条理性. 大神题解传送门 by iwtwiioi 我的题解大家可以看注释&quo ...
- 树上的等差数列 [树形dp]
树上的等差数列 题目描述 给定一棵包含 \(N\) 个节点的无根树,节点编号 \(1\to N\) .其中每个节点都具有一个权值,第 \(i\) 个节点的权值是 \(A_i\) . 小 \(Hi\) ...
- [vijos 1642]班长的任务 [树形dp]
背景 十八居士的毕业典礼(1) 描述 福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和 ...
- 【BZOJ4033】[HAOI2015] 树上染色(树形DP)
点此看题面 大致题意: 给你一棵点数为N的带权树,要你在这棵树中选择K个点染成黑色,并将其他的N-K个点染成白色.要求你求出黑点两两之间的距离加上白点两两之间距离的和的最大值. 树形\(DP\) 这道 ...
- Codeforces Round #277 (Div. 2)D(树形DP计数类)
D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...
随机推荐
- NOIP2008普及组传球游戏(动态规划)——yhx
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...
- IOS Orientation, 想怎么转就怎么转~~~
此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. 博客: http://www.cnblogs.com/jhzhu 邮箱: ...
- js/jquery判断浏览器的方法总结
JS获取浏览器信息浏览器代码名称:navigator.appCodeName浏览器名称:navigator.appName浏览器版本号:navigator.appVersion对Java的支持:nav ...
- Debian安装中文输入法
简单暴力: apt-get install ibus-pinyin 你也可以通过GUI下面到Synaptic Package Manager里面选中ibus-pinyin进行安装 安装完成后重启计算机 ...
- ZOJ 3659 & HDU 4424 Conquer a New Region (并查集)
这题要用到一点贪心的思想,因为一个点到另一个点的运载能力决定于其间的边的最小权值,所以先把线段按权值从大到小排个序,每次加的边都比以前小,然后合并集合时,比较 x = findset(a) 做根或 y ...
- <转>如何进行code review
转自: http://pm.readthedocs.org/zh_CN/latest/codereview/howto.html 如何进行code review? code reivew是保障代码质量 ...
- iOS原生地图开发详解
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
- 在Function对象上扩展method方法
;(function() { /** * 在Function对象上扩展method方法 * @param {String} name 扩展的方法名称 * @param {Function} callb ...
- GSON
{ "data": [ { "children": [ { "id": 10007, "title": "北京 ...
- 20135220谈愈敏Linux Book_3
第3章 进程管理 进程是Unix操作系统抽象概念中最基本的一种,进程管理是操作系统的心脏所在. 3.1 进程 进程:处于执行期的程序以及相关的资源的总称. 线程:在进程中活动的对象,拥有独立的程序计数 ...