题解:YNOI/GZOI2019 与或和】的更多相关文章

题目大意: 1. 求所有的子矩阵的and之和2. 求所有子矩阵的or之和 由于是位运算,那么久直接拆位,于是就变成了求全0子矩阵的个数和全1子矩阵的个数那么题目就变成了简单的单调栈问题 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> using namespace std…
开始完全没思路 在洛谷看到样例一,突发奇想,决定先做一下元素只有0/1的情况 发现子任务1是全1子矩阵 子任务2是总子矩阵个数减去全0子矩阵 发现全0/1矩阵可以构造单调栈解决.具体做法:前缀和求出每个格子上面有多少颜色为0/1的格子(是0是1有求子任务1/2决定),然后发现可以每次在单调栈中找出相邻的两个值,算出内部区块的面积,多次累加后发现刚好是全0/1子矩阵的个数 小技巧:把单调队列的第0项的坐标置0,可以避免特判 让后求总子矩阵个数也很简单,递推解决(我数学不好,瑟瑟发抖) 公式: ff…
Problem loj3085 bzoj不放题面差评 题意概要:给出两条竖直直线,再给出 \(n\) 架飞机的初始航线:一条接通这两条直线的线段,保证航线交点不在两条直线上.现要求安排所有飞机在航线相交处做特技: 擦身而过:两架飞机按原方向线路继续前进,一次得分 \(b\) 对向交换:两架飞机交换线路继续前进,一次得分 \(a\) 另外,给定 \(k\) 个边界与坐标轴成 \(45°\)角 的正方形,若一次特技被至少一个正方形囊括,则总得分加 \(c\) 现要求决策每次相遇做的特技,求最大/最小…
GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include<bits/stdc++.h> #define il inline #define vd void #define mod 1000000007 typedef long long ll; il ll gi(){ ll x=0,f=1; char ch=getchar(); while(!isdig…
「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 或和. 分析: 或和与是一个东西,只要把所有数都异或上\((1<<31)-1\)然后再从总答案中减掉就能互相转化,考虑求与. 枚举每一位,转化成算有多少个全\(1\)子矩形,单调栈经典问题.总时间复杂度\(\mathrm{O}(n^2\log n)\). 代码: #include <cst…
题面. 我也想过根号分治,但是题目刷得少,数组不敢开,所以还是看题解做的. 这道题目要用到根号分治的思想,可以看看这道题目和我的题解. 题目要求处理一个数组a,支持如下操作. 对一个整数x,对数组长度范围内所有位置( y + x * i )加上一个数,y <= x. 查询区间和 数据范围1e5,使用分块. 处理修改 分块的一大特点就是其已经确定的单次查询复杂度,那么我们可以顺藤摸瓜,以n1/2为分界点推理操作. 对于x>=n1/2,y + x * i 对应范围内位置不超过n1/2个,可以暴力修…
这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整体的思路就是特判国士无双和七对子,然后 dp 搞普通的胡牌 dp 状态设计和楼上大佬说的一样,就是用一个五维的 \(f[i][j][k][l][p]\) 表示当前处理了前 i 种类型的牌,存在 j 个 面子/杠子 ,以 i-1 开头的顺子要选 k 个,以 i 开头的面子要选 l 个,以及当前是否有…
原题传送门 首先先要学会麻将,然后会发现就是一个暴力dp,分三种情况考虑: 1.非七对子国士无双,设\(dp_{i,j,k,a,b}\)表示看到了第\(i\)种牌,一共有\(j\)个\(i-1\)开头的顺子,有\(k\)个\(i\)开头的顺子,有\(a\)个面子/杠子,有\(b\)个雀头时最大分数,暴力转移即可 2.七对子,设\(dp_{i,j}\)表示看到了第\(i\)种牌,一共有\(j\)个雀头时最大分数,暴力转移即可 3.国士无双,设\(dp_{i,j}\)表示看到了国士无双限定的第\(i…
原题传送门 我们珂以拆位,拆成一个个0/1矩阵 贡献珂以用全0,全1的子矩阵的个数来计算 全0,全1的子矩阵的个数珂以用悬线法/单调栈解决 #include <bits/stdc++.h> #define N 1005 #define mod 1000000007 #define getchar nc using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&…
原题传送门 题意:给你k个点,让你求两两最短路之间的最小值 我们考虑二进制拆分,使得每两个点都有机会分在不同的组\((A:0,B:1)\)中,从源点\(S\)向\(A/B\)中的点连边权为0的边,从\(B/A\)中的点向汇点\(T\)连边权为0的边,这时\(S->T\)的最短路就是\(A/B\)中的点到\(B/A\)中的点最短路的最小值 所以做最短路次数为\(2\log k\),总复杂度为\(T n \log n\log k\)(srf好像还有少一个log的做法,orz srf) #includ…
D1T1:与或和 对每位处理,问题变成所有内部不包含0/1的矩阵的个数,单调栈维护即可. #include<cstdio> #include<algorithm> #include<cstring> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ,mod=1e9+; int top,sum,sm,n,mx,a[N][N],b[N][N],st[N],sz[N],l[N][N…
可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\). 设没有\(1 \times 1\)的砖块的情况铺\(2 \times n\)的路的方案数为\(F_n\),根据上面的分析得\(F_n=F_{n-1}+F_{n-2}\),发现其为斐波那契数列. 用同样的方法考虑有\(1 \times 1\)的砖块的情况,设\(f_n\)表示按题意铺\(2 \times…
[BZOJ5505][GXOI/GZOI2019]逼死强迫症(矩阵快速幂) 题面 BZOJ 洛谷 题解 如果没有那两个\(1*1\)的东西,答案就是斐波那契数,可以简单的用\(dp\)得到. 大概是设\(f[i]\)表示当前除了到第\(i\)列的方案数,转移是考虑用\(2*1\)竖着覆盖一列还是\(2\)个\(1*2\)横着覆盖两列,得到转移\(f[i]=f[i-1]+f[i-2]\). 现在回假设要在这一行放上第二个\(1*1\),那么直到前一个\(1*1\)所在列之前的所有方块都被唯一确定了…
题目地址:P5305 [GXOI/GZOI2019]旧词 这里是官方题解 \[\sum_{i \leq x}^{}\ depth(lca(i,y))^k\] \(k = 1\) 求的是 \(\sum_{i \leq x}^{}\ depth(lca(i,y))\) ,一堆点然后每个点和 \(y\) 求 \(lca\) 然后深度求和. 总体思路是把 \(lca\) 的值摊派到这个点到根的路径上(这个东西也叫树上差分?),再离线解决所有询问. 维护一个点权数组 \(sum\) ,初始为 \(0\)…
题目地址:P5304 [GXOI/GZOI2019]旅行者 这里是官方题解 一个图 \(n\) 点 \(m\) 条边,里面有 \(k\) 个特殊点,问这 \(k\) 个点之间两两最短路的最小值是多少? \(n \leq 10^5, m \leq 5 * 10 ^5\) 假设我们把特殊点分成 \(A,B\) 两个集合,新建 \(s\) 连 \(A\) 集合的所有点,边权 \(0\) ,新建 \(t\) 连接 \(B\) 集合里的所有点,边权 \(0\) ,那么 \(s\) 到 \(t\) 的最短路…
题目地址:P5303 [GXOI/GZOI2019]逼死强迫症 这里是官方题解 初步分析 从题目和数据范围很容易看出来这是一个递推 + 矩阵快速幂,那么主要问题在于递推的过程. 满足条件的答案一定是以下的形式,设 \(k = n - 1\) ,左右两边为整齐的道路,中间为长度 \(p(p \geq 3)\) 的组合块: 由 \(p\) 的奇偶性,可以得到两种不同的基本图形,即 \(1 \times 1\) 的小块在同一行( \(p\) 是偶数)和各占一行( \(p\) 是奇数). 数学方法 左右…
题目地址:P5302 [GXOI/GZOI2019]特技飞行 这里是官方题解(by lydrainbowcat) 题意 给 \(10^5\) 条直线,给 \(x = st\) 和 \(x = ed\) 两个位置 在两条直线 \(l1,l2\) 交点,可以交换 \(l1,l2\) 接下来的部分(变成两条折线) 交换或不交换分别可以获得固定的分数 \(a\) 和 \(b\) 另外有 \(10^5\) 个观测点可以观测到一定范围内情况(曼哈顿距离),在观测范围内的点额外计分 \(c\) 要求最后在 \…
题目地址:P5301 [GXOI/GZOI2019]宝牌一大堆 这里是官方题解(by lydrainbowcat) 部分分 直接搜索可以得到暴力分,因为所有和牌方案一共只有一千万左右,稍微优化一下数据少的测试点可以跑过 \(3\) ~ \(7\) 已经打出的,不需要考虑顺子,可以跟七对子类似直接算 正解 预处理组合数 DP 计算 \(3*4+2\) : 前 \(i\) 种牌,选了 \(j\) 组面子, \(k\) 组雀头,其中第 \(i - 2\) ~ \(i\) 种牌分别选了 \(l,m,n\…
[BZOJ5502][GXOI/GZOI2019]与或和(单调栈) 题面 BZOJ 洛谷 题解 看到位运算就直接拆位,于是问题变成了求有多少个全\(0\)子矩阵和有多少个全\(1\)子矩阵. 这两个操作本质就是一样的,不妨考虑有多少个全\(1\)子矩阵. 预处理出每个元素向上能够找的最多的\(1\)的个数,对于每一行从做往右扫一遍,拿一个单调栈维护一下,这样子就可以计算出以每个元素为右下角时的贡献了. 时间复杂度\(O(n^2logV)\),在BZOJ上因为常数太大T了QwQ. #include…
[BZOJ5503][GXOI/GZOI2019]宝牌一大堆(动态规划) 题面 BZOJ 洛谷 题解 首先特殊牌型直接特判. 然后剩下的部分可以直接\(dp\),直接把所有可以存的全部带进去大力\(dp\)就行了. 发现每多一张牌胡的本质就是把一个刻字换成杠子,所以这两个东西记录在一起就行了. 那么状态就是\(f[i][0/1/2/3/4][0/1/2][0/1/2][0/1]\) 分别表示刻字.杠子.顺子的数量,\(i-1,i,i+1\)的顺子数量,\(i,i+1,i+2\)的顺子的数量,以及…
[BZOJ5506][GXOI/GZOI2019]旅行者(最短路) 题面 BZOJ 洛谷 题解 正着做一遍\(dij\)求出最短路径以及从谁转移过来的,反过来做一遍,如果两个点不由同一个点转移过来就更新答案. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define ll long long #define MAX 10…
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这个东西本质上就是对于当前的一个\(x\),考虑对于其他所有点的贡献,而他们的\(LCA\)一定是\(x\)到根节点链上的一个点.那么对于某个\(x\)的祖先节点,除了\(x\)所在的子树内,其他的所有子树内的点全部会产生这个点的深度的\(k\)次方的贡献.\(k=1\)的时候这个东西可以直接做的原因是因为…
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1\le N\le 10^3\),\(val_{(i,j)} \le 2^{31}-1\). 题解 一眼题. 对于这种位运算的题,题都不用看完先想拆位,拆位可行那就拆,拆位不可行就不拆. 这里指的拆位可不可行具体指的是答案满不满足对于拆位之后的可加性. 发现这个题所求的是个和,那就果断拆开. 这样的话问题就变…
题目描述 You are given a sequence \(A_1, A_2, ..., A_n(|A_i|≤15007,1≤N≤50000)\). A query is defined as follows: \(Query(x,y) = Max(a_i+a_{i+1}+...+a_j;x≤i≤j≤y)\). Given \(M\) queries, your program must output the results of these queries. 输入输出格式 输入格式 The…
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_time[ 100000 ][ 100000 ]? 于是我打消了这个念头,最后还是看题解做的. 简化题意:给一个序列,给一些询问,每个询问包含三个区间代表序列的三个子序列,要求出这三个对应子序列去掉三个子序列都具有的公共数字后剩下的数字个数. 令三个区间为a1,a2,a3. 要求的答案就是a1数字个数-公…
简要题意 其实我觉得这个部分可以不要,因为这道题的题面还是很清晰的. 你需要维护一个数据结构,支持区间异或和区间求与 \(v\) 的最大异或和. 思路 对于这种区间问题,最容易想到的就是 分块 线段树. 而对于复杂的异或问题,最容易想到的就是 01 Trie 线性基. 合在一起,就是线段是套线性基.(好像还用了顶针的手法) 做这道题之前建议先做 P4839 P哥的桶 那是这一道题的弱化版. (现在默认大家已经做过P哥的桶了) P哥的桶中,是单点修改,而这道题是区间修改,用传统的打tag是不方便维…
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我没看,看不懂. 基本思路:我不会. 参考代码:找Oyk老师和Czj老师去. B. The background of water problem 题目大意(大写加粗的水题):给定$N$个学生和他们$K$个科目的成绩$S_i$,再给出各科目$K_i$的权重顺序$Q_i$,求排名之后,拥有id为$X$的…
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <string> #include <bitset> #include <vector> #include <…
2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2561 Description 给定一个边带正权的连通无向图G=(V,E),其中N=|V|,M=|E|,N个点从1到N依次编号,给定三个正整数u,v,和L (u≠v),假设现在加入一条边权为L的边(u,v),那么需要删掉最少多少条…
Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring Painting standard input/output 1 s, 256 MB    x2519 C Money Transfers standard input/output 1 s, 256 MB    x724 D Tree Construction standard input/outp…