[选拔赛2 NOIP2018雅礼集训 Day3 u,v,w]玩个三角形(二维差分),玩个球(状压DP+map),玩个树(树上DP)

文章目录

  • T1:玩个三角形
    • title
    • solution
    • code
  • T2:玩个球
    • title
    • solution
    • code
  • T3:玩个树
    • title
    • solution
    • code

T1:玩个三角形

title

题目描述

考虑一个 n ∗ n 的矩阵 A,初始所有元素均为 0。

执行 q 次如下形式的操作:给定 4 个整数 r, c, l, s,对于每个满足 x ∈ [r, r+l), y ∈ [c, x-r+c] 的元素 (x, y),将权值增加 s。也就是,给一个左上顶点为 (r, c)、直角边长为 l 的下三角区域加上 s。

输出最终矩阵的元素异或和。
输入格式

第一行两个整数 n, q。

接下来 q 行,每行四个整数 r, c, l, s,代表一次操作。
输出格式

输出一行,一个整数,代表答案。
样例
样例输入

10 4
1 1 10 1
5 5 4 4
1 9 4 3
3 3 5 2

样例输出

0

样例解释

1 0 0 0 0 0 0 0 3 0
1 1 0 0 0 0 0 0 3 3
1 1 3 0 0 0 0 0 3 3
1 1 3 3 0 0 0 0 3 3
1 1 3 3 7 0 0 0 0 0
1 1 3 3 7 7 0 0 0 0
1 1 3 3 7 7 7 0 0 0
1 1 1 1 5 5 5 5 0 0
1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1 1

数据范围与提示

对于100%的数据,保证 n ∈ [1, 103],q ∈ [0, 3 ∗ 105],r, c, l ∈ [1, n],s ∈ [1, 109]。

无标题.jpg

solution

考虑用二维树组差分维护,如果是个矩形就是特别简单的了,可惜是个直角三角形
那么就拆一下,用两个二维数组,一个专门维护单列,一个专门维护斜边
在这里插入图片描述

code

#include <cstdio>
#define MAXN 2005
#define ll long long
int n, Q;
ll ans;
ll col[MAXN][MAXN], slope[MAXN][MAXN], matrix[MAXN][MAXN];int main() {scanf( "%d %d", &n, &Q );for( int i = 1, r, c, l, s;i <= Q;i ++ ) {scanf( "%d %d %d %d", &r, &c, &l, &s );col[r][c] += s, col[r + l][c] -= s;slope[r][c + 1] += s, slope[r + l][c + l + 1] -= s;}for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )col[i][j] += col[i - 1][j];for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )slope[i][j] += slope[i - 1][j - 1];for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )matrix[i][j] += matrix[i][j - 1] + col[i][j] - slope[i][j];for( int i = 1;i <= n;i ++ )for( int j = 1;j <= n;j ++ )ans ^= matrix[i][j];printf( "%lld", ans );return 0;
}

T2:玩个球

title

有 n 个球排成一行,每个球的颜色为黑或白。

执行 k 次操作,第 i(1 ≤ i ≤ k) 次操作形式如下:

• 从 [1, n-i+1] 中,等概率随机选择一个整数 x。

• 移除从左往右数的第 x 个球,或从右往左数的第 x 个球(也就是从左往右数的第 n-i+2-x 个)。之后,所有右侧的球的编号减 1。

给定每个球的颜色信息,希望最大化移除的白球数量。

输出在最优策略下,期望的移除白球数量。误差在1e-6范围内,即算正确

输入格式

第一行,两个整数 n, k。 第二行,一个长度为 n、仅由 ‘W’ 和 ‘B’ 组成的字符串,第 i 个字符代表第 i 个球的颜色, ‘W’ 为白色, ‘B’ 为黑色。
输出格式

输出一行,一个浮点数,代表答案。
样例
样例输入1

3 1
BWW

样例输出1

1.0000000000

样例解释1

如果 x = 1,从右侧操作,如果 x = 2 或 3,从左侧操作,均可以移除一个白球。

样例输入2

4 2
WBWB

样例输出2

1.5000000000

数据范围与提示

对于100%的数据,保证 1 ≤ n ≤ 30,0 ≤ k ≤ n
在这里插入图片描述

solution

nnn怎么这么小?!!准定要搞事!!
老子反手就是一个状压,压不死你
在这里插入图片描述


