海亮寄 7.22
前言
业精于勤荒于嬉,行成于思毁于随
正文(模拟赛)
卦象:大吉
感受:原来大吉指的是厕所居住时间 \(\ge 40 \ \text{min}\) 吗?根本没什么可总结的,除了 T2 读错题控了自己半个点,其它的没有什么。写掉 T1、T2,中间各种去厕所释放,回来之后只剩 \(20 \text{min}\) 了,10 min 思考 T3,暂时不会,然后一眼秒了 T4,然而没时间写了,只能作罢。把 T1、T2 的代码包装一下进行一个交的提。最后以 \(100 + 100 + 0 + 0\) 收尾,中规中矩。
吐槽:谁懂 T1、T2、T3 都是数据结构的破碎感,手都要断掉了
补药啊,肚肚兄,你怎么下午补题的时候还在自怨自艾的。云落不想再去厕所居住了,味好大的拜托 qwq
T1
线段树随便维护,感觉 hailiang OJ 还是太有实力了,本地 \(2.8s\) 但峰值时间 \(0.6s\)
T2
没有脑子,单调栈加树状数组,有人用两个栈替代树状数组,获得了线性解法
T3
显然是被降智了
查询离线下来,排序扫描线(扫描行),线段树维护截止到当前扫描线的位置,每一列的最后的 \(1\) 出现的位置
那么一个查询矩阵合法的充要条件就是当扫描线扫描到 \(x=x_2\) 时,有全局最小值 \(\ge x_1\)
剩下随便实现即可
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define x1 x_1
#define y1 y_1
#define x2 x_2
#define y2 y_2
using namespace std;
const int N=2e5+5,INF=0x3f3f3f3f;
int n,m,k,Q;bool ans[N];
struct node{
int x,y;
friend bool operator < (node s,node t){
if(s.x!=t.x)return s.x<t.x;
return s.y<t.y;
}
}a[N];
struct que{
int x1,y1,x2,y2,id;
friend bool operator < (que s,que t){
if(s.x2!=t.x2)return s.x2<t.x2;
if(s.x1!=t.x1)return s.x1<t.x1;
if(s.y1!=t.y1)return s.y1<t.y1;
return s.y2<t.y2;
}
}q[N];
struct Segment_tree{
struct node{int l,r,mn;}tr[N<<2];
inline void pushup(int u){
tr[u].mn=min(tr[u<<1].mn,tr[u<<1|1].mn);
return;
}
inline void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r){tr[u].mn=0;return;}
int mid=(l+r)>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
return;
}
inline void modify(int u,int pos,int v){
int l=tr[u].l,r=tr[u].r;
if(l==r){tr[u].mn=v;return;}
int mid=(l+r)>>1;
if(pos<=mid)modify(u<<1,pos,v);
else modify(u<<1|1,pos,v);
pushup(u);
return;
}
inline int query(int u,int ql,int qr){
int l=tr[u].l,r=tr[u].r;
if(ql<=l&&qr>=r)return tr[u].mn;
int mid=(l+r)>>1,res=INF;
if(ql<=mid)res=min(res,query(u<<1,ql,qr));
if(qr>mid)res=min(res,query(u<<1|1,ql,qr));
return res;
}
}sgt;
inline void solve(){
sort(a+1,a+k+1);sort(q+1,q+Q+1);
sgt.build(1,1,m);
// for(int i=1;i<=k;i++)cerr<<'('<<a[i].x<<','<<a[i].y<<") ";
// cerr<<endl;
// for(int i=1;i<=Q;i++)cerr<<q[i].x1<<' '<<q[i].y1<<' '<<q[i].x2<<' '<<q[i].y2<<endl;
int idx=1;
for(int i=1;i<=Q;i++){
while(idx<=k&&a[idx].x<=q[i].x2){
sgt.modify(1,a[idx].y,a[idx].x);
idx++;
}
int pos=sgt.query(1,q[i].y1,q[i].y2);
// cerr<<"Zyx "<<i<<' '<<pos<<endl;
if(pos<q[i].x1)continue;
ans[q[i].id]=true;
}
// cerr<<"--------------"<<endl;
return;
}
inline void trans(){
swap(n,m);
for(int i=1;i<=k;i++)swap(a[i].x,a[i].y);
for(int i=1;i<=Q;i++)swap(q[i].x1,q[i].y1),swap(q[i].x2,q[i].y2);
return;
}
signed main(){
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k>>Q;
for(int i=1;i<=k;i++)cin>>a[i].x>>a[i].y;
for(int i=1,x1,y1,x2,y2;i<=Q;i++){
cin>>x1>>y1>>x2>>y2;
q[i]={x1,y1,x2,y2,i};
}
solve();trans();solve();
for(int i=1;i<=Q;i++)cout<<(ans[i]?"YES\n":"NO\n");
return 0;
}
/*
4 3 3 3
1 1
3 2
2 3
2 3 2 3
2 1 3 3
1 2 2 3
*/
T4
斜率优化板子
小结
满屏的线段树,美好的不存在
后记
世界孤立我任它奚落
完结撒花!

浙公网安备 33010602011771号