当前位置: 首页 > news >正文

Atcoder 437 总结+E-F题解

总结

A,B,C,D,E

考试时很快打出了正解,没什么问题。

F

没什么思路,下来发现了一种比较神奇的做法。

题解

E

会发现,每一层我们会将相同的数字以及他的儿子同时去遍历。因为它们有着相同的前缀,所以说字典序只在目前这个位置出现差异。

每一次我们用一个vector记录我们当前正在遍历哪些父亲,然后去看它的儿子又有哪些是相同的,然后再加相同的放进去去往下递归即可。

代码

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=3e5+5;
int ans[maxn],cnt;
vector<int> s;
set<pair<int,int> > g[maxn];
void dfs()
{vector<pair<int,int> > v;for(auto x:s){for(auto [w,to]:g[x]) v.push_back({w,to});}s.clear();sort(v.begin(),v.end());for(int i=0;i<v.size();i++){ans[cnt++]=v[i].second;s.push_back(v[i].second);while(i<v.size()-1&&v[i+1].first==v[i].first) i++,s.push_back(v[i].second),ans[cnt++]=v[i].second;dfs();s.clear();}
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){int x,y;cin>>x>>y;g[x].insert({y,i});}s.push_back(0);ans[++cnt]=0;dfs();for(int i=1;i<=n;i++) cout<<ans[i]<<' ';return 0;
}

F

我们先把曼哈顿距离的式子写出来。

\[|X-x_i|+|Y-y_i| \]

那么此时我们就会发现我们将绝对值展开后得。

\[X+Y-(x_i+y_i)\\ x_i+y_i-(X+Y)\\ X-Y-(x_i-y_i)\\ x_i-y_i-(X-Y) \]

我们只需要将两个加起来的最大值最小值两个减掉的最小值最大值都用线段树维护出来即可。

代码

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=2e5+5;
int x[maxn],y[maxn];
struct SGT
{int maxx[maxn<<2],minn[maxn<<2];void pushup(int x){maxx[x]=max(maxx[x*2],maxx[x*2+1]);minn[x]=min(minn[x*2],minn[x*2+1]);}void update(int x,int l,int r,int p,int v){if(l==r){maxx[x]=minn[x]=v;return;}int mid=(l+r)>>1;if(p<=mid) update(x*2,l,mid,p,v);else update(x*2+1,mid+1,r,p,v);pushup(x);}int querymax(int x,int l,int r,int lt,int rt){if(l>=lt&&r<=rt) return maxx[x];int mid=(l+r)>>1,a=0,b=0;if(lt<=mid) a=querymax(x*2,l,mid,lt,rt);if(rt>mid) b=querymax(x*2+1,mid+1,r,lt,rt);return max({a,b});}int querymin(int x,int l,int r,int lt,int rt){if(l>=lt&&r<=rt) return minn[x];int mid=(l+r)>>1,a=inf,b=inf;if(lt<=mid) a=querymin(x*2,l,mid,lt,rt);if(rt>mid) b=querymin(x*2+1,mid+1,r,lt,rt);return min({a,b});}
}trees,treed;
signed main()
{ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n,q;cin>>n>>q;for(int i=1;i<=n;i++){cin>>x[i]>>y[i];trees.update(1,1,n,i,x[i]+y[i]);treed.update(1,1,n,i,x[i]-y[i]);}while(q--){int op;cin>>op;if(op==1){int i,x,y;cin>>i>>x>>y;trees.update(1,1,n,i,x+y);treed.update(1,1,n,i,x-y);}else{int l,r,x,y;cin>>l>>r>>x>>y;int a=trees.querymax(1,1,n,l,r)-(x+y);int b=(x+y)-trees.querymin(1,1,n,l,r);int c=treed.querymax(1,1,n,l,r)-(x-y);int d=(x-y)-treed.querymin(1,1,n,l,r);cout<<max({a,b,c,d})<<endl;}}return 0;
}
http://www.jsqmd.com/news/119478/

相关文章:

  • Jmeter学习
  • 【Open-AutoGLM自动保存黑科技】:揭秘附件高效留存的5大核心机制
  • 研究生必备6款免费AI论文生成器:1天搞定综述+真实文献引用
  • 8 个降AI率工具推荐!自考人必备的高效降重方案
  • 【Open-AutoGLM联系人智能分类全攻略】:手把手教你高效整理海量联系人数据
  • 【Open-AutoGLM客户归档实战指南】:手把手教你高效构建企业级信息归档系统
  • 【大模型研发管理新范式】:Open-AutoGLM进度监控系统设计与落地实践
  • Open-AutoGLM项目进度失控?立即部署这6项监控机制,确保准时交付
  • 计算机毕业设计springboot任你行汽车租赁管理系统 SpringBoot智慧汽车租赁平台基于 SpringBoot的车辆共享租赁系统 - 教程
  • 计算机毕业设计springboot基于微信小程序的高校资产维修管理系统 基于微信小程序的高校资产维护管理系统设计与实现 微信小程序环境下高校资产维修管理系统的开发与应用
  • Open-AutoGLM进度监控利器曝光:一键实现多维度任务状态追踪(内部工具流出)
  • 好写作AI:想模仿学术大师的文风?你可能学了个“寂寞”
  • 揭秘Open-AutoGLM自动回邮系统:如何3步实现企业级智能响应?
  • 错过等一年,Open-AutoGLM参会资格即将关闭?速查你的准入状态
  • 开发家庭宠物行为监测工具,识别宠物进食,饮水和活动情况,推送宠物健康报告。
  • 从开放重定向到XSS:一次绕过防火墙的实战漏洞利用
  • 好写作AI:你的中文论文翻译成英文,学术灵魂还在吗?
  • 揭秘Open-AutoGLM邮件分类黑科技:如何实现99.9%准确率的自动归类
  • 2025.12.21——1蓝
  • Open-AutoGLM核心原理深度解析:NLP+知识图谱如何重塑周报流程?
  • Open-AutoGLM你真的会用吗?3个关键函数让月报自动化不再难
  • django微博热搜数据分析与可视化系统的设计与实现 爬虫可视化_vqmfs-vue
  • pq
  • python+django基于协同过滤算法的小说推荐系统可视化大屏vue爬虫
  • 好写作AI:别让AI成为你学术生涯的“封号”武器
  • 图论专题(二十三):并查集的“数据清洗”——解决艰难的「账户合并」
  • Open-AutoGLM参会指南:如何最大化获取AI大模型最新实战经验
  • 10个降AI率工具,本科生高效降AIGC指南
  • 完整教程:使用 Spring AI 创建 MCP 服务器
  • 大模型AI时代,程序员为何“哀鸿遍野”?