但是仔细一想,2302^{30}230好像逼近intintint极限值
在这里插入图片描述
不要担心,一般这种大数据数组存不下,就找蓝翔技术学校STLSTLSTL,这些容器关键时刻还是不会掉链子的,这里可以采取mapmapmap与数组进行分工合作,数组存不下的就用mapmapmap去存
在这里插入图片描述

这道题仔细一看,就是个披着期望皮的记忆化搜索羊
在这里插入图片描述
为什么呢?很简单,你想嘛~
当后面剩下的颜色状态一样时,操作的概率与期望计算方式与之前肯定是一样的,答案也肯定一样
那我们为什么要傻逼兮兮的怼上去再来一遍??


接下来我将重点讲解代码中贼冗长的一行代码的意思,因为实在是太妙了!!
在这里插入图片描述

int sta1 = sta >> 1 & ~ ( ( 1 << i - 1 ) - 1 ) | sta & ( ( 1 << i - 1 ) - 1 );

如果不熟悉位运算的优先级的,看到这里基本上已经告退了吧哈哈哈哈
接下来让我们加几个括号

int sta1 = ( ( sta >> 1 ) & ( ~ ( ( 1 << ( i - 1 ) ) - 1 ) ) ) | ( sta & ( ( 1 << ( i - 1 ) ) - 1 ) );

我们来一一分析,提前声明因为我的iii是从111开始枚举的,而二进制是从000开始,故要−1-11
如何才能把iii这一个球彻底删掉呢??让我们拭目以待吧!!


( 1 << ( i - 1 ) ) - 1

[0,i)[0,i)[0,i)位每一位都为111然后其余位全为000,好理解,下一个!
在这里插入图片描述


sta >> 1

全体右移一位,第000位丢掉,好理解,下一个!
在这里插入图片描述


~ ( ( 1 << ( i - 1 ) ) - 1 ) )

~ : 一种单目运算符(位运算),对二进制每一位上的数全都进行取反操作,1变0,0变1

在这里插入图片描述


接下来进行结合操作!!吃俺老孙一棒

( ( sta >> 1 ) & ( ~ ( ( 1 << ( i - 1 ) ) - 1 ) ) )

这行语句的目的是保留了[i+1,tot][i+1,tot][i+1,tot]位上的每一个球的状态,即画圈部分
在这里插入图片描述注意sta>>1sta>>1sta>>1整体右移111位后再取&\&&,而我们知道除了[0,i)[0,i)[0,i)其余位置都为111
故而stastasta右移111位后,以iii为分水岭,原来的状态是什么,右移111位的状态亦不变
iii恰好右移成为i−1i-1i1,从i−1i-1i1位开始往右全都是000
刚好把iii给卡掉了!


最后就是上面一堆的状态[0,i)[0,i)[0,i)还是均为000的,此时就需要得到原来这些位置上的状态

sta & ( ( 1 << ( i - 1 ) ) - 1 )

最后两个残缺状态取∣|,即是卡掉iii后的新状态
这是其中一种,另一种同理,不再赘述

code

#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
map < int, double > mp;
int n, k;
char s[40];
double dp[1 << 25];double dfs( int sta, int tot ) {if( tot == n - k ) return 0;if( tot > 24 && mp.find( sta ) != mp.end() ) return mp[sta];if( tot <= 24 && dp[sta] != -1 ) return dp[sta];double sum = 0;for( int i = 1;i <= ( tot >> 1 );i ++ ) {int color1 = ( sta >> ( i - 1 ) ) & 1;int color2 = ( sta >> ( tot - i ) ) & 1;int sta1 = ( sta >> 1 ) & ( ~ ( ( 1 << ( i - 1 ) ) - 1 ) ) | ( sta & ( ( 1 << ( i - 1 ) ) - 1 ) );int sta2 = ( sta >> 1 ) & ( ~ ( ( 1 << ( tot - i ) ) - 1 ) ) | ( sta & ( ( 1 << ( tot - i ) ) - 1 ) );sum += 2 * max( dfs( sta1, tot - 1 ) + color1, dfs( sta2, tot - 1 ) + color2 ) / tot;}if( tot & 1 ) {int i = ( tot + 1 ) >> 1; int color = ( sta >> ( i - 1 ) ) & 1;int st = ( sta >> 1 ) & ( ~ ( ( 1 << ( i - 1 ) ) - 1 ) ) | ( sta & ( ( 1 << ( i - 1 ) ) - 1 ) );sum += ( dfs( st, tot - 1 ) + color ) / tot;}return ( tot > 24 ) ? mp[sta] = sum : dp[sta] = sum;
}int main() {scanf( "%d %d %s", &n, &k, s );int sta = 0;for( int i = 0;i < ( 1 << 25 );i ++ )dp[i] = -1;for( int i = 1;i <= n;i ++ )sta |= ( s[i - 1] == 'W' ) << ( n - i );sta |= ( 1 << n );printf( "%.8f", dfs( sta, n ) );return 0;
}

