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

Santa Claus 2 (st表的lower_bound用法)

题目链接:Santa Claus 2

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define int long long
#define fi first 
#define se second
#define all(v) v.begin(),v.end()
using namespace std;
const int inf = 0x3f3f3f3f3f3f3f;
const int N = 2e5+5;
int n,m,sx,sy;
int dx[] = {0,0,1,-1};//U D R L
int dy[] = {1,-1,0,0};
map<int,set<int>>stx;
map<int,set<int>>sty;
map<pair<int,int>,int>mp;

void solve(){
    cin>>n>>m>>sx>>sy;
    for(int i=1;i<=n;i++){
        int x,y;cin>>x>>y;
        stx[x].insert(y);
        sty[y].insert(x);
    }

    int nx = sx;
    int ny = sy;
    int ans = 0;

    for(int i=1;i<=m;i++){
        char op;cin>>op;
        int d;cin>>d;
        if(op == 'U'){
            auto be = stx[nx].lower_bound(ny);
            auto ed = stx[nx].upper_bound(ny + d);
            vector<int>vec;
            for(auto it = be ; it != ed ; it++){
                if(!mp[{nx , *it}]){
                    vec.push_back(*it);
                    mp[{nx , *it}] = 1;
                    ans++;

                }
            }
            for(auto &y:vec){
                stx[nx].erase(y);
            }
            ny += d;
        }
        else if(op == 'D'){
            auto be = stx[nx].lower_bound(ny - d);
            auto ed = stx[nx].upper_bound(ny);
            vector<int>vec;
            for(auto it = be ; it != ed ; it++){
                if(!mp[{nx , *it}]){
                    vec.push_back(*it);
                    mp[{nx , *it}] = 1;
                    ans++;
                }
            }
            for(auto &y:vec){
                stx[nx].erase(y);
            }
            ny -= d;

        }
        else if(op == 'R'){
            auto be = sty[ny].lower_bound(nx);
            auto ed = sty[ny].upper_bound(nx + d);
            vector<int>vec;
            for(auto it = be ; it != ed ; it++){
                if(!mp[{*it , ny}]){
                    vec.push_back(*it);
                    mp[{*it , ny}] = 1;
                    //cout<<(*it)<<" "<<ny<<"\n";
                    ans++;
                }
            }
            for(auto &y:vec){
                sty[ny].erase(y);
            }
            nx += d;
        }
        else{
            auto be = sty[ny].lower_bound(nx - d);
            auto ed = sty[ny].upper_bound(nx);
            vector<int>vec;
            for(auto it = be ; it != ed ; it++){
                if(!mp[{*it , ny}]){
                    //cout<<sty[ny].count(*it)<<"\n";
                    //sty[ny].erase(*it);
                    vec.push_back(*it);
                    mp[{*it , ny}] = 1;
                    //cout<<(*it)<<" "<<ny<<"\n";
                    ans++;
                }
            }
            for(auto &y:vec){
                sty[ny].erase(y);
            }
            nx -= d;
        }
    }

    cout<<nx<<" "<<ny<<" "<<ans<<"\n";
    
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T = 1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}


http://www.kler.cn/a/455151.html

相关文章:

  • 工作编码案例--UDP多播 和 本地套接字bind
  • Flink CDC MySQL 同步数据到 Kafka实践中可能遇到的问题
  • SQL 实战:日期与时间函数 – 统计数据的时间跨度与趋势
  • C#控件开发3—文本显示、文本设值
  • 双指针——查找总价格为目标值的两个商品
  • JVM的详细介绍
  • Elasticsearch:analyzer(分析器)
  • canvas之进度条
  • 音视频入门知识(六):消息获取模式篇
  • nexus docker安装
  • 使用 Three.js 创建圣诞树场景
  • 指针详解之 多层嵌套的关系
  • ES和MONGODB备份脚本
  • [Android]按下扫描键时启动一个线程来执行某些操作
  • 大语言模型的token和向量
  • PDF书籍《手写调用链监控APM系统-Java版》第7章 插件与链路的结合:Tomcat插件实现
  • 模方要使用多机引擎,有什么要求
  • Vue.js组件开发-实现访问页面自动获取数据
  • 119.【C语言】数据结构之快速排序(调用库函数)
  • AI 神经网络在智能家居场景中的应用
  • springboot系列教程(三十一):springboot整合Nacos组件,环境搭建和入门案例详解
  • QWidget应用封装为qt插件,供其他qt应用调用
  • PDF书籍《手写调用链监控APM系统-Java版》第12章 结束
  • 【论文复现】农作物病害分类(Web端实现)
  • 一文详解MacOS+CLion——构建libtorch机器学习开发环境
  • ASP.NET WebForms:实现全局异常捕获与处理的最佳实践