• R574


    囍狠了。备案完了。然后好像好像被我瞎改了什么现在主页啥的全都访问不了了。

    F:闵可夫斯基和。有个结论是凸包的点数等于向量的种类数。

    所以我们维护区间不同向量的个数就行。

    #include <bits/stdc++.h>
    #define pii pair<int,int>
    #define mk(a,b) make_pair(a,b)
    #define rep(jiantongyingwolaopo) for(int i=1;i<=jiantongyingwolaopo;i++)
    using namespace std;
    typedef long long ll;
    const int N = 1e6+5;
    int bit[N];
    int lowbit(int x){return x&-x;}
    void upd(int pos,int x){
        while (pos<N){
            bit[pos]+=x;
            pos+=lowbit(pos);
        }
    }
    int sum(int pos){
        int res=0;
        while (pos){
            res+=bit[pos];
            pos-=lowbit(pos);
        }
        return res;
    }
    pii slove(int a,int b){
        int p = __gcd(abs(a),abs(b));
        if(p)a/=p,b/=p;
        return mk(a,b);
    }
    struct ASK{
        int id,l,r;
        bool operator <(const ASK a)const {
            if(l==a.l)return r<a.r;
            return l<a.l;
        }
    }q[N];
    map<pii,int> head;
    pii a[N];int cnt=0;
    int x[N],y[N],nxt[N];
    int n,k,l[N],r[N],ans[N];
    set<pii>st;
    int main(){
    //    int p = __gcd(126871236,-99999999);
        ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>k;
            for(int j=0;j<k;j++)cin>>x[j]>>y[j];
            x[k]=x[0],y[k]=y[0];
            l[i]=cnt;
            for(int j=0;j<k;j++){
               a[++cnt]=(slove(x[j+1]-x[j],y[j+1]-y[j]));
               st.insert(a[cnt]);
            }
            r[i]=cnt;
        }
    //    for(int i=1;i<=cnt;i++)cout<<a[i].first<<' '<<a[i].second<<"    ";
    //    cout<<endl;
        for(int i=cnt;i>=1;i--){
            nxt[i]=head[a[i]];
            head[a[i]]=i;
        }
        for(auto x:st){
            if(head[x]) {
                upd(head[x], 1);
    //            cout<<head[x]<<' ';
            }
        }
    //    cout<<endl;
        cin>>k;int a,b;
        for(int i=1;i<=k;i++){
            cin>>a>>b;
            q[i].id=i;q[i].l=l[a];q[i].r=r[b];
        }
    
        sort(q+1,q+1+k);
        int las=1;
        for(int i=1;i<=k;i++){
            while (las<=q[i].l){
                if(nxt[las])
                    upd(nxt[las],1);
                las++;
            }
            ans[q[i].id]=sum(q[i].r)-sum(q[i].l);
        }
        for(int i=1;i<=k;i++)cout<<ans[i]<<endl;
    }
    View Code

    E:网上一搜到处都是。。。我随便找了个改了改。。。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 3e3+1;
    struct Node{
        int x,y,val;
    }node[N][N],mn[N][N];
    int n,m,a,b,x,y,z;
    int g[3001*3001];
    deque<Node>q2;
    int main(){
        ios::sync_with_stdio(false);
        cin>>n>>m>>a>>b>>g[0]>>x>>y>>z;
        for(int i=1;i<=n*m;i++) g[i]=(1ll*g[i-1]*x+y)%z;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                node[i][j].x=i,node[i][j].y=j;
                node[i][j].val=g[(i-1)*m+j-1];
            }
        }
        for(int i=1;i<=n;i++){
            while (!q2.empty())q2.pop_back();
            for(int j=1;j<=m;j++){
                while (!q2.empty()&&q2.front().y+b<=j)
                    q2.pop_front();
                while (!q2.empty()&&q2.back().val>=node[i][j].val)
                    q2.pop_back();
                q2.push_back(node[i][j]);
                if(j>=b)
                    mn[i][j-b+1].x=i,mn[i][j-b+1].y=j-b+1,mn[i][j-b+1].val = q2.front().val;
            }
        }
        for(int j=1;j<=m;j++){
            while (!q2.empty())q2.pop_back();
            for(int i=1;i<=n;i++){
                while (!q2.empty() && q2.front().x + a <= i)
                    q2.pop_front();
                while (!q2.empty() && q2.back().val >= mn[i][j].val)
                    q2.pop_back();
                q2.push_back(mn[i][j]);
                if (i >= a)
                    node[i - a+ 1][j].x = i - a + 1, node[i - a + 1][j].y = j, node[i - a + 1][j].val = q2.front().val;
    
            }
        }
        ll ans=0;
        for(int i=1;i<=n-a+1;i++){
            for(int j=1;j<=m-b+1;j++){
                ans+=node[i][j].val;
            }
        }
        cout<<ans<<endl;
    }
    View Code

    D:分长度和 数字在前面或者在后面,考虑每位会乘上10的几次方

    C:什么傻逼。

    B:二分,也可以直接枚举,

    A:暴力。

  • 相关阅读:
    ALinq Dynamic 使用指南——前言
    前端与后端分离的架构实例(三)
    前端与后端分离的架构实例(二)
    启动画面QSplashScreen鼠标点击的时候不退出
    Qt组件屏蔽鼠标激活
    Qt LNK2001错误
    QtDesigner中设定一个组件位于另一个组件上方
    QToolButton设置图片
    osgearth_package切片工具切局部影像或者高程tif无法生成切片问题;切完数据集无法显示问题
    Qt输入框添加搜索按钮,以及自动补全内容
  • 原文地址:https://www.cnblogs.com/MXang/p/11213759.html
Copyright © 2020-2023  润新知