【JZOJ5270】【GDOI2018模拟】神奇的矩阵(二维线段树)
来源:互联网 发布:数据库基本概念 编辑:程序博客网 时间:2024/05/18 22:09
Description
Solution
这题直接三方log只有70分,想要打的更好只能打平方log方的,那么很显然就是用一个二维的数据结构来维护。
这还是我第一次打二维线段树(不是线段树套线段树)
首先我们对于绝对值可以考虑小的数被贡献多少次,那么就是找大的数的和-小的数的出现次数,那么我们就可以考虑把所有的数从小到大排序然后依次插入。
然后每个点上统计一个以它为左上角的矩阵可以被贡献多少次,那么每次插进一个数,就把它左上角的矩阵全部都加上a[i],然后询问的时候也是询问左上角的矩阵,左上角的矩阵。(注意要先询问再修改),这样意义其实就是以一个点为左上角的矩阵包括的数集一一与刚插进来的数匹配。
用线段树修改和询问的区间都是同一个区间,那么可以打在一起。
Code
#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)typedef long long ll;using namespace std;const ll maxn=507,mo=1e4+7;ll i,j,k,l,n,m,ans,tot,yi,er;ll a[maxn][maxn];struct nod{ ll x,y,z;}b[maxn*maxn];struct node{ ll sum,num,bz1,bz2;}t[maxn*maxn*80];bool cmp(nod x,nod y){return x.z<y.z;}void down(ll x,ll l,ll r,ll l1,ll r1){ ll mid=(l+r)/2; if(t[x].bz1){ t[x*2].sum+=t[x].bz1*(r1-l1+1)*(mid-l+1)%mo;t[x*2+1].sum+=t[x].bz1*(r1-l1+1)*(r-mid)%mo; t[x*2].num+=t[x].bz2*(r1-l1+1)*(mid-l+1);t[x*2+1].num+=t[x].bz2*(r1-l1+1)*(r-mid); t[x*2].bz1+=t[x].bz1;t[x*2+1].bz1+=t[x].bz1; t[x*2].bz2+=t[x].bz2;t[x*2+1].bz2+=t[x].bz2; t[x].bz1=t[x].bz2=0; }}void change(ll x,ll l,ll r,ll l1,ll r1,ll y,ll z,ll yy,ll zz,ll o){ if(l>=y&&r<=z&&l1>=yy&&r1<=zz){ yi+=t[x].sum;er+=t[x].num; t[x].sum+=(r1-l1+1)*(r-l+1)*o%mo;t[x].num+=(r1-l1+1)*(r-l+1); t[x].bz1+=o,t[x].bz2++; return; } down(x,l,r,l1,r1); ll mid=(l+r)/2; if(z<=mid)change(x*2,l1,r1,l,mid,yy,zz,y,z,o); else if(y>mid)change(x*2+1,l1,r1,mid+1,r,yy,zz,y,z,o); else change(x*2,l1,r1,l,mid,yy,zz,y,mid,o),change(x*2+1,l1,r1,mid+1,r,yy,zz,mid+1,z,o); t[x].sum=t[x*2].sum+t[x*2+1].sum; t[x].num=t[x*2].num+t[x*2+1].num;}int main(){ freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); scanf("%lld%lld%lld",&n,&m,&k); fo(i,1,n)fo(j,1,m)scanf("%lld",&a[i][j]),b[++tot].x=i,b[tot].y=j,b[tot].z=a[i][j]; sort(b+1,b+tot+1,cmp); fo(l,1,tot){ yi=er=0; change(1,1,n,1,m,max(b[l].x-k+1,(ll)1),min(n-k+1,b[l].x),max(b[l].y-k+1,(ll)1),min(m-k+1,b[l].y),b[l].z); // b[l].z%=mo; ans=ans+er*b[l].z%mo-yi; } ans=(ans*2%mo+mo)%mo; printf("%lld\n",ans);}
阅读全文
1 0
- 【JZOJ5270】【GDOI2018模拟】神奇的矩阵(二维线段树)
- 【JZOJ5270】【GDOI2018模拟8.14】神奇的矩阵
- 【GDOI2018模拟8.14】神奇的矩阵
- 【GDOI2018模拟8.14】神奇的救火现场
- JZOJ5222【GDOI2018模拟7.12】A(线段树&&二维偏序)
- 【GDOI2018模拟7.8】矩阵
- 【JZO5271】【GDOI2018模拟8.14】神奇的救火现场
- 【JZOJ5272】【GDOI2018模拟8.14】神奇的重复序列
- JZOJ5242【GDOI2018模拟8.8】矩阵
- 【jozj5228】【GDOI2018模拟7.14】【小奇的集合】【矩阵乘法】
- 【jzoj5221】【GDOI2018模拟7.10】【A】【线段树合并】
- 【GDOI2018模拟7.12】A 线段树+树状数组
- JZOJ5365. 【GDOI2018模拟9.14】通信 线段树+重链剖分
- 神奇的矩阵 二维树状数组
- 【JZOJ5272】【GDOI2018模拟】神奇的重复序列(DP,性质题)
- 神奇的线段树
- 【jzoj5223】【GDOI2018模拟7.12】【B】【矩阵乘法】
- 【GDOI2018模拟7.12】B 矩阵乘法+dp
- 【23种设计模式】快速回想
- C++用ios类的成员函数实现格式化I/O范例
- 巴乐兔 注册条款 分析
- 【Java核心计算 基础知识(第9版)】第4章 对象与类
- python实现给定一个单链表删除指定节点
- 【JZOJ5270】【GDOI2018模拟】神奇的矩阵(二维线段树)
- 【JZOJ5295】【清华集训2017模拟】Create
- 织梦dedecms TAG标签调用汇总(史上最全)
- kmp入门---hd1711
- 时至今日,微信小程序的冰火真相终于爆出
- Teemo Attacking问题及解法
- P1042 乒乓球
- jxl读取excel时间
- 【JZOJ5272】【GDOI2018模拟】神奇的重复序列(DP,性质题)