TC SRM 585

转载请注明出处,谢谢http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents    by---cxlove

DIV 2 1000PT  EnclosingTriangleColorful

问有多少个三角形包含了所有的黑色的点

先是两两枚举出所有点对,判断所有的黑点是否在同一侧

然后枚举所有三角形,O(1)判断

预处理O(m*m*n),枚举O(m*m*m)

const int N = 305;
bool upleft[N][N],upright[N][N],downleft[N][N],downright[N][N];
bool updown_toleft[N][N],updown_toright[N][N],leftright_toup[N][N],leftright_todown[N][N];
class EnclosingTriangleColorful {
public:
int xmul(int x0,int y0,int x1,int y1,int x2,int y2){
	return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
}
int getNumber(int m, vector <int> x, vector <int> y) {
	int n=x.size();
	for(int i=1;i<m;i++){
		for(int j=1;j<m;j++){
			bool f1=true,f2=true;
			for(int k=0;k<n;k++){
				if(xmul(i,m,0,j,x[k],y[k])<0)
					f1=false;
				if(xmul(i,m,m,j,x[k],y[k])>0)
					f2=false;
			}
			upleft[i][j]=f1;upright[i][j]=f2;
		}
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<m;j++){
			bool f1=true,f2=true;
			for(int k=0;k<n;k++){
				if(xmul(i,0,0,j,x[k],y[k])>0)
					f1=false;
				if(xmul(i,0,m,j,x[k],y[k])<0)
					f2=false;
			}
			downleft[i][j]=f1;downright[i][j]=f2;
		}
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<m;j++){
			bool f1=true,f2=true;
			for(int k=0;k<n;k++){
				if(xmul(i,m,j,0,x[k],y[k])<0)
					f1=false;
				if(xmul(i,m,j,0,x[k],y[k])>0)
					f2=false;
			}
			updown_toright[i][j]=f1;updown_toleft[i][j]=f2;
		}
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<m;j++){
			bool f1=true,f2=true;;
			for(int k=0;k<n;k++){
				if(xmul(0,i,m,j,x[k],y[k])<0)
					f1=false;
				if(xmul(0,i,m,j,x[k],y[k])>0)
					f2=false;
			}
			leftright_toup[i][j]=f1;leftright_todown[i][j]=f2;
		}
	}
	int ans=0;
	for(int i=1;i<m;i++)  //up
		for(int j=1;j<m;j++){   //left
			for(int k=1;k<m;k++){  //right
				if(upleft[i][j]&&upright[i][k]&&leftright_toup[j][k]){
					// cout<<i<<" "<<j<<" "<<k<<" "<<leftright[j][k]<<endl;
					ans++;
				}
			}
		}
	for(int i=1;i<m;i++)  //up
		for(int j=1;j<m;j++){   //down
			for(int k=1;k<m;k++){  //right
				if(updown_toright[i][j]&&upright[i][k]&&downright[j][k]){
					// cout<<i<<" "<<j<<" "<<k<<endl;
					ans++;
				}
			}
		}
	for(int i=1;i<m;i++)  //up
		for(int j=1;j<m;j++){   //left
			for(int k=1;k<m;k++){  //down
				if(upleft[i][j]&&updown_toleft[i][k]&&downleft[k][j]){
					// cout<<i<<" "<<j<<" "<<k<<endl;
					ans++;
				}
			}
		}
	for(int i=1;i<m;i++)  //down
		for(int j=1;j<m;j++){   //left
			for(int k=1;k<m;k++){  //right
				if(downleft[i][j]&&downright[i][k]&&leftright_todown[j][k]){
					// cout<<i<<" "<<j<<" "<<k<<endl;
					ans++;
				}
			}
		}
	return ans;
}


};

DIV1 250 PT TrafficCongestion

一棵满二叉树,问有多少条不相交的路径,遍历所有的点

观察奇偶的最优解,得到递推式,两个奇的合成偶的,无法合并原来的路径,还得单独考虑根,所以是两倍加1

两个偶的,有一条路径可以合并,所以是两倍减1

比赛的时候。。。没考虑到0的情况。。。23333

int dp[1000005];
class TrafficCongestion {
public:
int theMinCars(int treeHeight) {
    dp[0]=1;
    for(int i=1;i<=treeHeight;i++)
    	if(i&1) dp[i]=(dp[i-1]*2-1)%MOD;
    else dp[i]=(dp[i-1]*2+1)%MOD;
    return dp[treeHeight];
}


};

DIV1 500PT LISNumber

