炫酷划线

1012 篇文章 45 订阅

https://ac.nowcoder.com/acm/contest/331/E

C++版本一

题解:

std

题意转化为:读入一些区间,输出直到有区间交叉的第一个位置。

正经解法:

考虑线段树维护最小值。将左端点值赋值在右端点下标,查询左闭右开内最小值是否小于左端点。

随意解法:

树状数组哈希即可,具体的做法是对于每次连线,随机一个足够随机的值s,然后在首尾分别加上s和减去s,每次查询连线的区间是否和为0即可。

如果和不为0,说明有线交叉了。

时间复杂度O(mlogn)

#include <bits/stdc++.h>
 
using namespace std;
 
//因为本题标程过长,故只放出不正经解法。
 
const int mn = 1e5 + 5;
typedef long long ll;
 
int n, m;
int a[mn], b[mn];
 
int rrand() {  //一种简易的随机方法
    return (rand() << 15) + rand();
}
 
ll t[mn];
void add(int i, int x) {
    while (i <= n) t[i] += x, i += i & -i;
}
ll sum(int i) {
    ll s = 0;
    while (i) {
        s += t[i];
        i -= i & -i;
    }
    return s;
}
ll sum(int l, int r) { return sum(r) - sum(l - 1); }
 
int main() {
    int T;
    cin >> T;
    while (T--) {
        memset(t, 0, sizeof t);
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++) {
            scanf("%d%d", &a[i], &b[i]);
        }
        int ans = -1;
        for (int i = 1; i <= m; i++) {
            if (a[i] > b[i]) swap(a[i], b[i]);
            if (sum(a[i], b[i]) != 0) {
                ans = i;
                break;
            }
            int u = rrand();
            add(a[i], u);
            add(b[i], -u);
        }
        printf("%d\n", ans);
    }
 
    return 0;
}

 

CSS可以实现很多鼠标移动的炫酷动画效果,这里为你提供一些示例代码: 1. 鼠标移动时跟随鼠标的文本效果: ``` <style> .text { position: absolute; color: #fff; font-size: 24px; top: 50%; left: 50%; transform: translate(-50%, -50%); transition: transform 0.3s ease; } .text:hover { transform: translate(-50%, -50%) scale(1.5); } </style> <div class="text">Hover Me</div> ``` 2. 鼠标移动时出现波浪线效果: ``` <style> .wave { position: relative; height: 50px; background-color: #fff; overflow: hidden; } .wave::before { content: ""; position: absolute; width: 100%; height: 20px; background-image: radial-gradient(circle at 0 100%, #fff, transparent 50%); top: -10px; left: 0; transform: scaleX(0); transition: transform 0.3s ease; } .wave:hover::before { transform: scaleX(1); } </style> <div class="wave">Hover Me</div> ``` 3. 鼠标移动时出现3D立方体翻转效果: ``` <style> .cube { position: relative; width: 100px; height: 100px; perspective: 1000px; transition: transform 0.5s ease; } .cube:hover { transform: rotateY(180deg); } .cube div { position: absolute; width: 100%; height: 100%; background-color: #f00; backface-visibility: hidden; } .cube .front { transform: translateZ(50px); } .cube .back { transform: translateZ(-50px) rotateY(180deg); } </style> <div class="cube"> <div class="front"></div> <div class="back"></div> </div> ``` 这些示例代码只是一部分,你可以根据自己的需求和想法,自由发挥CSS的强大功能,创造出更加炫酷的动画效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starzkg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值