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:暴力。

 

posted @ 2019-07-19 15:52  MXang  阅读(175)  评论(0编辑  收藏  举报