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 ...
随机推荐
- 实习小记-python 内置函数__eq__函数引发的探索
乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, other): # 不论发生什么,只要有==做比较,就返回True ... ...
- Codeforces Round #270 D Design Tutorial: Inverse the Problem --MST + DFS
题意:给出一个距离矩阵,问是不是一颗正确的带权树. 解法:先按找距离矩阵建一颗最小生成树,因为给出的距离都是最短的点间距离,然后再对每个点跑dfs得出应该的dis[][],再对比dis和原来的mp是否 ...
- zstu-3769 数回文子串
思路:用manacher求出每个位置的半径,相加即可. 代码:[rad[i]/2]即i这个位置的回文半径,添加的'#'代表长度为偶数的串. #include<stdio.h> #inclu ...
- uGUI练习(五) Draggable Object
练习目标 学习制作一个可拖动的UI 一.步骤 监听UI的Drag事件,需要我们写一点点的代码. 1.创建一个Panel ,设置size为(100,100) 2.创建DraggableObjectSce ...
- QTP学习一添加默认的注释及调用外部vbs文件
一.添加默认注释 1.新建一个TXT文档,将要添加的注释写在文档中 2.再将文档名改为:ActionTemplate.mst 3.将文件放到QTP安装目录(默认为:C:\Program Files\H ...
- Fitnesse初体验
FitNesse是一套软件开发协作工具 FitNesse是帮助大家加强软件开发过程中的协作的工具.能够让客户.测试人员和开发人员了解软件要做成什么样,帮助建议软件最终是否达到了设计初衷. 什么是Fit ...
- 创建租房网House脚本
USE MASTER GO EXEC XP_CMDSHELL 'MKDIR E:\HOUSE1' GO SET NOCOUNT ON----不显示影响行数 IF EXISTS(SELECT * FRO ...
- Android Studio系列教程三--快捷键
Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...
- jquery中的get和set
jquery中通过参数的个数来判断是get方法还是set方法: css: function(name, value ) { return value !== undefined ? jQuery.st ...
- log4net 日志跟踪程序
Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版.我们可以控制日志信息的输出目的地.Log4net中定义了多种日志信息输出模式. 在做项目的时候令我最头疼的是在程序 ...