题意

给一个\(n\times n\)的螺旋矩阵,给出其中的\(m\)个点的值分别为各个点上数字的数位之和,给出\(q\)个询问,每次询问从\((x1,y1)\)到\((x2,y2)\)的子矩阵的和。

分析

用官方题解的方法\(O(1)\)推出点\((x,y)\)上的值,将这\(m\)个点按\(x\)排序后依次按\(y\)建主席树,查询时找到对应的\(x1\)和\(x2\)的历史版本,查询\(y1\)到\(y2\)的权值和就行了,\((query(y1,y2,1,n,rt[l],rt[r]))\);

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=1e6+10;
int T,n,m,q;
ll tr[maxn*30];
int ls[maxn*30],rs[maxn*30],rt[maxn],tot;
struct ppo{
int x,y;
ll c;
bool operator<(const ppo &r)const{
return x<r.x;
}
}a[maxn];
ll fun(ll i,ll j,ll n){
ll ans;
j=n-j+1;i=n-i+1;
ll minn=min(i,min(j,min(n-i+1,n-j+1)));
if(i<=j) ans=minn*(4*(n-1)-4*minn)+10*minn-4*n-3+i+j;
else ans=minn*(4*n-4*minn)+2*minn+1-i-j;
ll sum = 0;
while(ans){
sum+=ans%10;
ans/=10;
}
return sum;
}
void bd(int l,int r,int &p){
tr[++tot]=tr[p],ls[tot]=ls[p],rs[tot]=rs[p],p=tot;
if(l==r) return;
int mid=l+r>>1;
bd(l,mid,ls[p]);bd(mid+1,r,rs[p]);
}
void up(int k,int l,int r,int x,int &p){
tr[++tot]=tr[p]+x,ls[tot]=ls[p],rs[tot]=rs[p],p=tot;
if(l==r) return;
int mid=l+r>>1;
if(k<=mid) up(k,l,mid,x,ls[p]);
else up(k,mid+1,r,x,rs[p]);
}
ll qy(int dl,int dr,int l,int r,int a,int b){
if(l>=dl&&r<=dr){
return tr[b]-tr[a];
}int mid=l+r>>1;ll ret=0;
if(dl<=mid) ret+=qy(dl,dr,l,mid,ls[a],ls[b]);
if(dr>mid) ret+=qy(dl,dr,mid+1,r,rs[a],rs[b]);
return ret;
}
int main(){
//ios::sync_with_stdio(false);
//freopen("in","r",stdin);
scanf("%d",&T);
while(T--){
tot=0;
scanf("%d%d%d",&n,&m,&q);
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
a[i]=ppo{x,y,fun(x,y,n)};
}
sort(a+1,a+m+1);
bd(1,n,rt[0]);
for(int i=1;i<=m;i++){
rt[i]=rt[i-1];
up(a[i].y,1,n,a[i].c,rt[i]);
}
while(q--){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int l=lower_bound(a+1,a+m+1,ppo{x1,0,0})-a-1;
int r=upper_bound(a+1,a+m+1,ppo{x2,0,0})-a-1;
printf("%lld\n",qy(y1,y2,1,n,rt[l],rt[r]));
}
}
return 0;
}

