Cot

题目大意
两种操作
给坐标上一个直角三角形中每个整点权值$+1$
求坐标上一个直角三角形中每个整点权值之和
题解
一顿分析思考加推导之后,发现并不存在这样的数据结构(大概是有,只是我不知道),于是考虑分块暴力。
我们记录两个前缀和
$p_{x,y}$表示$(x,y)$点权
$R_{x,y}=\sum\limits_{i=1}^{x}\sum\limits_{j=1}^{\min(y,i)}p_{i,j}$
$T_{x,y}=\sum\limits_{i=x-y+1}^{x}\sum\limits_{j=1}^{\min(y,i)}p_{i,j}$
形象化的就长这样
于是我们可以通过这两个前缀和加上简单的容斥解决任意一个三角形的和。
修改这样的,考虑差分
对修改数进行分块,设块长为$B$,则对于每次修改,我们考虑对平面打差分表记,你会发现如果利用朴素二维前缀和的计算方式差分每个点的值会很麻烦,直接考虑对于每一个$x$维护$y$从小到大的的话标记会是这样(红色的是要整体$+1$的三角形)
这样做一次是$O(N)$,虽然能过,不过这个$O(N)$可以变成O$(1)$的。我们对于差分的标记进行查分,维护一个从左向右的差分和从左下到右上的差分即可。

然后对于每$B$次修改,我们直接暴力重构一边当前的$T,R$,即先扫一遍差分标记的差分标记,然后差分出点的值,再更新$T,R$。对于每次询问,我们用之前修改过的整块的答案$O(1)$算出来三角形的值,再扫一遍最近的不到$B$次的修改,两个三角形面积$O(1)$求交更新答案即可。
不妨设修改询问均为$Q$次,则复杂度为$O(N^2\frac QB+Q\cdot B)$。
不难发现,当$B$取$N$时,复杂度会严格优于$O(QN)$。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 1010
#define BC 2500
#define mid ((l+r)>>1)
using namespace std;
LL read(){
LL nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
const int n=read();
int tg1[M][M],tg2[M][M],p1[M][M],p2[M][M],qx[M<<2],qy[M<<2],qd[M<<2],cnt;
int F[M][M],val[M][M];
LL R[M][M],T[M][M];
void solve(){
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
p1[i][j]+=p1[i-1][j],p2[i][j]+=p2[i-1][j-1];
F[i][j]=F[i][j-1]+p1[i][j]+p2[i][j],val[i][j]+=F[i][j];
R[i][j]=R[i-1][j]+R[i][j-1]-R[i-1][j-1],R[i][j]+=val[i][j];
T[i][j]=T[i-1][j-1]+R[i][j-1]-R[i-1][j-1],T[i][j]+=val[i][j];
}
}
memset(p1,0,sizeof(p1));
memset(p2,0,sizeof(p2));
}
LL getans(int x,int y,int k){
LL sum=0;
for(int i=1;i<=cnt;i++){
int flr=max(y,qy[i]),rs=min(x+k-1,qx[i]+qd[i]-1);
int ctx=max(x-y,qx[i]-qy[i]); LL len=rs-(ctx+flr)+1;
if(len>0) sum+=((len*(len+1))>>1);
} return sum;
}
int main(){
for(int tpe,x,y,dt,Q=read();Q;Q--){
tpe=read(),x=read(),y=read(),dt=read();
if(tpe==1){
++cnt,qx[cnt]=x,qy[cnt]=y,qd[cnt]=dt;
p1[x][y]++,p1[x+dt][y]--,p2[x][y+1]--,p2[x+dt][y+dt+1]++;
if(cnt==BC) solve(),cnt=0; continue;
}
LL ans=T[x+dt-1][y+dt-1]-T[x-1][y-1];
ans-=R[x+dt-1][y-1]-R[x-1][y-1];
ans+=getans(x,y,dt),printf("%lld\n",ans);
}
return 0;
}
Cot的更多相关文章
- spoj cot: Count on a tree 主席树
10628. Count on a tree Problem code: COT You are given a tree with N nodes.The tree nodes are number ...
- spoj COT - Count on a tree (树上第K小 LCA+主席树)
链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...
- cos,sina,tan,cot
这些都是三角形的公式. 三角形总之就是一个直角两个锐角. cos就是余弦定理,就是锐角的邻边除以三角形的斜边. sin就是正弦定理,就是锐角的对边除以三角形的斜边. tan就是正切定理,就是锐角的对边 ...
- Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)
题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...
- SPOJ - COT Count on a tree
地址:http://www.spoj.com/problems/COT/en/ 题目: COT - Count on a tree #tree You are given a tree with N ...
- 正割、余割、正弦、余弦、正切、余切之间的关系的公式 sec、csc与sin、cos、tan、cot之间的各种公式
1.倒数关系 tanα ·cotα=1 sinα ·cscα=1 cosα ·secα=1 2.商数关系 tanα=sinα/cosα cotα=cosα/sinα 3.平方关系 sinα²+cosα ...
- SPOJ 10628 COT - Count on a tree(在树上建立主席树)(LCA)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- 【学术篇】SPOJ COT 树上主席树
这是学完主席树去写的第二道题_(:з」∠)_ 之前用树上莫队水过了COT2... 其实COT也可以用树上莫队水过去不过好像复杂度要带个log还是怎么样可能会被卡常数.. 那就orz主席吧.... 写了 ...
- c/c++ 实现三角函数(不使用库函数) sin/cos/tan/cot
c/c++ 实现三角函数(不使用库函数) sin/cos/tan/cot #include <iostream> #include <cstdlib> #include < ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
随机推荐
- Laravel 手记(连接mysql)
这几天学习Laravel框架遇到了数据库方面的问题. PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denie ...
- 用象棋的思维趣说IT人的职业发展和钱途
最近我花了不少功夫在学习象棋,也学习了王天一等高手的棋路,感觉IT人的职业和下棋一样,往好了讲,争主动权争实惠只争朝夕,往坏了讲,一步走错得用多步来弥补,如果错误太大未必能弥补回来.在本文里,就用下棋 ...
- 装服务器,测试数据库,简单的maven命令
[说明]今天总体回顾一下:大概是早上装服务器,下午测试数据库,晚上了解简单的maven命令 一:今日完成 1)在远程服务器的tomcat 设置好管理员的登录账号 2)登录tomcat 的项目管理 查看 ...
- Stacks of Flapjacks(栈)
Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data ...
- SpringMVC拦截器实现用户登录拦截
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 < ...
- 让intellij挂在异常处,特别是出现null pointer的地方
1 在Intellij中设置java exception breakpoint 在调试模式下,run->view breakpoints 在java exception breakpoints- ...
- Convex optimization 凸优化
zh.wikipedia.org/wiki/凸優化 以下问题都是凸优化问题,或可以通过改变变量而转化为凸优化问题:[5] 最小二乘 线性规划 线性约束的二次规划 半正定规划 Convex functi ...
- Java之线程池(二)
关于线程和线程池的学习,我们可以从以下几个方面入手: 第一,什么是线程,线程和进程的区别是什么 第二,线程中的基本概念,线程的生命周期 第三,单线程和多线程 第四,线程池的原理解析 第五,常见的几种线 ...
- Nvidia NVENC 硬编码预研总结
本篇博客记录NVENC硬编码的预研过程 github: https://github.com/MarkRepo/NvencEncoder 步骤如下: (1)环境搭建 (2)demo编译,测试,ARG ...
- 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术
服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器.集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任 ...