题目链接:https://nanti.jisuanke.com/t/41298

扫描线的简单题,题目难在找宫殿的价值(°ー°〃),比赛时将近100多行代码找价值,纯模拟,看到题解哭了。

存下每个宫殿的横坐标、价值,存下每个矩形平行于y轴的两条边,左边的那个边要特殊处理,就是横坐标减一。线段树维护y坐标区间和。坐标离散化处理,按x遍历线段,先线段树更新点在y坐标上的值,再处理边,如果线段是矩形终止的边,答案即为更新完点之后查询线段树[y1,y2]上的区间和再减去起始边时查询线段树[y1,y2]上的区间和。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define maxn 2000005
ll n,m,p,sum[maxn<<],lazy[maxn<<],ans[maxn];
int ly[maxn];
struct node{
int x,y,val;
bool operator <(const node &w)const{
return x<w.x;
}
}a[maxn];
struct seg{
int x,l,r,s,id;
seg(){}
seg(int x,int l,int r,int s,int id):x(x),l(l),r(r),s(s),id(id){};
bool operator <(const seg &w)const{
if(x==w.x)return s<w.s;
return x<w.x;
}
}se[maxn<<];
int getval(int x,int y)
{
ll num,t;
x=x-n/-;y=y-n/-;
t=max(abs(x),abs(y));
if(x>=y)num=1ll*n*n-*t*t-*t-x-y;
else num=1ll*n*n-*t*t+*t+x+y;
int ret=;
while(num)
{
ret+=num%;
num/=;
}
return ret;
}
void build(int l,int r,int rt)
{
sum[rt]=lazy[rt]=;
if(l==r)return ;
int mid=l+r>>;
build(ls);build(rs);
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void update(int p,int val,int l,int r,int rt)
{
if(l==r)
{
sum[rt]+=val;return ;
}
int mid=l+r>>;
if(p<=mid)update(p,val,ls);
else update(p,val,rs);
sum[rt]=sum[rt<<]+sum[rt<<|];
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)return sum[rt];
int mid=l+r>>;
ll ret=;
if(L<=mid)ret+=query(L,R,ls);
if(R>mid)ret+=query(L,R,rs);
return ret;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&m,&p);
int x,y,x1,y1,val,tot=,cnt=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
val=getval(x,y);
a[++tot].x=x;a[tot].y=y;a[tot].val=val;
ly[tot]=y;
}
for(int i=;i<=p;i++)
{
scanf("%d%d%d%d",&x,&y,&x1,&y1);
se[++cnt]=seg(x-,y,y1,,i);ly[++tot]=y;
se[++cnt]=seg(x1,y,y1,-,i);ly[++tot]=y1;
}
sort(a+,a++m);
sort(ly+,ly++tot);
sort(se+,se++cnt);
int ny=unique(ly+,ly++tot)-ly-,pos=;
build(,ny,);
for(int i=;i<=cnt;i++)
{
se[i].l=lower_bound(ly+,ly++ny,se[i].l)-ly;
se[i].r=lower_bound(ly+,ly++ny,se[i].r)-ly;
}
for(int i=;i<=m;i++)
a[i].y=lower_bound(ly+,ly++ny,a[i].y)-ly;
int j=,num=se[].x;
for(int i=;i<=cnt;i++)
{
while(a[pos].x<=se[i].x&&pos<=m)pos++;
for(;j<pos;j++)update(a[j].y,a[j].val,,ny,);
j=pos;
if(se[i].s==)ans[se[i].id]=query(se[i].l,se[i].r,,ny,);
else ans[se[i].id]=query(se[i].l,se[i].r,,ny,)-ans[se[i].id];
}
for(int i=;i<=p;i++)
printf("%lld\n",ans[i]);
}
return ;
}

19南京网络赛A 扫描线的更多相关文章

  1. 19南京网络赛B 欧拉降幂

    题目链接 给a,b,p.有b个a的幂 #include <iostream> using namespace std; typedef long long LL; const LL N = ...

  2. HDU 4751 Divide Groups (2013南京网络赛1004题,判断二分图)

    Divide Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  4. HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)

    Walk Through Squares Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Oth ...

  5. 2018ICPC南京网络赛

    2018ICPC南京网络赛 A. An Olympian Math Problem 题目描述:求\(\sum_{i=1}^{n} i\times i! \%n\) solution \[(n-1) \ ...

  6. 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 ...

  7. 2019 南京网络赛A

    南京网络赛自闭现场 https://nanti.jisuanke.com/t/41298 二维偏序经典题型 二维前缀和!!! #include<bits/stdc++.h> using n ...

  8. 计蒜客 2018南京网络赛 I Skr ( 回文树 )

    题目链接 题意 : 给出一个由数字组成的字符串.然后要你找出其所有本质不同的回文子串.然后将这些回文子串转化为整数后相加.问你最后的结果是多少.答案模 1e9+7 分析 : 应该可以算是回文树挺裸的题 ...

  9. 分治维护dp——19南昌网络赛C/cf750E

    南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ...

随机推荐

  1. python基础七之copy

    浅拷贝 没有嵌套,则copy后完全不同,有嵌套,则copy后本体不同,嵌套相同. l1 = [1, 2, [4, 5, 6], 3] l2 = l1.copy() print(l1 is l2) # ...

  2. H3C IPv6地址分类

  3. 2019QLU.ACM集训队暑假训练须知

    1.每场比赛都要认认真真参与并及时记录: 2.每个队员必须做一个单独的博客页面存放自己队伍或者个人的比赛结果和补题计划: 3.比赛记录参考样式:[1]dny[2]ECNU 4.每场比赛结束都会安排一支 ...

  4. 深入理解Jvm--Java静态分配和动态分配完全解析

    jvm中分配Dispatch的概念 分派是针对方法而言的,指的是方法确定的过程,通常发生在方法调用的过程中.分派根据方法选择的发生时机可以分为静态分派和动态分派,其中对于动态分派,根据宗量种数又可以分 ...

  5. jQuery 工具类函数-字符串操作函数

    调用名为$.trim的工具函数,能删除字符串中左右两边的空格符,但该函数不能删除字符串中间的空格,调用格式为: $.trim (str); 参数str表示需要删除左右两边空格符的字符串. <bo ...

  6. com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient

    启动报错:com.netflix.discovery.DiscoveryClient    : Completed shut down of DiscoveryClient 解决方案: 添加web主件 ...

  7. CentOS7.6部署k8s环境

    CentOS7.6部署k8s环境 测试环境: 节点名称 节点IP 节点功能 K8s-master 10.10.1.10/24 Master.etcd.registry K8s-node-1 10.10 ...

  8. java环境所遇问题

    在javac能运行通过并且生成了.class文件但是java文件在运行时通不过出现上面图片情况,试了一上午发现我的和别人好像不一样,下面展示我的情况, 之前用户变量那里新建了一个classpath,不 ...

  9. 利用pandas、Ipython来简化数据分析过程

    最近小爬我为了提升数据分析这块儿的技能,学习了pandas库作者Wes Mckinney的数据分析经典书籍<利用Python进行数据分析>,受益良多!里面涉及到Python语言基础.还有编 ...

  10. jquery中获取当前选中行数据的方法

    $("table tr").click(function() { var td = $(this).find("td");// 找到td元素 var lo_id ...