T3:玩个树

title

有一棵 n 个节点的树,每条边长度为 1,颜色为黑或白。

可以执行若干次如下操作:选择一条简单路径,反转路径上所有边的颜色。

对于某些边,要求在操作结束时为某一种颜色。

给定每条边的初始颜色,求最小操作数,以及满足操作数最小时,最小的操作路径长度和。
输入格式

第一行,一个正整数 n。

接下来 n-1 行,每行四个整数 a, b, c, d:

• 树中有一条边连接 a 和 b。

• c = 0, 1 表示初始颜色为白色、黑色。

• d = 0, 1, 2 表示最终要求为白色、要求为黑色、没有要求。
输出格式

输出一行,两个整数,表示最小操作数、操作数最小时的最小路径长度和。
样例
样例输入1

5
2 1 1 0
1 3 0 1
2 4 1 2
5 2 1 1

样例输出1

1 2

样例解释1

操作路径 {2, 1, 3}。

样例输入2

3
1 3 1 2
2 1 0 0

样例输出2

0 0

样例输入3

6
1 3 0 1
1 2 0 2
2 4 1 0
4 5 1 0
5 6 0 2

样例输出3

1 4

数据范围与提示

对于100%的数据,保证给出的图为一棵树,有 n ∈ [1,1e5],a, b ∈ [1, n],c ∈ {0, 1},d ∈ {0, 1, 2}
在这里插入图片描述

solution

若操作的边集为EEE,那么操作次数则为EEE中度数为奇数的点的个数/2/2/2,称这种点为端点
对于点iii而言
若为奇数,除去与父亲相连的边则变成了偶数,儿子可以两两配对
那么它就孤了下来,成为一条有可能被操作的路径的一端
若为偶数,除去与父亲相连的边则变成了奇数,儿子两两配对后则还剩一个儿子
那么此时iii称当一个中转站的作用,衔接着儿子与父亲
反正无论如何它都只可能是一条可能被操作的路径上的一个点,仅此而已

此时赤裸裸的思想,先控制操作数最少,其次控制路径最小


dp[i][0/1]dp[i][0/1]dp[i][0/1]表示以iii为根的子树(iii与父亲fafafa相连的那条边是否翻转,翻转为111,不翻转为000)的最小操作数以及最小路径和
再设w1w1w1表示iii与父亲fafafa相连的边需要翻转,w2w2w2表示iii与父亲fafafa相连的边不需要翻转
w1=min(dp[v][0]+w1,w2+dp[v][1])w1=min(dp[v][0]+w1,w2+dp[v][1])w1=min(dp[v][0]+w1,w2+dp[v][1])
①儿子不需要翻转,iii与父亲的边已经翻转
iii与父亲的边尚未翻转,儿子需要翻转
w2=min(w2+dp[v][0],w1+dp[v][1])w2=min(w2+dp[v][0],w1+dp[v][1])w2=min(w2+dp[v][0],w1+dp[v][1])
①儿子不翻转,父亲也不翻转
②儿子翻转,父亲再翻转回来
在这里插入图片描述

code

