【题解】Luogu P5300 [GXOI/GZOI2019]与或和
原题传送门
我们珂以拆位,拆成一个个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&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
    register int x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*f;
}
inline void write(register int x)
{
    if(!x)putchar('0');if(x<0)x=-x,putchar('-');
    static int sta[20];register int tot=0;
    while(x)sta[tot++]=x%10,x/=10;
    while(tot)putchar(sta[--tot]+48);
}
int n,a[N][N],len[N],all,ans1,ans2;
pair<int,int>s[N];
inline int work(register int t,register int opt)
{
	int res=0;
	for(register int i=1;i<=n;++i)
		len[i]=0;
	for(register int i=1;i<=n;++i)
	{
		int top=0,sum=0;
		for(register int j=1;j<=n;++j)
		{
			len[j]=(a[i][j]>>t&1)==opt?len[j]+1:0;
			int tmp=1;
			while(top&&s[top].first>=len[j])
				sum-=s[top].first*s[top].second,tmp+=s[top--].second;
			sum+=len[j]*tmp;
			res=(res+sum)%mod;
			s[++top]=make_pair(len[j],tmp);
		}
	}
	return res;
}
int main()
{
	n=read();
	for(register int i=1;i<=n;++i)
		for(register int j=1;j<=n;++j)
			a[i][j]=read(),all=(all+i*j)%mod;
	for(register int i=0,j=1;i<31;++i,j<<=1)
	{
		ans1=(ans1+1ll*work(i,1)*j)%mod;
		ans2=(ans2+1ll*(all-work(i,0)+mod)*j)%mod;
	}
	write(ans1),putchar(' '),write(ans2);
	return 0;
}
												
											【题解】Luogu P5300 [GXOI/GZOI2019]与或和的更多相关文章
- luogu P5300 [GXOI/GZOI2019]与或和
		
传送门 题目涉及按位与以及按位或运算,所以可以拆位考虑,枚举某个二进制位,然后某个位置如果那个数的第\(i\)位是\(0\)就放\(0\),否则放\(1\),这一位的贡献就是位运算后值为\(1\)的子 ...
 - P5300 [GXOI/GZOI2019]与或和
		
题目地址:P5300 [GXOI/GZOI2019]与或和 考虑按位计算贡献 对于 AND 运算,只有全 \(1\) 子矩阵才会有贡献 对于 OR 运算,所以非全 \(0\) 子矩阵均有贡献 如果求一 ...
 - 【题解】Luogu P5301 [GXOI/GZOI2019]宝牌一大堆
		
原题传送门 首先先要学会麻将,然后会发现就是一个暴力dp,分三种情况考虑: 1.非七对子国士无双,设\(dp_{i,j,k,a,b}\)表示看到了第\(i\)种牌,一共有\(j\)个\(i-1\)开头 ...
 - 【题解】Luogu P5304 [GXOI/GZOI2019]旅行者
		
原题传送门 题意:给你k个点,让你求两两最短路之间的最小值 我们考虑二进制拆分,使得每两个点都有机会分在不同的组\((A:0,B:1)\)中,从源点\(S\)向\(A/B\)中的点连边权为0的边,从\ ...
 - luogu P5305 [GXOI/GZOI2019]旧词
		
传送门 先考虑\(k=1\),一个点的深度就是到根节点的路径上的点的个数,所以\(lca(x,y)\)的深度就是\(x\)和\(y\)到根路径的交集路径上的点的个数,那么对于一个询问,我们可以对每个点 ...
 - luogu P5304 [GXOI/GZOI2019]旅行者
		
传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...
 - luogu P5303 [GXOI/GZOI2019]逼死强迫症
		
传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...
 - luogu P5302 [GXOI/GZOI2019]特技飞行
		
传送门 强行二合一可还行 首先\(c\)的贡献是不会变的,先考虑求出多少交点被矩形覆盖,交点的话可以按左端点纵坐标从下到上顺序枚举一条线段,然后维护右端点纵坐标的set,把之前处理过线段的右端点放进s ...
 - 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】
		
这道题除了非常恶心以外也没有什么非常让人恶心的地方 当然一定要说有的话还是有的,就是这题和咱 ZJOI 的 mahjong 真的是好像的说~ 于是就想说这道题出题人应该被 锕 掉 noteskey 整 ...
 
随机推荐
- GoCN每日新闻(2019-11-09)
			
GoCN每日新闻(2019-11-09) 1. Go语言发行10周年庆祝 https://blog.golang.org/10years2. 容器中某Go服务GC停顿经常超过100ms排查 https ...
 - 【Beta】“北航社团帮”测试报告——小程序v2.0与网页端v1.0
			
目录 测试计划.过程和结果 后端测试--单元测试与覆盖率 后端测试--压力测试 展示部分数据 平均数据 前端测试--小程序v2.0 授权登录与权限检查 新功能的测试 兼容性测试 性能测试 前端测试-- ...
 - 第08组 Alpha冲刺(1/4)
			
队名 八组评分了吗 组长博客 小李的博客 作业博客 作业链接 组员1(组长) 过去两天完成了哪些任务 文字/口头描述 11月9号开小会安排alpha冲刺开始的工作,进行任务分工,具体见11.09会议记 ...
 - Object changed by Unknown
			
https://documentation.red-gate.com/soc7/troubleshooting/object-changed-by-unknown https://documentat ...
 - android x86 固件定制
			
测试提了几个bug 1.系统语言默认设置成中文,否则时间控件显示的内容有问题 2.关闭10分钟不操作自动休眠功能 3.默认关闭虚拟键盘,目的在文本控件点击后,虚拟键盘就会在右下角显示出来,导致物理键盘 ...
 - Siam R-CNN: Visual Tracking by Re-Detection
			
Siam R-CNN: Visual Tracking by Re-Detection 2019-12-02 22:21:48 Paper:https://128.84.21.199/abs/1911 ...
 - C++中rapidxml用法
			
转载:https://www.cnblogs.com/rainbow70626/p/7586713.html 解析xml是第三方库很多,例如:tingxml,这次学习一下rapidxml,rapidx ...
 - JavaScript 工厂模式
			
//工厂 function FruitMaker() { //function 后不带方法名,这里cococola未定义,make return时,返回 FruitMaker.cococola thi ...
 - xgboost 算法总结
			
xgboost有一篇博客写的很清楚,但是现在网址已经失效了,之前转载过,可以搜索XGBoost 与 Boosted Tree. 现在参照这篇,自己对它进行一个总结. xgboost是GBDT的后继算法 ...
 - UltraEdit 替换符
			
1.在每行的最后一行添加字符串: 打开替换,在查找中输入 ^r 在替换栏中输入要替换的字符 再把下边的正则表达式勾选,然后开始或是全部替换就可以了 2.替换回车换行 在查找中输入 要替换的字符 ...