spinmry's Lab

绝赞摸鱼中Orz

Category

  • Algorithm
  • Hardware
  • Homelab
  • Programming
  • Retro
  • Software

Tags

  • 算法
  • OI
  • Linux
  • 数据结构
  • HardwareHacking
  • Homelab
  • ARM
  • 计算设备
  • Vintage
  • 图论
  • Kruskal
  • 平衡树
  • RobotC
  • 单片机
  • QQBot
  • 离散化
  • Nspire
  • 线段树
  • VEX
  • 机器人
  • 树状数组
  • 爬虫
  • ACG
  • 分块
  • Wolfram
  • 网页
  • Mattermost
  • 数论
  • CUDA
  • STM32
  • Python
  • iLO
  • Mac
  • 动态规划
  • Tarjan
  • Loongson

Recent replies

  • Mizu 发表于「在 macOS 上运行 iSCSI 无盘 Linux 虚拟机」
  • Prelina 发表于「在 macOS 上运行 iSCSI 无盘 Linux 虚拟机」
  • jiyouzhan 发表于「使用 Debian + libvirt + WebVirtCloud 作为 homelab 虚拟化平台」
  • jianchen 发表于「在 Loongson 2F 上编译 Common Desktop Environment」
  • rantrism 发表于「解决 Linux Optimus 混合模式下独立显卡外接显示器卡顿的问题」

友情链接

空白酱
Woshiluo
FlyGoat
BeyondLimits
Memo von EFS
Paizhang
Ntzyz
ZephRay
Polarnova
Tautcany
NekoDaemon
MaxAlex
Abyss Studio
EE Archeology 电子考古学
桜庭清夏的小站
欠陥電気の摸鱼小池
白玉楼製作所
naivekun's blog

娱乐向跑分

Coremark
Linpack

BZOJ 1858 [SCOI2010] 序列操作

2019 年 4 月 19 日分类:Algorithm#算法#OI#数据结构#线段树

BZOJ 1858 [SCOI2010] 序列操作

本来想用线段树做,但是考虑到用线段树的话pushup,pushdown函数有点复杂... 看到题目有覆盖操作立刻想到了珂朵莉树,于是现学了一波然后改了一下模板A了这道题。 (珂学是个好东西) (刷这道题全程循环夢違科(珂)学世紀2333333)

MORE

Luogu 4932 浏览器

2019 年 3 月 21 日分类:Algorithm#算法#数论#OI

Luogu 4932 浏览器

这道题是某次 Luogu 月赛的题目。关于这道题的代码,非常神奇的是,这是比赛时某学长看到管理员提交记录的编译信息中含有一句神奇的内建函数 __builtin_popcount() ,然后根据那句话反推出来的。(喂喂喂这算作弊吧) 下面是 GNU 对这个函数的定义

    
    — Built-in Function: 
    int __builtin_popcount (unsigned int x)
    Returns the number of 1-bits in x.

然后是代码

    
    // luogu-judger-enable-o2
    #include <iostream>
    #include <cstdio>                                                       
    using namespace std; //define                                           
    unsigned long long ans[3],n,a,b,c,d,x; //main
    int main(){
        ios::sync_with_stdio(false);
        cin>>n>>a>>b>>c>>d>>x;                                                      
        for(int i=1;i<=n;i++){
            x=(a%d*(x%d*x%d)+b*x%d+c)%d;ans[__builtin_popcount(x)&1]++;
        }
        cout<<ans[0]*ans[1]<<endl;
        return 0;
    }

Comments

xkzzzz: 大家好我是传说中的学长

Luogu 2783 有机化学之神偶尔会做作弊

2019 年 3 月 21 日分类:Algorithm#算法#Kruskal#Tarjan#图论#OI

Luogu 2783 有机化学之神偶尔会做作弊

去年NOIP之前做的,人生中第一道黑题,真是可喜可贺可喜可贺(虽然参考了题解) Tarjan缩点重新构图,然后统计题目给定两点的树上距离即可。 上代码

MORE

BZOJ 1067 [SCOI2007]降雨量

2019 年 3 月 12 日分类:Algorithm#算法#数据结构#线段树#离散化

BZOJ 1067 [SCOI2007]降雨量

todolist清理计划--; 很久很久以前暑假留的作业= = 将年份离散化,用线段树简单的维护最值,然后依照提议判断就好。

    #include <iostream>
    #include <cstdio>
    #define MAYBE cout << "maybe" << endl
    #define TRUE cout << "true" << endl
    #define FALSE cout << "false" << endl
    using namespace std;
    
    //define
    const int maxn = 50000 + 5;
    int year[maxn], val[maxn], tree[maxn << 2];
    int n, m;
    
    void build(int rt, int l, int r){
        if(l == r){
            tree[rt] = val[l];return ;
        }
        int mid = l + r >> 1;
        build(rt << 1, l ,mid);
        build(rt << 1 | 1, mid + 1, r);
        tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1]);
    }  
    
    int query(int rt, int l, int r, int ll, int rr){
        if(ll <= l && r <= rr){
            return tree[rt];
        }
        int mid = l + r >> 1;
        int ans = -1 * 0x7f7f7f7f;
        if(ll <= mid)ans = max(ans, query(rt << 1, l, mid, ll, rr));
        if(rr > mid)ans = max(ans, query(rt << 1 | 1, mid + 1, r, ll, rr));
        return ans;
    }
    
    int main(){
        ios::sync_with_stdio(false);
        cin >> n;
        for(register int i = 1; i <= n; ++i)cin >> year[i] >> val[i];
        build(1, 1, n);
        cin >> m;
        while(m--){
            int x,y,u,v;
            cin >> y >> x;
            if(y >= x) { FALSE; continue; }
            u=lower_bound(year+1, year+n+1, y) - year;
            v=lower_bound(year+1, year+n+1, x) - year;
            if(y == year[u] && x == year[v]){
                if(val[u] < val[v]) FALSE;
                else if(v == u+1){
                    if(x == y+1)TRUE;
                    else MAYBE;
                }
                else{
                    int w = query(1, 1, n, u+1, v-1);
                    if(w >= val[v])  FALSE; 
                    else{
                        if(x-y == v-u)TRUE;
                        else MAYBE;
                    }
                }
            }
            else if(y != year[u] && x == year[v]){
                if(u == v) MAYBE;
                else{
                    int w = query(1, 1, n, u, v-1);
                    if(w >= val[v]) FALSE;
                    else MAYBE;
                }
            }
            else if(y == year[u] && x != year[v]) {
                if(v == u+1) MAYBE;
                else{
                    int w = query(1, 1, n, u+1, v-1);
                    if(val[u] <= w) FALSE;
                    else MAYBE;
                }
            }
            else if(y != year[u] && x != year[v]) MAYBE;
        }
        return 0;
    }

