囍狠了。备案完了。然后好像好像被我瞎改了什么现在主页啥的全都访问不了了。
F:闵可夫斯基和。有个结论是凸包的点数等于向量的种类数。
所以我们维护区间不同向量的个数就行。
#include#define pii pair #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 head;pii a[N];int cnt=0;int x[N],y[N],nxt[N];int n,k,l[N],r[N],ans[N];set 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 >x[j]>>y[j]; x[k]=x[0],y[k]=y[0]; l[i]=cnt; for(int j=0;j =1;i--){ nxt[i]=head[a[i]]; head[a[i]]=i; } for(auto x:st){ if(head[x]) { upd(head[x], 1);// cout< <<' '; } }// cout< >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< <
E:网上一搜到处都是。。。我随便找了个改了改。。。
#includeusing 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 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< <
D:分长度和 数字在前面或者在后面,考虑每位会乘上10的几次方
C:什么傻逼。
B:二分,也可以直接枚举,
A:暴力。