囍狠了。备案完了。然后好像好像被我瞎改了什么现在主页啥的全都访问不了了。
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; }
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; }
D:分长度和 数字在前面或者在后面,考虑每位会乘上10的几次方
C:什么傻逼。
B:二分,也可以直接枚举,
A:暴力。