从大到小插入到序列当中,dp[i][j]表示考虑了i种数,目前LISnumber为j的数目。

那么考虑i-1的时候,有cnt[i-1]个这样的数。

如果新增了k个lisnumber。那么剩下的cnt[i-1]-k个数插入进去是没有产生lisnumber的。

只要插入点在原来的lis起点的前面,才不会新增。

也就是在原来的j个lis前面选出cnt[i-1]-k个位置,插入这些数,不产生lisnumber。

剩下的k个数,插入是要新增lisnumber的。位置包括之前的那cnt[i-1]-k个位置,序列的末端以及每个lis的中间sum-t。

这一部分转化为k个相同的物品放入到cnt[i-1]-k+1+sum-t个不同的容器中的方案数,DP解决。

const int MOD = 1000000007;
LL c[40*40][40*40];
LL dp[40][1300];
LL a[40*40][40];
class LISNumber {
public:
	LL PowMod(LL a,LL b){
		LL ret=1;
		while(b){
			if(b&1) ret=((LL)ret*a)%MOD;
		    a=((LL)a*a)%MOD;
			b>>=1;
		}
		return ret;
	}
	int count(vector <int> cardsnum, int K){
		int n=cardsnum.size();
		memset(dp,0,sizeof(dp));
		memset(a,0,sizeof(a));
		for(int i=1;i<=36*36;i++){
			c[i][0]=c[i][i]=1;
			for(int j=1;j<i;j++)
				c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD;
		}
		a[0][0]=1LL;
		for(int i=0;i<=37*37;i++){
			for(int j=0;j<=37;j++){
				for(int k=0;k<=37&&j+k<=37;k++){
					a[i+1][j+k]=(a[i+1][j+k]+a[i][j])%MOD;
				}
			}
		}
		LL sum=cardsnum[n-1];
		dp[n-1][cardsnum[n-1]]=1LL;
		for(int i=n-2;i>=0;i--){
			for(int j=0;j<=sum&&j<=K;j++){
				if(dp[i+1][j]==0) continue;
				for(int k=0;k<=cardsnum[i]&&j+k<=K;k++){
					if(k+j<cardsnum[i]) continue;
					int t=cardsnum[i]-k;
					LL tmp=((LL)c[j][t]*(LL)a[t+1+(sum-j)][k])%MOD;
					dp[i][j+k]=(dp[i][j+k]+(LL)dp[i+1][j]*tmp)%MOD;
				}
			}
			sum+=cardsnum[i];
		}
		return (int)dp[0][K];
	}


};








