数据结构测试2 on 2019.9.25
Posted ljb666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构测试2 on 2019.9.25相关的知识,希望对你有一定的参考价值。
又是一天的数据结构,但今天直接爆炸,1题和3题都写挂了200->0。
T1 abnormal
一开始想的是线段树,但是自己感觉维护不来,果断放弃线段树。这时又想到离线的莫队做法,本以为这道题稳了,结果最后还是打炸了。题面意思都搞错了,真的是个傻逼。
这道题对于莫队来讲就是最简单的莫队,用一个数组cnt来维护每个魅力值的出现次数即可,但注意在统计出现次数的时候,还是要加注意,因为题目中定义的不正常团伙是只能出现2次,所以少于两次的和超过两次的都要累加他们的贡献。需要小小的特判。
代码如下:
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; struct node int l,r,id; long long ans; mo[maxn*4]; int belong[maxn]; int block; bool cmp(node a,node b) return (a.l/block)^(b.l/block)?a.l<b.l:(((a.l/block)&1)?a.r<b.r:a.r>b.r); int cnt[maxn]; long long ans; int a[maxn]; int vis[maxn]; inline void add(int x) cnt[a[x]]++; if(cnt[a[x]]>3) ans+=a[x]; else if(cnt[a[x]]==3) ans+=a[x]*cnt[a[x]]; else if(cnt[a[x]]==2) ans-=a[x]; else ans+=a[x]; inline void del(int x) cnt[a[x]]--; if(cnt[a[x]]>2) ans-=a[x]; else if(cnt[a[x]]==2) ans-=3*a[x]; else if(cnt[a[x]]==1) ans+=a[x]; else ans-=a[x]; int n,m; long long all[maxn]; int main() scanf("%d%d",&n,&m); block=sqrt(n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); belong[i]=(i-1)/block+1; mo[i].id=i; int l=1,r=0; for(int i=1;i<=m;i++) scanf("%d%d",&mo[i].l,&mo[i].r); sort(mo+1,mo+1+m,cmp); //for(int i=1;i<=m;i++) printf("%d %d\\n",mo[i].l,mo[i].r); for(int i=1;i<=m;i++) while(l<mo[i].l) del(l++); while(r>mo[i].r) del(r--); while(l>mo[i].l) add(--l); while(r<mo[i].r) add(++r); all[mo[i].id]=ans; for(int i=1;i<=m;i++) printf("%lld\\n",all[i]); return 0;
T2 irregular
待改 dsu on tree
T3 unnormal
中位数?直接大力平衡树。但是最后全wa?为什么,longlong乘的时候不乘1ll见祖宗。
但我唯一会的平衡树就是splay,splay常数又过大,这道题来讲最后一个点卡splay,怎么卡都卡不过。
90分代码如下(加了若干优化还是过不了):
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3) #include<iostream> #include<cstdio> #include<ctime> #include<cstdlib> #include<cstring> #include<algorithm> #define Ri register int #define sswap(x,y) x^=y^=x^=y; template <class T> T mmin(T x,T y)return(x)<(y)?(x):(y); template <class T> T mmax(T x,T y)return(x)<(y)?(y):(x); template <class T> T lowbit(T x)return ((x)&(-(x))); typedef long long ll; using namespace std; namespace io const int MT=5e7; char buf[MT];ll c,sz; void begin()c=0;sz=fread(buf,1,MT,stdin); template<class T> inline bool read(T &t) while(c<sz&&buf[c]!=‘-‘&&(buf[c]<‘0‘||buf[c]>‘9‘))c++; if(c>=sz)return false; bool flag=0;if(buf[c]==‘-‘)flag=1,c++; for(t=0;c<sz&&‘0‘<=buf[c]&&buf[c]<=‘9‘;c++)t=t*10+buf[c]-‘0‘; if(flag==1)t=-t;return true; template <typename _TpInt> inline void write(_TpInt x) if (x<0) putchar(‘-‘); write<_TpInt>(~x+1); else if (x>9)write<_TpInt>(x/10); putchar(x%10+‘0‘); const int maxn=1e6+7; const int inf=0x7fffffff; const int mod=1e9+7; int ch[maxn][2],fa[maxn],siz[maxn],cnt[maxn]; long long key[maxn]; int rt,sz; long long fi; long long sum; int a,b,c,n; long long min(long long a,long long b) return a<b?a:b; bool check(int x) return ch[fa[x]][1]==x; void pushup(int x) siz[x]=siz[ch[x][1]]+siz[ch[x][0]]+cnt[x]; void rotate(int x) int y=fa[x],z=fa[y],who=check(x); ch[y][who]=ch[x][who^1]; fa[ch[y][who]]=y; ch[x][who^1]=y; fa[y]=x,fa[x]=z; if(z) ch[z][ch[z][1]==y]=x; pushup(y);pushup(x); void splay(int x) for(int f;(f=fa[x]);rotate(x)) if(fa[f]) rotate((check(x)==check(f))?f:x); rt=x; void insert(int x) if(!rt) rt=++sz; key[sz]=x; siz[sz]=cnt[sz]=1; return; int now=rt,f=0; while(1) if(x==key[now]) cnt[now]++; pushup(f); pushup(now); splay(now); return; f=now,now=ch[now][x>key[now]]; if(!now) sz++; fa[sz]=f; siz[sz]=cnt[sz]=1; ch[f][x>key[f]]=sz; key[sz]=x; pushup(f); splay(sz); return; long long rnk(int x) int now=rt; while(1) if(ch[now][0]&&x<=siz[ch[now][0]]) now=ch[now][0]; else int tmp=siz[ch[now][0]]+cnt[now]; if(tmp>=x) return key[now]; x-=tmp; now=ch[now][1]; int main() scanf("%d%d%d%d",&a,&b,&c,&n); insert(1); sum=1; for(int i=2;i<=n;i++) int wz=(i/2); long long mi=rnk(wz); fi=(long long)(1ll*a*mi+1ll*b*i+c)%mod; sum+=fi; insert(fi); printf("%lld\\n",sum); return 0; /* 64582 34650 2040 100000 41492359064511 */
以上是关于数据结构测试2 on 2019.9.25的主要内容,如果未能解决你的问题,请参考以下文章