CF1045
Posted gaojunonly1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1045相关的知识,希望对你有一定的参考价值。
当然不是全部的题啦,我只是整理一下昨天做的两道题,写了个标题其实只是凑字数的
_pfy_大佬写的blog很清楚的然而我并没有看懂,于是自己瞎鸡巴yy了一下,可知若一个数X不能被表示出来,那么X所有的表示方法都在A集合中,如a1,a2,a3······an-1,an-2中若a1+ai不能被表示出来,那么如果a1到ai是回文(这里回文是指a2-a1=an-an-1,a3-a2=an-1-an-1大概懂了就可以),这样用一个数组存一下两两之间的差哈希一下就可以了
#include <cstdio> #include <algorithm> using namespace std; #define int long long const int N=200005,md=998244353,ha=2333; int n,m,a[N],b[N],de[N],has1[N],has2[N],re[N],cnt=0; inline bool jud(int l,int r) { return ((has1[r]-has1[l-1]*de[r-l+1]%md+md)%md==(has2[l]-has2[r+1]*de[r-l+1]%md+md)%md)?1:0; } signed main() { int i,bo; scanf("%lld%lld",&n,&m); for(i=1;i<=n;i++)scanf("%lld",&a[i]); sort(a+1,a+n+1); for(i=1;i<n;i++)b[i]=a[i+1]-a[i]; de[0]=1LL; for(i=1;i<=n;i++)de[i]=de[i-1]*ha%md; for(i=1;i<n;i++)has1[i]=(has1[i-1]*ha%md+b[i])%md; for(i=n-1;i>=1;i--)has2[i]=(has2[i+1]*ha%md+b[i])%md; for(i=1;i<=n;i++) { bo=1; if(i!=1)bo&=jud(1,i-1); if(i!=n) { bo&=(a[1]+a[i]+m==a[i+1]+a[n]); if(i!=n-1)bo&=jud(i+1,n-1); }if(bo)re[++cnt]=(a[1]+a[i])%m; }printf("%lld ",cnt); sort(re+1,re+cnt+1); for(i=1;i<=cnt;i++)printf("%lld ",re[i]); }
看了下题解,动态开点线段树,好像挺难的
#include <map> #include <cstdio> #include <algorithm> using namespace std; const int N=100005,M=5000005,inf=1e9; int n,k,tot=0; map<int,int>mp; struct node{int x,r,q;}a[N]; inline bool cmp(node a,node b){return a.r>b.r;} struct segtree{int l,r,sum;}Tree[M]; inline int que(int x,int l,int r,int xx,int yy) { if(!x)return 0; if(xx<=l&&r<=yy)return Tree[x].sum; int mid=(l+r)>>1,re=0; if(xx<=mid)re+=que(Tree[x].l,l,mid,xx,yy); if(yy>mid)re+=que(Tree[x].r,mid+1,r,xx,yy); return re; } inline void ins(int po,int l,int r,int &x) { if(!x) x=++tot; Tree[x].sum++; if(l==r)return; int mid=(l+r)>>1; if(po<=mid)ins(po,l,mid,Tree[x].l);else ins(po,mid+1,r,Tree[x].r); } int main() { int i,j;long long re=0; scanf("%d%d",&n,&k); for(i=1;i<=n;i++) { scanf("%d%d%d",&a[i].x,&a[i].r,&a[i].q); }sort(a+1,a+n+1,cmp); for(i=1;i<=n;i++) { for(j=a[i].q-k;j<=a[i].q+k;j++) { re+=(long long)que(mp[j],-inf,inf,a[i].x-a[i].r,a[i].x+a[i].r); }ins(a[i].x,-inf,inf,mp[a[i].q]); }printf("%lld ",re); }
以上是关于CF1045的主要内容,如果未能解决你的问题,请参考以下文章