<think>我们正在处理用户关于“TC消息广播流程”的查询。根据用户提供的引用内容,我们注意到引用[1]和[2]涉及TCP/UDP和Telnet的紧急方式,引用[3]是关于UART发送函数的代码。这些引用似乎与用户的问题没有直接关联,但我们可以尝试从中提取一些可能有用的概念,例如可靠传输(TCP)、实时性(UDP)和串口通信(UART)。然而,用户的问题是关于“TC消息广播流程”的文字说明。由于引用内容中没有直接关于“TC消息广播流程”的信息,我们需要基于一般知识进行回答。在IT技术领域,“TC”可能有多种含义,例如在通信中可能指“传输控制”(TransmissionControl),在特定协议中可能指“类型代码”(TypeCode)等。但结合用户提到“消息广播流程”,我们推测可能是指网络协议中的某种广播机制,例如在某些网络协议(如CAN总线、Modbus等)中,存在广播消息的流程。考虑到用户没有明确指定具体领域,我们给出一个一般性的解释,并尽可能结合广播消息的通用流程。###TC消息广播流程的文字说明在计算机网络或通信协议中,广播(Broadcast)是指将消息发送给网络中的所有节点的过程。TC(通常可以理解为“传输控制”或“类型代码”,具体取决于上下文)消息广播流程通常包括以下步骤:1.**消息生成**:由发送节点(通常是主节点或控制器)生成需要广播的消息。该消息通常包含特定的标识(如广播地址)和要传输的数据。2.**消息封装**:将生成的消息按照协议规定的格式进行封装。例如,在TCP/IP协议中,广播消息可以使用UDP协议发送到广播地址(如255.255.255.255或子网广播地址);在工业总线协议(如CAN)中,则使用特定的广播标识符。3.**消息发送**:发送节点将封装好的消息发送到网络。在以太网中,广播消息会发送到数据链路层的广播MAC地址(FF:FF:FF:FF:FF:FF);在CAN总线中,消息会发送到总线上,所有节点都会收到。4.**消息传播**:网络设备(如交换机、集线器等)负责将广播消息传播到网络中的所有节点。交换机通常不会转发广播帧到所有端口(除非是ARP请求等),而集线器则会向所有端口转发。5.**消息接收**:网络中的每个节点都会收到广播消息。节点根据消息头部的标识判断是否处理该消息(广播消息通常会被所有节点处理)。6.**消息处理**:节点根据协议规范对广播消息进行解析和处理。例如,在DHCP协议中,客户端会处理DHCP服务器的广播响应;在CAN总线中,节点根据广播消息更新本地数据。7.**确认与重传(可选)**:某些可靠广播协议可能要求接收节点发送确认。如果发送节点未收到所有节点的确认,可能会重传广播消息。但广播通常不要求确认,因为确认风暴会导致网络拥塞。###示例:UDP广播流程以UDP广播为例,具体流程如下:1.发送方创建一个UDP套接字,并设置套接字选项允许广播(`SO_BROADCAST`)。2.发送方将消息发送到目标地址为广播地址(如`255.255.255.255`)和指定端口。3.消息被发送到本地网络的所有设备。4.接收方在指定端口上监听,当收到广播消息时,进行处理。注意:广播消息通常被限制在本地网络内,路由器不会转发广播消息到其他网络。###相关技术-**广播地址**:在IP网络中,广播地址用于向同一子网内所有主机发送数据包。-**多播(组播)**:与广播不同,多播只发送给一组特定的接收者,可以减少网络流量。-**可靠广播协议**:如SRM(ScalableReliableMulticast),用于需要可靠传输的广播场景。###注意事项-广播可能引起网络拥塞,因此应谨慎使用。-在无线网络中,广播可能消耗大量带宽。-安全性:广播消息容易被窃听,因此敏感信息应加密。由于用户的问题比较简短,如果能够提供更多上下文(如具体协议或领域),我们可以给出更精确的解释。§§相关问题§§1.TC消息广播流程中如何保证消息的可靠性?2.广播和多播有什么区别?3.在CAN总线中,TC消息广播流程是怎样的?4.如何防止广播风暴?</think>### TC消息广播流程详解 TC(Traffic Control)消息广播是网络通信中实现流量控制的关键机制,主要用于向网络中的多个节点同步发送控制指令(如拥塞控制、路由调整等)。其核心流程如下: #### 1. **消息生成与封装** 发送端(通常是控制器或服务器)生成TC消息,包含: - **控制指令**(如限速值 $R_{max}$、优先级标志 $P$) - **目标节点列表**(广播地址或组播组) - **校验信息**(如CRC32校验码 $C = \sum_{i=0}^{n} d_i \mod 2^{32}$) 消息封装遵循协议规范(如TCP/IP的广播报文结构[^1])。 #### 2. **广播传输** 发送端通过以下方式分发消息: - **物理层广播**:向子网内所有节点发送数据帧(目标MAC地址为`FF:FF:FF:FF:FF:FF`) - **应用层组播**:使用UDP协议向预定义组播组(如`224.0.0.1`)发送,避免TCP连接开销[^1] - **重传机制**:对关键指令采用有限重传(如最大重试次数 $N=3$) #### 3. **节点接收与处理** 接收节点执行: ```plaintext 1. 校验消息完整性(验证CRC) 2. 解析控制参数(提取 $R_{max}$, $P$ 等) 3. 更新本地配置(如调整发送窗口大小 $W$) 4. 发送确认(ACK)至控制端(可选) ``` #### 4. **异常处理** - **丢包检测**:控制端监控ACK超时($T_{out} = 2 \times RTT$) - **冲突解决**:采用随机退避算法(如二进制指数退避 $T_{backoff} = k \times 2^i$) - **流控干预**:触发紧急模式(Urgent Mode),强制节点丢弃非关键数据[^2] #### 5. **性能优化** - **分层广播**:通过骨干节点转发,减少网络风暴 - **压缩编码**:对重复指令使用差分编码($\Delta P = P_t - P_{t-1}$) - **硬件加速**:利用网卡组播过滤(如IGMP Snooping) > **关键点**:TC广播需平衡可靠性与实时性。UDP广播效率高但不可靠;TCP确保可靠但需维护连接[^1]。工业场景常采用混合模式(如UDP广播+轻量确认)。 --- ### 相关问题 1. TC消息广播中如何避免广播风暴? 2. 实时系统中TC广播的延迟如何计算? 3. 对比TC广播在TCP与UDP协议下的性能差异? 4. 如何设计TC消息的容错机制?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值