2019icpc南京网络赛 A 主席树的更多相关文章

  1. 2019icpc南京网络赛 F 主席树

    题意 给一个\(n\)的全排列数组\(a\),求一个递推数组每一项的值:\(ans[i]=ans[j]+1\),\(j\)为\(a[pos[i]-k]到a[pos[i]+k],(pos[i]为i在数组 ...

  2. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)

    2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...

  3. 2019icpc南京网络赛_F_Greedy Sequence

    题意 题意不明,队友告诉我对于每个\(i\),所在下标\(p[i]\),在\([p[i]-k,p[i]+k]\)中找到小于\(i\)的最大数\(x\),然后\(ans[i]=ans[x]+1\)即可. ...

  4. 2019icpc南京网络赛

    B. super_log(扩展欧拉函数) 题意:求aa...(b个a)模M的值. 思路:递归用欧拉函数求解,我们知道欧拉降幂公式: 如果讨论b和φ(p)的关系会很麻烦,网上证明了一种精妙的方法,只需重 ...

  5. 2019ICPC南京网络赛总结

    这次是在学校打的,总体不算好,过两题校排200多..很惨. 开场一段时间没人过题,但是很多人交I, 我也就再看,看着看着发现不可做,这时候转F,花了半天读懂题意的时候想到主席树查找.但是主席树这种查找 ...

  6. 2019ICPC南京网络赛F Greedy Sequence

    题意:对于1<=i<=n每次找到(pos[i]-k,pos[i]+k)内不大于i的最大那个数,ans[i]=ans[mx]+1,若ans[mx]未知则递归处理ans[mx] PS:这个题比 ...

  7. 2019icpc南京网络赛 A The beautiful values of the palace(离线+树状数组)

    题意: (假设所有的点对应的值已经求出)给你一个1e6*1e6的矩阵,有m<=1e5个点有值,其余都为0 q<=1e5个询问,求子矩阵的权值和 思路: 根据二维差分,对于询问左下角(x1, ...

  8. 2019ICPC南京网络赛A The beautiful values of the palace

    题意:蛇形填数超大版本,需要求出一些给定坐标的值的数位和,然后q次询问,一个矩形区域内值的和是多少 解题思路:二维偏序前缀和的经典题 二维偏序:求(x,y)左下角点的个数,思路是对x,y升序排序,用树 ...

  9. 2019ICPC南京网络赛B super_log——扩展欧拉定理

    题目 设函数 $$log_a*(x) = \begin{cases}-1, & \text{ if } x < 1 \\ 1+log_a*(log_ax) & \text{ if ...

随机推荐

  1. c# 后台隐式使用webBrowser

    c#不使用 webBrowser 控件, 在后台加载html流 private void button1_Click(object sender, EventArgs e) { string urlP ...

  2. 题解 P2859 【[USACO06FEB]摊位预订Stall Reservations】

    题目链接: https://www.luogu.org/problemnew/show/P2859 思路: 首先大家会想到这是典型的贪心,类似区间覆盖问题的思路,我们要将每段时间的左端点从小到大排序, ...

  3. easyui-datagrid 编辑模式详解——combobox

    用于列表显示号了,需要改动某一列的值,而且根据每一行的数据去加载data数据,放在这个列中供别人选择 //-------------------- 代码可变区//---------- 数据定义区var ...

  4. Vue异步请求最佳实践

    一.当前存在的问题 目前项目前端请求后台数据的方式是这样的: 页面中method中dispatch到action action调用mutation,请求axios 请求到数据后存储到state中 页面 ...

  5. 用 Portainer 远程管理 docker

    参考的官网地址为:https://portainer.readthedocs.io/en/stable/deployment.html 先更新Centos docker 镜像加速地址: curl -s ...

  6. kubernetes之service

    service出现的动机 Kubernetes Pods 是有生命周期的.他们可以被创建,而且销毁不会再启动. 如果您使用 Deployment 来运行您的应用程序,则它可以动态创建和销毁 Pod. ...

  7. MG301使用笔记

    [1]模块接收到的数据为16进制,显示乱码 配置命令:AT^IOMODE=1,1 设置对接收数据进行转换,当对端以 hex 格式发送数据,必须使用数据转换,否则数据无法完全上报.必须禁止使用缓存区.

  8. 异步通信&同步通信

    首先是两者的不同: 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流:异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节. ...

  9. ISO/IEC 15444-12 MP4 封装格式标准摘录 5

    目录 Segments Segment Type Box Segment Index Box Subsegment Index Box Producer Reference Time Box Supp ...

  10. 运行TensorFlow代码时报错

    运行TensorFlow代码时报错 错误信息ImportError: libcublas.so.10.0: cannot open shared object file 原因:TensorFlow版本 ...