#include<bits/stdc++.h> #define MAXN 100005 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^'0'); ch=getchar(); } return x*f; } structQuery{ int l,r,id; }q[MAXN]; int pos[MAXN]; inlinebooloperator < (const Query &a,const Query &b){ return pos[a.l]<pos[b.l]||(pos[a.l]==pos[b.l]&&((pos[a.l]&1)?a.r<b.r:a.r>b.r));//奇偶性排序的压行写法 } int a[MAXN],cnt[MAXN],cnt2; inlinevoidAdd(int x){ ++cnt[x]; if (cnt[x]==2) cnt2++; } inlinevoidDel(int x){ --cnt[x]; if (cnt[x]==1) cnt2--; } int Ans[MAXN]; intmain(){ int n=read(),m=read(); int Size=sqrt(n); for (registerint i=1;i<=n;++i){ a[i]=read(); pos[i]=(i-1)/Size+1; } for (registerint i=1;i<=m;++i){ q[i]=Query{read(),read(),i}; } sort(q+1,q+1+m); int l=1,r=0; for (registerint i=1;i<=m;++i){ while (l<Q[i].l) Del(seq[l++]); while (l>Q[i].l) Add(seq[--l]); while (r<Q[i].r) Add(seq[++r]); while (r>Q[i].r) Del(seq[r--]); Ans[q[i].id]=(cnt2==0); } for (registerint i=1;i<=m;++i){ puts(Ans[i]?"Yes":"No"); } }
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define MAXN 50005 #define int long long usingnamespace std; int num[MAXN]; structfen{ int a,b; inlinevoidyue(){ int g=__gcd(a,b); a/=g,b/=g; } }ans[MAXN]; int pos[MAXN]; structquery{ int l,r,id; inlineintlen(){ return r-l+1; } }querys[MAXN]; booloperator < (const query &a,const query &b){ if (pos[a.l]==pos[b.l]){ return a.r<b.r; } else{ return a.l<b.l; } } int cnt[MAXN]; inlinevoidChange(int &curans,constint &id,constint &val){ curans-=cnt[num[id]]*cnt[num[id]]; cnt[num[id]]+=val; curans+=cnt[num[id]]*cnt[num[id]]; } #undef int intmain(){ #define int long long int n,m; scanf("%lld%lld",&n,&m); int sz=sqrt(n); for (int i=1;i<=n;++i){ pos[i]=(i-1)/sz+1; } for (int i=1;i<=n;++i){ scanf("%lld",&num[i]); } for (int i=1;i<=m;++i){ scanf("%d%d",&querys[i].l,&querys[i].r); querys[i].id=i; } sort(querys+1,querys+1+m); int l=1,r=0; int curans=0; for (int i=1;i<=m;++i){ while (r<querys[i].r) Change(curans,++r,1); while (r>querys[i].r) Change(curans,r--,-1); while (l>querys[i].l) Change(curans,--l,1); while (l<querys[i].l) Change(curans,++l,-1); if (querys[i].l==querys[i].r){ ans[querys[i].id].a=0,ans[querys[i].id].b=1; } else { ans[querys[i].id].a=curans-(querys[i].len()); ans[querys[i].id].b=querys[i].len()*(querys[i].len()-1); ans[querys[i].id].yue(); } } for (int i=1;i<=m;++i){ printf("%lld/%lld\n",ans[i].a,ans[i].b); } }
#include<bits/stdc++.h> #define MAXN 100005 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } bitset<MAXN>s,s1; int a[MAXN],cnt[MAXN],pos[MAXN]; inlinevoidAdd(int x){ if (cnt[x]++==0) s[x]=1,s1[MAXN-1-x]=1; } inlinevoidDel(int x){ if (--cnt[x]==0) s[x]=0,s1[MAXN-1-x]=0; } structQuery{ int opt,l,r,x,id; }q[MAXN]; inlinebooloperator < (const Query &a,const Query &b){ return (pos[a.l]^pos[b.l])?pos[a.l]<pos[b.l]:((pos[a.l]&1)?a.r<b.r:a.r>b.r); } int ans[MAXN]; intmain(){ int n=read(),m=read(); int Size=(int)(sqrt(n)); for (registerint i=1;i<=n;++i){ a[i]=read(); pos[i]=(i-1)/Size+1; } for (registerint i=1;i<=m;++i){ int opt=read(),l=read(),r=read(),x=read(); q[i]=Query{opt,l,r,x,i}; } sort(q+1,q+1+m); int l=1,r=0; for (registerint i=1;i<=m;++i){ while (l<q[i].l) Del(a[l++]); while (l>q[i].l) Add(a[--l]); while (r>q[i].r) Del(a[r--]); while (r<q[i].r) Add(a[++r]); if (q[i].opt==1){ ans[q[i].id]=(s&(s<<(q[i].x))).any(); } elseif (q[i].opt==2){ ans[q[i].id]=(s&(s1>>(MAXN-1-q[i].x))).any(); } elseif (q[i].opt==3){ for (registerint j=1;j*j<=q[i].x;++j){ if (q[i].x%j!=0) continue; if (s[j]&&s[q[i].x/j]){ ans[q[i].id]=1; break; } } } } for (registerint i=1;i<=m;++i){ puts(ans[i]==1?"hana":"bi"); } }
#include<bits/stdc++.h> #define MAXN 200005 #define MAXM 17 usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } vector<int>G[MAXN]; inlinevoidAddEdge(int u,int v){ G[u].push_back(v); } int c[MAXN];//每个点的颜色 int anc[MAXN][MAXM],dep[MAXN]; int euler[MAXN];//欧拉序(出栈入栈都要记录) int L[MAXN],R[MAXN];//左右端点 int tot; voiddfs(int u,int father){ dep[u]=dep[father]+1; anc[u][0]=father; euler[L[u]=++tot]=u; for (registerint i=1;i<MAXM;++i) anc[u][i]=anc[anc[u][i-1]][i-1]; for (registerint i=0;i<G[u].size();++i){ int v=G[u][i]; if (v!=father) dfs(v,u); } euler[R[u]=++tot]=u; } inlineintLCA(int u,int v){ if (dep[u]<dep[v]) swap(u,v); for (registerint i=MAXM-1;i>=0;--i){ if (dep[anc[u][i]]>=dep[v]) u=anc[u][i]; } if (u==v) return u; for (registerint i=MAXM-1;i>=0;--i){ if (anc[u][i]!=anc[v][i]){ u=anc[u][i],v=anc[v][i]; } } return anc[u][0]; }
int n,m; inlinevoiddiscrete(){ int tempc[MAXN]; for (registerint i=1;i<=n;++i) tempc[i]=c[i]; sort(tempc+1,tempc+1+n); for (registerint i=1;i<=n;++i){ c[i]=lower_bound(tempc+1,tempc+1+n,c[i])-tempc; } }
int b[MAXN];//块编号 structQuery{ int u,v,lca,id; }q[MAXN]; inlinebooloperator < (const Query &A,const Query &B){//莫队的玄学优化 return (b[A.u]^b[B.u])?b[A.u]<b[B.u]:((b[A.u]&1)?A.v<B.v:A.v>B.v); } int inq[MAXN];//在不在莫队维护的范围内 int ans,cnt[MAXN]; inlinevoidUpdate(int i){//相应地加上/减去元素 if (!inq[i]){//加上 cnt[c[i]]++; if (cnt[c[i]]==1) ans++; inq[i]=true; } else { cnt[c[i]]--; if (cnt[c[i]]==0) ans--; inq[i]=false; } } int Ans[MAXN]; inline Query make_q(int u,int v,int lca,int id){ Query temp; temp.id=id; temp.u=u,temp.v=v; temp.lca=lca; return temp; } intmain(){ n=read(),m=read();int Size=sqrt(n);//块大小 for (registerint i=0;i<MAXN;++i){ b[i]=i/Size+1; } for (registerint i=1;i<=n;++i){ c[i]=read(); } discrete(); for (registerint i=1;i<n;++i){ int u=read(),v=read(); AddEdge(u,v); AddEdge(v,u); } dfs(1,1); for (registerint i=1;i<=m;++i){ int u=read(),v=read(); if (L[u]>L[v]) swap(u,v);//保证这条链是从左往右 int lca=LCA(u,v); if (u==lca) q[i]=make_q(L[u],L[v],0,i);//u为这条链的顶点 else q[i]=make_q(R[u],L[v],lca,i); } sort(q+1,q+1+m); int l=1,r=0;//模仿STL队列 for (registerint i=1;i<=m;++i){ while (l<q[i].u) Update(euler[l++]); while (l>q[i].u) Update(euler[--l]); while (r<q[i].v) Update(euler[++r]); while (r>q[i].v) Update(euler[r--]); if (q[i].lca) Update(q[i].lca);//注意处理lca Ans[q[i].id]=ans; if (q[i].lca) Update(q[i].lca); } for (registerint i=1;i<=m;++i){ printf("%d ",Ans[i]); } }