CF #439 E The Untended Antiquity

本文介绍了一种解决CF#439E问题的方法,利用随机化的二维树状数组来实现对矩形区域的操作,包括添加和删除标记,并通过查询判断两个点是否位于相同的矩形集合中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CF #439 E The Untended Antiquity

随机化·二维BIT

题解:

添加一个矩形相当于为矩形内部的每个点都打上一个“在某个矩形内”的标记。

查询的时候只要查询两个点的标记序列是否完全一样就行了。

标记序列不好维护,直接把它变成一个数,类似于对它hash。

要求可以撤销,xor是一个不错的选择。加减好像也可以。

为了减少冲突,每个矩形的标记设为一个随机的unsigned long long

矩形区域加、删一个值很容易想到二维树状数组。

Code:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <map>
#define D(x) cout<<#x<<" = "<<x<<"  "
#define E cout<<endl
using namespace std;
typedef unsigned long long ull;
const int N = 2500;
const ull Base = 1e5+7;

int n,m,q;
map<ull,ull> mp;

struct BIT{
    ull c[N+5][N+5];
    inline int lowbit(int x){ return x&(-x); }
    void add(int x,int y,ull d){
        for(int i=x;i<=N;i+=lowbit(i))
        for(int j=y;j<=N;j+=lowbit(j))
            c[i][j] ^= d;
    }
    ull get(int x,int y){
        ull res=0;
        for(int i=x;i;i-=lowbit(i))
        for(int j=y;j;j-=lowbit(j))
            res ^= c[i][j];
        return res;
    }
} bit;

ull random(){ return (ull)rand()*rand()*rand(); }

ull hash(ull a,ull b,ull c,ull d){ return a*Base*Base*Base + b*Base*Base + c*Base + d; }

int main(){
    freopen("5.in","r",stdin);
    scanf("%d%d%d",&n,&m,&q);
    ull d; int op,r1,c1,r2,c2;
    while(q--){
        scanf("%d%d%d%d%d",&op,&r1,&c1,&r2,&c2);
        if(op==3){
            if(bit.get(r1,c1) == bit.get(r2,c2)) puts("Yes"); 
            else puts("No");
            continue;
        }
        if(op==2){
            d=mp[hash(r1,c1,r2,c2)];
        }
        if(op==1){
            d=random();
            mp[hash(r1,c1,r2,c2)]=d;
        }
//      D(op); D(r1); D(c1); D(r2); D(c2); D(d); E;
        bit.add(r1,c1,d);
        bit.add(r1,c2+1,d);
        bit.add(r2+1,c1,d);
        bit.add(r2+1,c2+1,d);
    }
}
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在Android开发过程中,要实现对设备的自动化测试或模拟用户操作,可以通过代码模拟点击来达成。接下来就来详细说说利用ADB工具,借助shell命令的sendevent指令模拟触摸屏事件的过程及相关知识。 Android Debug Bridge(ADB):这是Android开发者常用的工具,它使开发者能够在电脑上与连接的Android设备进行交互,完成调试、日志输出、应用安装、执行shell命令等众多操作。 Shell命令:在Android设备上,可通过shell命令行来执行系统级别的各类操作,其中sendevent命令可用于模拟输入事件,像触摸屏的点击、滑动等操作都可实现。 sendevent命令详解:sendevent命令是通过向Linux内核的输入子系统发送模拟事件来工作的,其基本格式是sendevent <设备路径> <事件类型> <事件代码> <事件值>。其中,“设备路径”一般为/dev/input/event*,是设备输入事件的接口;“事件类型”有EV_SYN(同步事件)、EV_KEY(按键事件)、EV_ABS(绝对坐标事件)等常见类型;“事件代码”对应着具体的按键或触摸屏坐标等,例如对于触摸屏,会涉及ABS_X和ABS_Y;“事件值”则是事件的具体数值,像坐标位置、按键状态等。 模拟点击操作步骤:首先通过adb connect <设备IP>:<端口号>命令利用ADB连接到设备。接着使用getevent -l命令找到触摸屏的设备路径。然后构造sendevent命令来模拟点击,比如模拟在(100, 200)位置点击,命令如下: 执行这些命令就能完成一次点击操作的模拟。 5. EventInjector类:提供的名为EventInjector的压缩包文件可能是一个Java类,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值