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

[题解]P9478 [NOI2023] 方格染色

P9478 [NOI2023] 方格染色

考虑特殊问题一般化。若只有行和列的操作,可以直接扫描线,计算矩形面积并。

斜方向的操作最多进行 \(5\) 次,所以每个操作可以拆成 \(O(n)\) 个小正方形参与面积并。

这样就能拿 \(95\) 了。

瓶颈在于斜方向有一个 \(O(n)\),所以考虑不拆成小正方形,而是先计算没有斜线的答案,再枚举每一条斜线。

对于枚举的斜线,我们可以 \(O(q)\) 地遍历行和列的操作,并求出于它重合的位置数量(注意使用 set 去重)。对答案的贡献即为斜线长度、再减去重合位置的数量。

时间复杂度 \(O(q\log q)\)

实现细节上,需要注意两斜线若存在公共点,需要将它们合并成一条,否则会重复统计答案。

点击查看代码
#include<bits/stdc++.h>
#define eb emplace_back
#define PII pair<int,int>
#define int long long
#define lc (x<<1)
#define rc (x<<1|1)
using namespace std;
const int N=1e5+5;
inline bool in(int x,int l,int r){return x>=l&&x<=r;}
int c,n,m,q,idx,tn,X[N<<1],ans;
struct SEG{int lp[N<<4],rp[N<<4],sum[N<<4],len[N<<4];void build(int x,int l,int r){lp[x]=l,rp[x]=r;if(l==r) return;int mid=(l+r)>>1;build(lc,l,mid),build(rc,mid+1,r);}void pushup(int x){if(sum[x]) len[x]=X[rp[x]+1]-X[lp[x]];else len[x]=(lp[x]!=rp[x])*(len[lc]+len[rc]);}void chr(int x,int a,int b,int v){if(X[rp[x]+1]<=a||b<=X[lp[x]]) return;if(a<=X[lp[x]]&&X[rp[x]+1]<=b) sum[x]+=v;else chr(lc,a,b,v),chr(rc,a,b,v);pushup(x);}
}seg;
struct Line{int l,r,h,o;bool operator < (const Line &_) const{return h<_.h;}
}s[N<<1];
struct Hor{int y,l,r;};
struct Ver{int x,l,r;};
map<int,list<PII>> ks;//koishi
set<int> se;//visited
vector<Hor> hs;//horizon
vector<Ver> vs;//vertical
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>c>>n>>m>>q; int op,x,y,xx,yy;while(q--){cin>>op>>x>>y>>xx>>yy;if(op==1){hs.eb(Hor{y,x,xx});s[++idx]={x-1,xx,y-1,1};s[++idx]={x-1,xx,y,-1};X[++tn]=x-1,X[++tn]=xx;}else if(op==2){vs.eb(Ver{x,y,yy});s[++idx]={x-1,x,y-1,1};s[++idx]={x-1,x,yy,-1};X[++tn]=x-1,X[++tn]=x;}else{ks[y-x].eb(x,xx);}}sort(s+1,s+1+idx);sort(X+1,X+1+tn),tn=unique(X+1,X+1+idx)-X-1;seg.build(1,1,tn-1);//处理横纵 for(int i=1;i<idx;i++){seg.chr(1,s[i].l,s[i].r,s[i].o);ans+=seg.len[1]*(s[i+1].h-s[i].h);}//处理斜向for(auto& koishi:ks){int p=koishi.first;auto &li=koishi.second;li.sort();for(auto it=li.begin(),lst=li.end();it!=li.end();){if(lst!=li.end()&&(*it).first<=(*lst).second){(*lst).second=max((*lst).second,(*it).second);li.erase(it++);}else lst=it++;}for(PII i:li){se.clear();for(Hor j:hs){if(in(j.y-p,i.first,i.second)&&in(j.y-p,j.l,j.r)){se.insert(j.y-p);}}for(Ver j:vs){if(in(j.x,i.first,i.second)&&in(j.x+p,j.l,j.r)){se.insert(j.x);}}ans+=i.second-i.first+1-se.size();}}cout<<ans<<"\n";return 0;
}
http://www.jsqmd.com/news/21325/

相关文章:

  • 赋能智慧水利:视频汇聚平台EasyCVR智慧水利工程视频管理系统解决方案
  • 2025年10月远程控制软件推荐榜:十强对比与实测评价
  • 2025年10月中国房产律所权威盘点:北京金诉领衔十大推荐榜
  • 2025年靠谱的二段力铰链,缓冲二段力铰链批发销售
  • 2025年10月远程控制软件推荐榜:节点小宝领衔十强对比评测
  • 2025年口碑好的外贸获客,中亚获客推广
  • 2025年评价高的服务器电源,服务器机箱厂家最新TOP推荐榜
  • 从汇聚到智能:解析视频融合平台EasyCVR视频智能分析技术背后的关键技术
  • 2025年知名的KNX智能家居品牌,KNX智能家居系统设计最新TOP排名厂家
  • 2025年杭州品牌策划公司最新推荐榜,聚焦企业服务品质与特色领域竞争力深度剖析
  • Docker、Docker-compose常用命令
  • 2025年比较好的会记档案管理系统,高校档案管理系统医院版
  • 2025 年深圳香港包车公司最新推荐榜单:结合协会测评与多维度分析,选出跨境出行放心之选机场接送/商务接待/旅游包车/出行/跨境/跨境出行服务/粤港澳深圳香港包车公司推荐
  • 2025年知名的富氢水机招商加盟项目,富氢水机招商团队
  • redis 7.4.6单机部署
  • 2025年10月中国办公家具定制公司推荐:主流口碑榜对比评测
  • 2025年10月短视频IP打造公司推荐榜:五强对比与选择指南
  • 2025年质量好的绿植租赁套餐,无锡办公室绿植租赁品牌厂家排行榜
  • 语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python) - 教程
  • 2025年中国房产律所推荐榜:深度解析北京金诉等十强所
  • 2025年知名的全品类全屋定制五金,成都全屋定制五金厂家推荐及选择建议
  • 2025 年最新推荐数据接口公司排行榜:覆盖身份验证等多类型接口,结合协会测评权威数据解析优质品牌手机号核验/运营商数据接口/工商数据接口/银行卡数据验证接口公司推荐
  • 2025年10月德语培训机构推荐榜:在线小班与线下沉浸全面对比
  • 答技术团队负责人:关于AI数智化升级改造路径的思考 - 那年-冬季
  • 2025年质量好的厂区VI设计,10.画册VI设计最新TOP厂家推荐
  • 2025年质量好的工作餐团餐配送,工厂团餐配送推荐及选择建议
  • 2025年10月道闸厂家推荐榜:五强对比与选购指南
  • AI优化企业:AI优化公司榜单推荐
  • 2025年质量好的房屋加固如何选
  • 2025年质量好的房屋检测鉴定选哪家