点亮

题意

在这里插入图片描述
在这里插入图片描述
题解

对于40%的数据,O(2nn2)O(2^nn^2)O(2nn2)乱整
题目中多次强调:随机得到的树
来来来直接上性质
在这里插入图片描述
众所周知?不存在的

综上,题解的意思是:随机一般是用来暴力骗分,但是这道题就是正解
下面是性质的证明

在这里插入图片描述
在这里插入图片描述
(突然发现自己在疯狂粘题解)

由于这个深度很小,所以我们可以状压
把所有的输入处理到LCA上
然后就可以dp了,d(i,j,k)表示i子树,状态为j,点亮k个
树上背包式的转移即可,注意分类讨论k与(sz+1)/2的关系
由于状态太多,所以干脆在每次操作中枚举状态
就酱吧

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1005;
const int L=13;
const int INF=1<<30;
int n,d[N][N],fa[N][L+2];
int l[N][N],deep[N];
int sz[N],ans,val[N][N][2],sta[N];
struct node{
    int u,v,nxt;
}edge[N*2];
int head[N],mcnt;
void add_edge(int u,int v){
	mcnt++;
	edge[mcnt].u=u;
	edge[mcnt].v=v;
	edge[mcnt].nxt=head[u];
	head[u]=mcnt;
}
void dfs1(int u,int d){
	sz[u]=1,deep[u]=d;
	for(int i=head[u];i;i=edge[i].nxt){
        int v=edge[i].v;
        dfs1(v,d+1);
        sz[u]+=sz[v];
    }
}
int LCA(int u,int v){
	if(deep[u]<deep[v])
        swap(u,v);
	for(int t=L;t>=0;t--)
		if(deep[fa[u][t]]>=deep[v])
            u=fa[u][t];
	if(u==v)
        return u;
	for(int t=L;t>=0;t--)
		if(fa[u][t]!=fa[v][t])
            u=fa[u][t],v=fa[v][t];
	return fa[u][0];
}
void dfs2(int u,int fa,int dep){
	int tmp[N];
	for(int i=0;i<=sz[u];i++)
        d[u][i]=-INF;
	sta[dep]=1,d[u][1]=0;
	for(int i=1;i<=dep;i++)
		if(sta[i])
            d[u][1]+=val[u][i][1];
	if(sz[u]>1){
		d[u][0]=0;
		for(int i=1;i<=dep;i++)
			if(!sta[i])
                d[u][0]+=val[u][i][0];
	}
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].v;
        dfs2(v,u,dep+1);
		for(int i=sz[u];i>=0;i--){
			d[u][i]+=d[v][0];
			for(int j=1;j<=sz[v]&&j<=i;j++)
                d[u][i]=max(d[u][i],d[u][i-j]+d[v][j]);
		}
	}
	memcpy(tmp,d[u],sizeof(d[u]));
	for(int i=0;(i<<1)<sz[u];i++)
        tmp[i]=-INF;
	for(int i=0;i<=sz[u];i++)
        d[u][i]=-INF;
	sta[dep]=0;
	if(sz[u]>1){
		d[u][1]=0;
		for(int i=1;i<=dep;i++)
			if(sta[i])
                d[u][1]+=val[u][i][1];
	}
	d[u][0]=0;
	for(int i=1;i<=dep;i++)
		if(!sta[i])
            d[u][0]+=val[u][i][0];
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].v;
        dfs2(v,u,dep+1);
		for(int i=sz[u];i>=0;i--){
			d[u][i]+=d[v][0];
			for(int j=1;j<=sz[v]&&j<=i;j++)
                d[u][i]=max(d[u][i],d[u][i-j]+d[v][j]);
		}
	}
	for(int i=(sz[u]+1)>>1;i<=sz[u];i++)
        d[u][i]=-INF;
	for(int i=0;i<=sz[u];i++)
        d[u][i]=max(d[u][i],tmp[i]);
}
void Read(int &x){
	char c=getchar();
	int f=1; x=0;
	while((c<'0'||c>'9')&&c!='-')
        c=getchar();
	if(c=='-')
        f=-1,c=getchar();
	while(c>='0'&&c<='9')
        x=x*10+c-'0',c=getchar();
    x*=f;
}
int main()
{
	freopen("light.in","r",stdin);
	freopen("light.out","w",stdout);
	Read(n);
	for(int i=2;i<=n;i++){
        Read(fa[i][0]);
        add_edge(fa[i][0],i);
    }
	dfs1(1,1);
	for(int j=1;j<=L;j++)
		for(int i=1;i<=n;i++)
            fa[i][j]=fa[fa[i][j-1]][j-1];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
            l[i][j]=l[j][i]=LCA(i,j);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j){
				int a,b;
				Read(a);
				Read(b);
				val[i][deep[l[i][j]]][0]+=a;
				val[i][deep[l[i][j]]][1]+=b;
			}
	dfs2(1,0,1);
	for(int i=0;i<=n;i++)
        ans=max(ans,d[1][i]);
	printf("%d\n",ans);
}

在没有明确上下文的情况下,假设用户的问题是关于编程中如何通过循环控制点亮某个元素(例如LED)。以下是几种常见的实现方式和思路: 1. 使用循环依次点亮多个LED 如果目标是按顺序点亮多个LED,可以使用一个数组存储LED的引脚编号,并通过循环逐一设置为高电平(点亮)。 ```python led_pins = [2, 3, 4, 5] # 假设这些引脚连接到LED for pin in led_pins: digitalWrite(pin, HIGH) # 点亮当前LED delay(500) # 每个LED点亮500毫秒 digitalWrite(pin, LOW) # 关闭当前LED ``` 2. 使用循环持续点亮单个LED并切换状态 如果目标是让一个LED闪烁多次,可以使用简单的`for`循环控制点亮与熄灭的次数。 ```python led_pin = 2 for _ in range(5): # 重复5次 digitalWrite(led_pin, HIGH) delay(1000) # 点亮1秒 digitalWrite(led_pin, LOW) delay(1000) # 熄灭1秒 ``` 3. 使用无限循环保持LED常亮 如果需要某个LED始终处于点亮状态,可以通过无限循环将引脚维持在高电平。 ```python led_pin = 2 while True: digitalWrite(led_pin, HIGH) ``` 4. 使用PWM控制LED亮度渐变 在支持PWM(脉宽调制)的硬件上,可通过循环逐步调整亮度,实现呼吸灯效果。 ```python led_pin = 9 for brightness in range(0, 256, 5): # 从暗到亮 analogWrite(led_pin, brightness) delay(30) for brightness in range(255, -1, -5): # 从亮到暗 analogWrite(led_pin, brightness) delay(30) ``` 5. 多个LED同时闪烁 如果希望多个LED同步闪烁,可以在每次循环中同时处理所有LED的状态。 ```python led_pins = [2, 3, 4] for _ in range(3): # 重复3次 for pin in led_pins: digitalWrite(pin, HIGH) delay(500) for pin in led_pins: digitalWrite(pin, LOW) delay(500) ``` 以上方法适用于如Arduino、Raspberry Pi等嵌入式开发平台。具体代码可能需要根据使用的开发环境进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值