G - Best ACMer Solves the Hardest Problem Gym - 101955G

G - Best ACMer Solves the Hardest Problem Gym - 101955G

题意:

我们需要建立一个数据库以支持实时查询和修改。这个数据库中的记录是点坐标 (x,y) 和其权值 w。查询与修改操作可以表示为

1 x y w,在 (x,y) 处插入一个新的点,我们保证在插入之前该位置没有点。
2 x y,删除 (x,y) 处的点,我们保证在删除之前该位置存在一点。
3 x y k w,对于每一个到 (x,y) 的欧几里得距离为 sqrt(k) 的点,给它的权值增加 w。
4 x y k,对于每一个到 (x,y) 的欧几里得距离为 sqrt(k) 的点,求出它们权值 w 的和。
其中 (x0,y0) 与 (x1,y1) 的欧几里得距离为 sqrt((x0 - x1)2 + (y0 - y1)2)
为了让所有 x 和 y 动态,我们引入变量 lastans 来表示上一次查询的结果,其初始值为 0。对于每一个操作中的 x 和 y,它们的真实值分别为 (x+lastans)%6000+1 和 (y+lastans)%6000+1
0 ≤ k ≤ 107, 1 ≤ x, y, w ≤ 6000

题解:

如果对于每次查询,我们先搜与该点欧几里得距离为len的点,肯定不行,我们可以预处理,先算出与原点距离在1e7以内的所有点,并用相应的距离存储,当之后要对(x,y)查询时,我们可以直接调用过来
比如(x1,y1)距离原点为k,说明(x1)2+(y1)2=k,那么(x-(t * x1+x))2+(y-(t * y1+y))2=k
t可以是-1或者1,其实也就是x和y分别向四个方向伸的点

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;const int maxv=1e7+10;
const int maxn=6006;
int n,m;
typedef pair<int,int> pp;
vector<pp >v[maxv],cc;
int mp[maxn][maxn];
ll lastans;
int poww[maxv];
set<pair<int,int> >cnt;
set<pair<int,int> >::iterator it;
int dir[4][2]={{1,1},{1,-1},{-1,1},{-1,-1}};void init()
{for(int i=0;i<=6000;i++){for(int j=0;j<=6000;j++){if(i*i+j*j<=1e7){v[i*i+j*j].push_back(make_pair(i,j));}elsecontinue;}}
}int judge(int x,int y)
{if(x<=0||y<=0||x>6000||y>6000)return 0;return 1;
}int main()
{init();int t;scanf("%d",&t);for(int cas=1;cas<=t;cas++){cc.clear();printf("Case #%d:\n",cas);lastans=0;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){int x,y,w;scanf("%d %d %d",&x,&y,&w);mp[x][y]=w;cc.push_back(make_pair(x,y));}for(int qq=1;qq<=m;qq++){int op,x,y,w,k;scanf("%d",&op);if(op==1){scanf("%d %d %d",&x,&y,&w);x=(x+lastans)%6000+1;y=(y+lastans)%6000+1;mp[x][y]=w;cc.push_back(make_pair(x,y));}else if(op==2){scanf("%d %d",&x,&y);x=(x+lastans)%6000+1;y=(y+lastans)%6000+1;mp[x][y]=0;}else if(op==3){scanf("%d %d %d %d",&x,&y,&k,&w);x=(x+lastans)%6000+1;y=(y+lastans)%6000+1;cnt.clear();for(int i=0;i<v[k].size();i++)//查询距离为k的点 {int xx=v[k][i].first;int yy=v[k][i].second;for(int j=0;j<=3;j++){int nx=xx*dir[j][0]+x;int ny=yy*dir[j][1]+y;if(judge(nx,ny)&&mp[nx][ny]!=0){cnt.insert(make_pair(nx,ny));}}}for(set<pp>::iterator it=cnt.begin();it!=cnt.end();it++){mp[it->first][it->second]+=w;}}else{scanf("%d %d %d",&x,&y,&k);x=(x+lastans)%6000+1;y=(y+lastans)%6000+1;cnt.clear();for(int i=0;i<v[k].size();i++){int xx=v[k][i].first;int yy=v[k][i].second;for(int j=0;j<=3;j++){int nx=xx*dir[j][0]+x;int ny=yy*dir[j][1]+y;if(judge(nx,ny)&&mp[nx][ny]!=-1){cnt.insert(make_pair(nx,ny));}}}ll ans=0;for(set<pp>::iterator it=cnt.begin();it!=cnt.end();it++){ans+=mp[it->first][it->second];}lastans=ans;printf("%lld\n",ans);}}for(int i=0;i<cc.size();i++){mp[cc[i].first][cc[i].second]=0;}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板:Link Cut Tree(LCT)

文章目录前言解析原理rotate(x)splay(x)access(x)findroot(x)makeroot(x)split(x,y)link(x,y)cut(x,y)pushdown(x)完整代码所谓Link Cut Tree&#xff0c;就是林可卡特发明的tree &#xff08;逃&#xff09; 前言 终于走到了这一天… 其实感觉没有预想的那么难&#xff08;单…

P6803-[CEOI2020]星际迷航【博弈论,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P6803 题目大意 给出一棵nnn个点的树&#xff0c;把它复制出D1D1D1层&#xff0c;编号为[0,D][0,D][0,D]&#xff0c;然后每一层随机一个点向下一层随机一个点连边。 然后从第000层的111号点出发&#xff0c;两个人轮流操作…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…

线性代数二之矩阵加速DP——数学作业,Arc of Dream

矩阵加速数学作业descriptionsolutioncodeArc of Dreamdescriptionsolutioncode数学作业 description solution dpdpdp状态转移方程&#xff0c;dpidpi−1∗10lenii(modM)dp_{i}dp_{i-1}*10^{len_i}i\pmod Mdpi​dpi−1​∗10leni​i(modM) nnn巨大&#xff0c;分段矩阵加速 …

pjudge#21655-[PR #5]双向奔赴【状压dp】

正题 题目链接:http://pjudge.ac/contest/951/problem/21655 题目大意 给出一张nnn个点的简单无向图&#xff0c;每条边的两个方向具有不同权值。求一个权值和最小的定向方案使得整张图强连通。 1≤n≤18,−1≤ai,j≤1061\leq n\leq 18,-1\leq a_{i,j}\leq 10^61≤n≤18,−1≤…

YBTOJ洛谷P2387: 魔法森林(LCT)

解析 LCT从板子到算法的入门题吧 有一些不知道的很实用的技巧 把边按a排序从小到大加入边 那么我们只需要维护当前1-n路径上的b的最小值即可 如果这条边两端点本来不连通&#xff0c;就直接link 否则找到路径上b最大的一条边&#xff0c;断掉&#xff0c;再加入当前边&#x…

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

接着上一篇Shadow Properties之美&#xff08;一&#xff09;&#xff0c;我们来继续举一个有点啰嗦的栗子。先看简单需求&#xff1a;某HR系统&#xff0c;需要记录员工资料。需要记录的资料有&#xff1a;员工号&#xff08;规则&#xff1a;分公司所在城市拼音首字母&#x…

K - Let the Flames Begin

K - Let the Flames Begin 题意&#xff1a; n个人围成一个环&#xff0c;编号分别是1~n&#xff0c;从第一个人开始报数&#xff0c;报道k的人被移除&#xff0c;然后下一个人从1重新报&#xff0c;一直这样进行。问第m给被移除的人报数是多少&#xff1f; 一共T组数据&…

CF1276F-Asterisk Substrings【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF1276F 题目大意 给出一个长度为nnn的字符串SSS&#xff0c;现在依次进行如下操作 取出SSS的一个子串TTT。将TTT中的一个字符替换成∗*∗号&#xff08;也可以不替换&#xff09; 求最后有多少种不同的TTT。 解题思路 发…

线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连Quad Tilingdescriptionsolutioncode[Hnoi2010]Bus 公交线路descriptionsolutioncodeQuad Tiling description solution 设dpi,S:dp_{i,S}:dpi,S​: iii列的状态为SSS的方案数&#xff0c;最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(…

codeforces:812(div2):总结

前言 比较水的一场比赛 E题几乎是一本通原题而我还是不会做qwq A - Sagheer and Crossroads 有一个十字路口&#xff0c;给出四个路口的车是否可以左转/右转/直行&#xff0c;并且给出每个路口的行人是否可以通过&#xff0c;求是否出现车和人冲突的情况 阅读理解题&#xff…

如何在ASP.NET Core程序启动时运行异步任务(2)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 2)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu在我的上一篇博客中&#xff0c;我介绍了如何在ASP.NET Core应用程序启动时运行一些一次性异步任务。本篇博客将继续讨论上一篇的内容&…

Gym 102798A Golden Spirit

VJ链接 题意&#xff1a; 河的两岸各有n个人&#xff0c;中间有个桥&#xff0c;过桥时间为t&#xff0c;所有人过桥后要休息x时间&#xff0c;你每次可以带一个人过桥&#xff08;每次最多只能带一个人&#xff09;&#xff0c;问将所有人带到对岸并带回来&#xff0c;最短需…

P8347-「Wdoi-6」另一侧的月【博弈论,结论】

正题 题目链接:https://www.luogu.com.cn/problem/P8347 题目大意 给出一棵树&#xff0c;两个人轮流操作。 操作者可以选择一个点删除&#xff0c;然后选择一个剩下的连通块&#xff0c;删除其他连通块。 操作完成后只剩下一个点的人失败&#xff0c;求是否先手必败。 1≤…

线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

动态DP——广义矩阵加速SP1716 GSS3 - Can you answer these queries IIIdescriptionsolutioncode[NOIP2018 提高组] 保卫王国descriptionsolutioncode动态DP能矩阵加速要满足外层操作符对内层操作符具有分配率加法对于乘法就具有分配率(ab)*ca*cb*c SP1716 GSS3 - Can you a…

洛谷P4219 大融合(LCT、虚子树)

解析 本题需要用LCT维护子树大小 然后我就不会了 然后我就用树剖水过去了 又快又好写&#xff0c;真香 现在详细聊聊如何用LCT维护子树信息 每个结点再定义一个新的变量记录所有虚儿子的信息 然后…完了&#xff1f; 告别盲目pushup&#xff0c;我们来详细聊聊在哪里需要更新…

.Net Core跨平台应用研究-HelloArm(串口篇)

引言为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行&#xff0c;针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证研究。硬件环境硬件系统经过对比筛选&#xff0c;选用了友善之臂出品的NanoPC-T3 Plus…

H - Message Bomb Gym - 102798H

H - Message Bomb Gym - 102798H 题意&#xff1a; 有n个团队&#xff0c;m个人&#xff0c;s个操作 操作1&#xff1a;学生x加入y团队 操作2&#xff1a;学生x推出y团队 操作3&#xff1a;学生x在团队y发送一个信号&#xff0c;在团队y内的所有成员&#xff08;除了x&#x…