#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 100005
#define inf 0x3f3f3f3f
struct node {int opt, len;node(){}node( int Opt, int Len ) {opt = Opt, len = Len;}node operator + ( const node &t ) const {return node( opt + t.opt, len + t.len );}
}dp[MAXN][2];
vector < pair < int, int > > G[MAXN];
int n;node Min( node x, node y ) {if( x.opt < y.opt ) return x;else if( x.opt == y.opt && x.len < y.len ) return x;else return y;
}void dfs( int u, int fa, int type ) {node w1 = node( inf, inf ), w2 = node( 0, 0 );for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first, flag = G[u][i].second;if( v == fa ) continue;dfs( v, u, flag );node tmp1 = Min( w1 + dp[v][0], w2 + dp[v][1] );node tmp2 = Min( w1 + dp[v][1], w2 + dp[v][0] );w1 = tmp1, w2 = tmp2;}if( type == 1 || type == 2 )dp[u][1] = Min( node( w1.opt, w1.len + 1 ), node( w2.opt + 1, w2.len + 1 ) );elsedp[u][1] = node( inf, inf );if( type == 0 || type == 2 )dp[u][0] = Min( node( w1.opt + 1, w1.len ), w2 );elsedp[u][0] = node( inf, inf );
}int main() {scanf( "%d", &n );for( int i = 1, a, b, c, d;i < n;i ++ ) {scanf( "%d %d %d %d", &a, &b, &c, &d );c = ( d == 2 ) ? d : c != d;G[a].push_back( make_pair( b, c ) );G[b].push_back( make_pair( a, c ) );}dfs( 1, 0, 2 );printf( "%d %d", dp[1][0].opt >> 1, dp[1][0].len );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019 年起如何开始学习 ABP 框架系列文章-开篇有益

阅读文本大概需要 3.3 分钟。本系列文章推荐阅读地址为&#xff1a;52ABP 开发文档https://www.52abp.com/Wiki/52abp/latest/Welcome-to-52abp本文的目的是为了让刚刚接触 ABP 框架的同学或者准备接触 ABP 框架的同学&#xff0c;能够理解和搞明白 ABP 框架到底是怎么回事&…

【模板】差分约束算法

【模板】差分约束算法 题意&#xff1a; 题解&#xff1a; 模板题 算法讲解 给出一组包含 m 个不等式&#xff0c;有 n 个未知数。求任意一组满足这个不等式组的解&#xff0c;或判定无解。 连边之后跑最短路&#xff0c;保证每个连通块都没有负环即可。 也可以建源点s 0&a…

数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

打死没想到会在H老师处学懂数论同余&#xff0c;整除模运算埃式筛法欧拉筛法最大公约数和最小公倍数辗转相除法更相减损术裴蜀定理威尔逊定理费马定理同余等价类、剩余系、缩系欧拉函数欧拉定理扩展欧拉定理区间逆元扩展欧几里得中国剩余定理扩展中国剩余定理利用以上所有知识进…

AT4437-[AGC028C]Min Cost Cycle【结论,堆】

正题 题目链接:https://www.luogu.com.cn/problem/AT4437 题目大意 有nnn个点的一张有向完全图&#xff0c;每个点有两个点权a,ba,ba,b。连接x,yx,yx,y两个点的边权为min{ax,by}min\{a_x,b_y\}min{ax​,by​}&#xff0c;求一条权值和最小的哈密顿回路。 1≤n≤105,1≤a,b≤1…

某银行大型管理系统端到端持续集成和交付实践

背景传统的银行IT系统研发流程从需求提出到产品交付往往具有较长的研发周期&#xff0c;纵观银行当下面临的市场环境&#xff0c;个人信贷消费升级&#xff0c;资管需求旺盛&#xff0c;普惠金融成为国家战略&#xff0c;来自银行同业和互联网金融的压力扑面而来&#xff0c;谁…

排列组合十一个性质公式及证明,错排数公式及证明

文章目录排列数组合数求组合数常用公式定义式递推式杨辉三角组合数常用性质及证明性质一性质二性质三性质四(二项式定理)性质五性质六性质七性质八性质九性质十性质十一错排数排列数 从nnn个物品中不放回地依次选mmm个物品&#xff0c;考虑顺序&#xff0c;有多少种方案&#…

引入用于 Azure IoT Edge 的 Visual Studio 工具

物联网开发人员&#xff1a;工具和经验引入用于 Azure IoT Edge 的 Visual Studio 工具今天&#xff0c;我们很高兴地发布用于 Visual Studio 2017 的 Azure IoT Edge 工具的预览版。Azure IoT Edge 是一个全托管服务&#xff0c;通过直接在跨平台物联网设备上部署并运行人工智…

P4878 [USACO05DEC]Layout G

P4878 [USACO05DEC]Layout G 题意&#xff1a; 题解&#xff1a; 这个题其实是差分约束的裸题&#xff0c;但是有几个坑要注意 1.题目说了&#xff0c;奶牛按照编号1…N排列&#xff0c;对于ML个输入&#xff0c;A< B ,所以关系是B - A < 10,而不是A - B <10,我一开…

【学习笔记】原根 / BSGS / 扩展BSGS证明及模板

文章目录原根BSGS大步小步算法扩展BSGS原根 如果两个整数a,ba,ba,b互质&#xff0c;则有aϕ(b)%b1a^{\phi(b)}\%b1aϕ(b)%b1 定义模bbb意义下的aaa的阶为使ad%b1a^d\%b1ad%b1的最小正整数ddd 显然&#xff0c;模bbb的阶d∣ϕ(b)d|\phi(b)d∣ϕ(b) 如果模bbb意义下aaa的阶为…

.Net Core分布式部署中的DataProtection密钥安全性

在.NetCore中默认使用DataProtection来保护数据&#xff0c;例如Cooike等。一般情况下DataProtection生成的密钥会被加密后存储&#xff0c;例如默认的文件存储可以看到使用了Windows DPAPI加密。但是如果更改默认设置例如使用的外部存储如redis则此时密钥默认是不加密的微软说…

scanf(“%s“)真的只开读入字符串大小就可以了吗??

文章目录前言还原过程计算机程序背后的故事总结瞎逼逼前言 艹艹艹艹艹艹&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;老子没想到没想到&#xff0c;靠&#xff01; 本人刚刚在做树链剖分“染色”一题的代码重构&#xff0c;上午打…

P5299-[PKUWC2018]Slay the Spire【dp】

前言 正题 题目链接:https://www.luogu.com.cn/problem/P5299 题目大意 有2n2n2n张牌&#xff0c; nnn张强化牌&#xff0c;每张上有一个正整数x(x>1)x(x>1)x(x>1)&#xff0c;如果使用后之后的每一张攻击牌伤害都会乘上xxx。nnn张攻击牌&#xff0c;每张上有一个正…

asp.net core2.2 多用户验证和授权

asp.net core2.2 用户验证 和授权有很详细和特贴心的介绍&#xff0c;我感兴趣的主要是这两篇&#xff1a;cookie身份验证基于角色的授权我的项目有两类用户&#xff1a;微信公众号用户&#xff0c;用户名为公众号的openid企业微信的用户&#xff0c;用户名为企业微信的userid每…

P1494 [国家集训队]小Z的袜子

P1494 [国家集训队]小Z的袜子 题意&#xff1a; 有一个长度为 n 的序列c[i] 。现在给出 m个询问&#xff0c;每次给出两个数l,r &#xff0c;从编号在 l 到 r 之间的数中随机选出两个不同的数&#xff0c;求两个数相等的概率。 题解&#xff1a; 很明显&#xff0c;莫队算法…

一文带你快速读懂.NET CLI

dotnet cli 是 .Net Core 功能中最有用的特性之一。在这篇文章里&#xff0c;我们将介绍几个.Net OSS 工具是如何使用 dotnet cli&#xff0c;并介绍如何在日常开发中使用新的 cli 工具。正文关键要点dotnet cli 使得基于. Net 项目的自动化和脚本编写变得非常简单&#xff0c;…

[POJ 3164]Command Network(最小树形图,朱刘算法)

文章目录titlesolutioncodetitle solution 读完翻译后&#xff0c;很明显就是个朱刘算法的板子题 最小树形图&#xff0c;就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 root 为根的有向生成树 T&#xff0c;且使得 T 中所有边权值最小 简单来说&#xff0c…

ASP.NET Core 3.0:将会拥有更少的依赖

在ASP.NET Core项目中&#xff0c;我们使用一个叫做Microsoft.AspNetCore.App的综合包。它也被称为ASP.NET Core Shared Framework&#xff0c;在ASP.NET Core Shared Framework之中包含了很多依赖项&#xff0c;它能满足一般应用的需求。但是如果你查看它的依赖项&#xff0c;…

CSP2021NOIP2021游记

CSP Day -? 初赛 初赛考前没怎么复习&#xff0c;反倒是理直气壮的翘了一周晚修&#xff08;虽然后面就一直翘了&#xff09;。 开考之后才发现要拿那几张纸&#xff0c;监考让我考完再出去拿。 选择题很简单&#xff0c;没有啥犹豫的写完了&#xff0c;第一道读程序写结果好…

微软上线Try .NET,支持在浏览器运行C#代码

微软Try .NET项目近期上线&#xff0c;这一项目允许用户通过浏览器运行和编写C#代码&#xff0c;同时还支持完整的代码提示。用户可以通过访问这一项目官网&#xff08;点此进入&#xff09;对Try .NET这一项目进行简单了解。该项目允许开发人员在浏览器中运行和编辑C#代码片段…

[LOJ]体育成绩统计 / Score (无脑模拟,没有脑子,就是上!)

题目 好久没敲过恶心的模拟题了&#xff0c;莫名有点怀念是什么鬼&#xff0c;我还记得我的zamjena 没啥想说的&#xff0c;这道题就是没智商有码力的 纯粹是纪念一下今天上午直接肝了的两个半小时&#xff0c;真的一点思维都不需要有&#xff0c;直接上&#xff01;&#xff0…