ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)
题目链接:
题意:在二维平面上有 n 个人,每个人有一个位置(xi, yi)和门派 ci,m 个操作:①改变第 k 个人的位置;②改变第 k 个人的门派;③询问区间[l,r]之间不同门派的两个人的最大曼哈顿距离。
题解:首先需要将曼哈顿距离转化成切比雪夫距离(不懂戳https://www.cnblogs.com/zwfymqz/p/8253530.html),然后用线段树维护一个区间内两个不同门派 x 和 y 的最大最小和次大次小值即可。(维护次大/次小值是因为若区间内的最大值和最小值的人是同一个门派的话则不能进行比较)(代码写的很丑,建议理解做法后自己写一个...
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define ull unsigned long long
- #define mst(a,b) memset((a),(b),sizeof(a))
- #define mp(a,b) make_pair(a,b)
- #define pi acos(-1)
- #define pii pair<int,int>
- #define pb push_back
- #define fi first
- #define se second
- const int INF = 0x3f3f3f3f;
- const double eps = 1e-;
- const int MAXN = 1e5 + ;
- const int MAXM = 1e7 + ;
- const ll mod = 1e9 + ;
- ll x[MAXN],y[MAXN];
- int c[MAXN];
- struct node {
- pair<ll,int> mxx[], mnx[];
- pair<ll,int> mxy[], mny[];
- }st[MAXN<<];
- void pushup(int rt) {
- st[rt] = st[rt<<];
- if(st[rt].mxx[].se == -) st[rt].mxx[] = st[rt<<|].mxx[], st[rt].mxx[] = st[rt<<|].mxx[];
- else if(st[rt<<|].mxx[] >= st[rt].mxx[]) {
- if(st[rt<<|].mxx[].se != st[rt].mxx[].se) {
- st[rt].mxx[] = st[rt].mxx[], st[rt].mxx[] = st[rt<<|].mxx[];
- if(st[rt<<|].mxx[].se != - && st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
- st[rt].mxx[] = st[rt<<|].mxx[];
- } else {
- st[rt].mxx[] = st[rt<<|].mxx[];
- if(st[rt<<|].mxx[].se != - && st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
- st[rt].mxx[] = st[rt<<|].mxx[];
- }
- } else {
- if(st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
- st[rt].mxx[] = st[rt<<|].mxx[];
- else if(st[rt<<|].mxx[].se != - && st[rt<<|].mxx[].se != st[rt].mxx[].se && st[rt<<|].mxx[].fi >= st[rt].mxx[].fi)
- st[rt].mxx[] = st[rt<<|].mxx[];
- }
- //mnx
- if(st[rt].mnx[].se == -) st[rt].mnx[] = st[rt<<|].mnx[], st[rt].mnx[] = st[rt<<|].mnx[];
- else if(st[rt<<|].mnx[] <= st[rt].mnx[]) {
- if(st[rt<<|].mnx[].se != st[rt].mnx[].se) {
- st[rt].mnx[] = st[rt].mnx[], st[rt].mnx[] = st[rt<<|].mnx[];
- if(st[rt<<|].mnx[].se != - && st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
- st[rt].mnx[] = st[rt<<|].mnx[];
- } else {
- st[rt].mnx[] = st[rt<<|].mnx[];
- if(st[rt<<|].mnx[].se != - && st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
- st[rt].mnx[] = st[rt<<|].mnx[];
- }
- } else {
- if(st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
- st[rt].mnx[] = st[rt<<|].mnx[];
- else if(st[rt<<|].mnx[].se != - && st[rt<<|].mnx[].se != st[rt].mnx[].se && st[rt<<|].mnx[].fi <= st[rt].mnx[].fi)
- st[rt].mnx[] = st[rt<<|].mnx[];
- }
- //mxy
- if(st[rt].mxy[].se == -) st[rt].mxy[] = st[rt<<|].mxy[], st[rt].mxy[] = st[rt<<|].mxy[];
- else if(st[rt<<|].mxy[] >= st[rt].mxy[]) {
- if(st[rt<<|].mxy[].se != st[rt].mxy[].se) {
- st[rt].mxy[] = st[rt].mxy[], st[rt].mxy[] = st[rt<<|].mxy[];
- if(st[rt<<|].mxy[].se != - && st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
- st[rt].mxy[] = st[rt<<|].mxy[];
- } else {
- st[rt].mxy[] = st[rt<<|].mxy[];
- if(st[rt<<|].mxy[].se != - && st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
- st[rt].mxy[] = st[rt<<|].mxy[];
- }
- } else {
- if(st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
- st[rt].mxy[] = st[rt<<|].mxy[];
- else if(st[rt<<|].mxy[].se != - && st[rt<<|].mxy[].se != st[rt].mxy[].se && st[rt<<|].mxy[].fi >= st[rt].mxy[].fi)
- st[rt].mxy[] = st[rt<<|].mxy[];
- }
- //mny
- if(st[rt].mny[].se == -) st[rt].mny[] = st[rt<<|].mny[], st[rt].mny[] = st[rt<<|].mny[];
- else if(st[rt<<|].mny[] <= st[rt].mny[]) {
- if(st[rt<<|].mny[].se != st[rt].mny[].se) {
- st[rt].mny[] = st[rt].mny[], st[rt].mny[] = st[rt<<|].mny[];
- if(st[rt<<|].mny[].se != - && st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
- st[rt].mny[] = st[rt<<|].mny[];
- } else {
- st[rt].mny[] = st[rt<<|].mny[];
- if(st[rt<<|].mny[].se != - && st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
- st[rt].mny[] = st[rt<<|].mny[];
- }
- } else {
- if(st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
- st[rt].mny[] = st[rt<<|].mny[];
- else if(st[rt<<|].mny[].se != - && st[rt<<|].mny[].se != st[rt].mny[].se && st[rt<<|].mny[].fi <= st[rt].mny[].fi)
- st[rt].mny[] = st[rt<<|].mny[];
- }
- }
- void build(int rt,int l,int r) {
- if(l == r) {
- st[rt].mxx[].fi = st[rt].mnx[].fi = x[l], st[rt].mxx[].se = st[rt].mnx[].se = c[l];
- st[rt].mxx[].se = st[rt].mnx[].se = -;
- st[rt].mxy[].fi = st[rt].mny[].fi = y[l], st[rt].mxy[].se = st[rt].mny[].se = c[l];
- st[rt].mxy[].se = st[rt].mny[].se = -;
- return ;
- }
- int mid = (l + r) >> ;
- build(rt<<,l,mid);
- build(rt<<|,mid + ,r);
- pushup(rt);
- }
- void update(int rt,int l,int r,int pos) {
- if(l == r) {
- st[rt].mxx[].fi = st[rt].mnx[].fi = x[l], st[rt].mxx[].se = st[rt].mnx[].se = c[l];
- st[rt].mxx[].se = st[rt].mnx[].se = -;
- st[rt].mxy[].fi = st[rt].mny[].fi = y[l], st[rt].mxy[].se = st[rt].mny[].se = c[l];
- st[rt].mxy[].se = st[rt].mny[].se = -;
- return ;
- }
- int mid = (l + r) >> ;
- if(pos <= mid) update(rt<<,l,mid,pos);
- else update(rt<<|,mid + ,r,pos);
- pushup(rt);
- }
- node ans;
- void query(int rt,int l,int r,int ql,int qr) {
- if(ql <= l && qr >= r) {
- //mxx
- if(ans.mxx[].se == -) ans.mxx[] = st[rt].mxx[], ans.mxx[] = st[rt].mxx[];
- else if(st[rt].mxx[] >= ans.mxx[]) {
- if(st[rt].mxx[].se != ans.mxx[].se) {
- ans.mxx[] = ans.mxx[], ans.mxx[] = st[rt].mxx[];
- if(st[rt].mxx[].se != - && st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
- ans.mxx[] = st[rt].mxx[];
- } else {
- ans.mxx[] = st[rt].mxx[];
- if(st[rt].mxx[].se != - && st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
- ans.mxx[] = st[rt].mxx[];
- }
- } else {
- if(st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
- ans.mxx[] = st[rt].mxx[];
- else if(st[rt].mxx[].se != - && st[rt].mxx[].se != ans.mxx[].se && st[rt].mxx[].fi >= ans.mxx[].fi)
- ans.mxx[] = st[rt].mxx[];
- }
- //mnx
- if(ans.mnx[].se == -) ans.mnx[] = st[rt].mnx[], ans.mnx[] = st[rt].mnx[];
- else if(st[rt].mnx[] <= ans.mnx[]) {
- if(st[rt].mnx[].se != ans.mnx[].se) {
- ans.mnx[] = ans.mnx[], ans.mnx[] = st[rt].mnx[];
- if(st[rt].mnx[].se != - && st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
- ans.mnx[] = st[rt].mnx[];
- } else {
- ans.mnx[] = st[rt].mnx[];
- if(st[rt].mnx[].se != - && st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
- ans.mnx[] = st[rt].mnx[];
- }
- } else {
- if(st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
- ans.mnx[] = st[rt].mnx[];
- else if(st[rt].mnx[].se != - && st[rt].mnx[].se != ans.mnx[].se && st[rt].mnx[].fi <= ans.mnx[].fi)
- ans.mnx[] = st[rt].mnx[];
- }
- //mxy
- if(ans.mxy[].se == -) ans.mxy[] = st[rt].mxy[], ans.mxy[] = st[rt].mxy[];
- else if(st[rt].mxy[] >= ans.mxy[]) {
- if(st[rt].mxy[].se != ans.mxy[].se) {
- ans.mxy[] = ans.mxy[], ans.mxy[] = st[rt].mxy[];
- if(st[rt].mxy[].se != - && st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
- ans.mxy[] = st[rt].mxy[];
- } else {
- ans.mxy[] = st[rt].mxy[];
- if(st[rt].mxy[].se != - && st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
- ans.mxy[] = st[rt].mxy[];
- }
- } else {
- if(st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
- ans.mxy[] = st[rt].mxy[];
- else if(st[rt].mxy[].se != - && st[rt].mxy[].se != ans.mxy[].se && st[rt].mxy[].fi >= ans.mxy[].fi)
- ans.mxy[] = st[rt].mxy[];
- }
- //mny
- if(ans.mny[].se == -) ans.mny[] = st[rt].mny[], ans.mny[] = st[rt].mny[];
- else if(st[rt].mny[] <= ans.mny[]) {
- if(st[rt].mny[].se != ans.mny[].se) {
- ans.mny[] = ans.mny[], ans.mny[] = st[rt].mny[];
- if(st[rt].mny[].se != - && st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
- ans.mny[] = st[rt].mny[];
- } else {
- ans.mny[] = st[rt].mny[];
- if(st[rt].mny[].se != - && st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
- ans.mny[] = st[rt].mny[];
- }
- } else {
- if(st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
- ans.mny[] = st[rt].mny[];
- else if(st[rt].mny[].se != - && st[rt].mny[].se != ans.mny[].se && st[rt].mny[].fi <= ans.mny[].fi)
- ans.mny[] = st[rt].mny[];
- }
- return ;
- }
- int mid = (l + r) >> ;
- if(qr <= mid) query(rt<<,l,mid,ql,qr);
- else if(ql > mid) query(rt<<|,mid + ,r,ql,qr);
- else {
- query(rt<<,l,mid,ql,mid);
- query(rt<<|,mid + ,r,mid + ,qr);
- }
- }
- int main() {
- #ifdef local
- freopen("data.txt", "r", stdin);
- // freopen("data.txt", "w", stdout);
- #endif
- int cas = ;
- int t;
- scanf("%d",&t);
- while(t--) {
- printf("Case #%d:\n",cas++);
- int n,m;
- scanf("%d%d",&n,&m);
- for(int i = ; i <= n; i++) {
- ll x0,y0;
- scanf("%lld%lld%d",&x0,&y0,&c[i]);
- x[i] = x0 + y0, y[i] = x0 - y0;
- }
- build(,,n);
- while(m--) {
- int op;
- scanf("%d",&op);
- if(op == ) {
- int k;
- ll x0,y0;
- scanf("%d%lld%lld",&k,&x0,&y0);
- x[k] += x0 + y0, y[k] += x0 - y0;
- update(,,n,k);
- } else if(op == ) {
- int k,col;
- scanf("%d%d",&k,&col);
- c[k] = col;
- update(,,n,k);
- } else if(op == ) {
- int l,r;
- scanf("%d%d",&l,&r);
- for(int i = ; i < ; i++) {
- ans.mxx[i].se = ans.mnx[i].se = -;
- ans.mxy[i].se = ans.mny[i].se = -;
- }
- query(,,n,l,r);
- ll out = ;
- //x
- if(ans.mxx[].se != -) {
- if(ans.mxx[].se != - && ans.mxx[].se != ans.mxx[].se)
- out = max(out,abs(ans.mxx[].fi - ans.mxx[].fi));
- if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
- out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
- if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
- out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
- }
- if(ans.mxx[].se != -) {
- if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
- out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
- if(ans.mnx[].se != - && ans.mnx[].se != ans.mxx[].se)
- out = max(out,abs(ans.mxx[].fi - ans.mnx[].fi));
- }
- if(ans.mnx[].se != - && ans.mnx[].se != -)
- out = max(out,abs(ans.mnx[].fi - ans.mnx[].fi));
- //y
- if(ans.mxy[].se != -) {
- if(ans.mxy[].se != - && ans.mxy[].se != ans.mxy[].se)
- out = max(out,abs(ans.mxy[].fi - ans.mxy[].fi));
- if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
- out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
- if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
- out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
- }
- if(ans.mxy[].se != -) {
- if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
- out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
- if(ans.mny[].se != - && ans.mny[].se != ans.mxy[].se)
- out = max(out,abs(ans.mxy[].fi - ans.mny[].fi));
- }
- if(ans.mny[].se != - && ans.mny[].se != -)
- out = max(out,abs(ans.mny[].fi - ans.mny[].fi));
- printf("%lld\n",out);
- }
- }
- }
- return ;
- }
ACM-ICPC 2018 沈阳赛区现场赛 E. The Kouga Ninja Scrolls (切比雪夫距离+线段树)的更多相关文章
- ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)
题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- ACM-ICPC 2018 沈阳赛区(网络赛)
D.Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with he ...
- ICPC 2018 徐州赛区网络赛
ACM-ICPC 2018 徐州赛区网络赛 去年博客记录过这场比赛经历:该死的水题 一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. D. Easy Math 题意: ...
- ACM总结——2017ACM-ICPC北京赛区现场赛总结
现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
- ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi) ...
- ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication && ZOJ 4061 (思维+构造)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意:定义一个长度为 n 的序列 a1,a2,..,an ...
随机推荐
- javaIO -- File源码
一.简介 文件和目录路径名的抽象表示. 用户界面和操作系统使用依赖于系统的路径名字符串命名文件和目录. 这个类提供了一个抽象的,独立于系统的层次化路径名的视图. 二.代码 (一).属性详情 //平台的 ...
- php文件操作类
<?php /** *本类为文件操作类,实现了文件的建立,写入,删除,修改,复制,移动,创建目录,删除目录 * 列出目录里的文件等功能,路径后面别忘了加"/" */ clas ...
- 【计算几何】Water Testing
Water Testing 题目描述 You just bought a large piece of agricultural land, but you noticed that – accord ...
- linux中的内核级防火墙(SELINUX)
SElinux是基于内核开发出来的一种安全机制,被称之为内核级加强型防火墙,有力的提升了系统的安全性. SElinux的作用分为两方面:1.在服务上面加上标签: 2.在功能上面限制功能 在linux系 ...
- (十六)SpringBoot之使用 Caching- - EhCache
一.案例 1.1 引入maven依赖 <!-- caching --> <dependency> <groupId>org.springframework.boot ...
- JAVA的转义字符
一.常见的转义字符 转移字符对应的英文是escape character , 转义字符串(Escape Sequence) 字母前面加上捺斜线"\"来表示常见的那些不能显示的AS ...
- js中 this 的指向
js中 this的指向一共存在3种地方: 1.全局的this; 2.构造函数的this; 3.call/apply; 一.全局的this: function test(){ this.d = 3;// ...
- ubuntu装openssh-client和openssh-server
1. 修改update源 进入/etc/apt/目录,首先用cp命令将sources.list备份成sources.list.bk,然后复制http://www.cnblogs.com/eastson ...
- Linq to sql之left join运用示例
示例一: var l= from a in cardsBll.GetCards() join b in usersBll.GetAllUsers() on a.CardSn equals b.Card ...
- Navicat远程连接centos上mysql出错
原因1:mysql账户是不允许远程连接 参考:centos安装mysql(for 小白) 打开远程连接 原因2:3306端口未开启 开启端口:iptables -I INPUT -p tcp --dp ...