VEX Robot C 入门教程 #2 手柄控制

2019 年 3 月 9 日分类:Programming#机器人#VEX#RobotC
提示:在继续阅读之前,请注意此文章最后更新于 2321 天前,其中的部分内容可能已经无效或过时。

VEX Robot C 入门教程 #2 手柄控制

0x00 手柄概览

VEX 手柄共有四组按键与两组摇杆。 在 Robot C 中,手柄的操作也被抽象到一个数组 vexRT[] 上。 在这个数组中,按键以 BtnXY 命名,其中 X 代表按键属于哪一组,Y 代表按键具体的名称。比如 Btn7U 代表第七组按键的 U 键。而摇杆以通道 ChX 命名,其中 X 代表第几通道摇杆。比如 Ch1 代表第一通道的摇杆。 当一个按键按下时,vexRT 数组中对应下标的值会变为 1,而未按下时,数组对应下标的值为 0。 下面是判断一个按键是否被按下的代码,当按键 7U 被按下时,电机 port2 开始以最大速度正转,当按键被松开时,电机 port2 停止转动。

    if(vexRT[Btn7U] == 1){
        motor[port2] = 127;
    }
    else if(vexRT[Btn7U] == 0){
        motor[port2] = 0;
    }

摇杆输出的是一个线性变化的值,其区间大约在 $$[-127,127]$$ 之间,也就是说,我们可以将摇杆值直接赋值给电机,从而实现摇杆控制电机转速。

    int speed = vexRT[Ch1];
    motor[port2] = speed;

0x01 摇杆与机器人控制

上面我们了解了如何通过编程获取手柄按键与摇杆的状态,下面我们将利用上面的知识开始实际操作。 假设我们的机器人有四个电机分别驱动机器人的前后左右四个轮子,我们将用两种方式通过摇杆控制机器人的运动。 以下的代码是双摇杆控制机器人运动的例子。通过两边摇杆的控制来使机器人比较灵活的前后运动与转弯。

    
    #pragma config(Motor,  port2,           right_front,   tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port7,           left_back,     tmotorVex393_MC29, openLoop, reversed)
    #pragma config(Motor,  port8,           right_back,    tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port9,           left_front,    tmotorVex393_MC29, openLoop, reversed)
    
    int left_speed, right_speed, rtX, rtY;
    const int noise = 15;//这里指摇杆的"噪音",即当摇杆值大于这个值时电机才会开始运动。
    
    void DualJoystick(){
        left_speed = vexRT[Ch3];
        right_speed =vexRT[Ch2];
        if(abs(left_speed) > noise && abs(right_speed) > noise){
            motor[right_back] = -1 * right_speed;
            motor[right_front] = -1 * right_speed;
            motor[left_back] = -1 * left_speed;
            motor[left_front] = -1 * left_speed;
        }else{
            motor[right_back] = 0;
            motor[right_front] = 0;
            motor[left_back] = 0;
            motor[left_front] = 0;
        }
    }

而如果我们要使用单个摇杆控制,我们就要用到差速法,通过获取单个摇杆横竖两个通道的值,分别计算两侧轮子需要的功率,从而实现机器人灵活的操作。 下面是代码。

    
    #pragma config(Motor,  port2,           right_front,   tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port7,           left_back,     tmotorVex393_MC29, openLoop, reversed)
    #pragma config(Motor,  port8,           right_back,    tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port9,           left_front,    tmotorVex393_MC29, openLoop, reversed)
    
    int left_speed, right_speed, rtX, rtY;
    const int noise = 15;//这里指摇杆的"噪音",即当摇杆值大于这个值时电机才会开始运动。
    
    void SingleJoystick(){
        rtX = vexRT[Ch4];
        rtY = vexRT[Ch3];
        if(abs(rtX) > noise || abs(rtY) > noise){
            if(rtY > -1 * noise){
                left_speed = ((-1 * rtY) - rtX) >> 1;
                right_speed = ((-1 * rtY) + rtX) >> 1;
            }
            else if(rtY < -1 * noise){
                left_speed = ((-1 * rtY) + rtX) >> 1;
                right_speed = ((-1 * rtY) - rtX) >> 1;
            }
        }
        else{
            right_speed = 0;
            left_speed = 0;
        }
        motor[left_back] = left_speed;
        motor[left_front] = left_speed;
        motor[right_back] = right_speed;
        motor[right_front] = right_speed;
    }
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Copyright © 2019-2023 spinmry. All rights reserved.
Except where otherwise noted, content on this blog is licensed under CC BY-SA 4.0.