2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love counting(Trie树)

I love counting

O{Mlog⁡aMAX(B+N/B)}O\{M\log{a_{\text{MAX}}}(\text{B+N/B})\}O{MlogaMAX(B+N/B)}
md考场写的莫队+Trie一直T

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pli=pair<ll,int>;
constexpr ll mod=1e9+7;
//=============================
int rd()
{int res=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;
}
const int N=100010;
int mp[N];
struct node
{int l,r;int v;
}tree[N*40];int cnt;
int ans[N],Bs;
void insert(int x)
{if(mp[x]!=0) return;mp[x]++;int u=0;for(int i=17;i>=0;i--) {int t=x>>i&1;if(t==0){if(!tree[u].l) tree[u].l=++cnt;u=tree[u].l;}else{if(!tree[u].r) tree[u].r=++cnt;u=tree[u].r;}if(u) tree[u].v++;}
}
void del(int x)
{if(mp[x]==0) return;mp[x]--;int u=0;for(int i=17;i>=0;i--) {int t=x>>i&1;if(t==0)u=tree[u].l;elseu=tree[u].r;if(u) tree[u].v--;}
}
int query(int a,int b)
{int res=0,u=0;for(int i=17;i>=0;i--){int ai=a>>i&1;int bi=b>>i&1;if(bi==1) //b=1{if(ai==0) res+=tree[tree[u].l].v;else res+=tree[tree[u].r].v;if(ai==0) u=tree[u].r;else u=tree[u].l;}else{if(ai==0) u=tree[u].l;else u=tree[u].r;}if(!u) return res;}return res+tree[u].v;
}
int pos[N];
int A[N],n,m;
struct nodeq
{int l,r;int a,b,id;bool operator<(const nodeq&o)const{if(pos[l]==pos[o.l]){if(pos[l]&1)return r<o.r;else return r>o.r;}return pos[l]<pos[o.l];}
}q[N];
int main()
{n=rd();for(int i=1;i<=n;i++) A[i]=rd();m=rd();for(int i=1;i<=m;i++){int l=rd(),r=rd(),a=rd(),b=rd();q[i]={l,r,a,b,i};}Bs=sqrt(n)+1;for(int i=1;i<=n;i++) pos[i]=(i-1)/Bs+1;sort(q+1,q+1+m);for(int i=q[1].l;i<=q[1].r;i++) insert(A[i]);ans[q[1].id]=query(q[1].a,q[1].b);int l=q[1].l,r=q[1].r;for(int i=1;i<=m;i++){while(l<q[i].l) del(A[l++]);while(r>q[i].r) del(A[r--]);while(r<q[i].r) insert(A[++r]);while(l>q[i].l) insert(A[--l]);ans[q[i].id]=query(q[i].a,q[i].b);}for(int i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;
}

Code2

O(Mlog⁡Nlog⁡aMAX)O(M\log{N}\log{a_{\text{MAX}}})O(MlogNlogaMAX)
和第一场一样,树状数组套Trie

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pli=pair<ll,int>;
constexpr ll mod=1e9+7;
//=============================
int rd()
{int res=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;
}
const int N=100010;
struct node
{int l,r;int v;
}tree[N*400];
int rt[N],cnt;
void insert(int &p,int x)
{if(!p) p=++cnt;int u=p;for(int i=17;i>=0;i--) {int t=x>>i&1;if(t==0){if(!tree[u].l) tree[u].l=++cnt;u=tree[u].l;}else{if(!tree[u].r) tree[u].r=++cnt;u=tree[u].r;}if(u) tree[u].v++;}
}
void del(int u,int x)
{if(!u) return;for(int i=17;i>=0;i--) {int t=x>>i&1;if(t==0)u=tree[u].l;elseu=tree[u].r;if(u) tree[u].v--;}
}
int query(int u,int a,int b)
{int res=0;if(!u) return 0;for(int i=17;i>=0;i--){int ai=a>>i&1;int bi=b>>i&1;if(bi==1) //b=1{if(ai==0) res+=tree[tree[u].l].v;else res+=tree[tree[u].r].v;if(ai==0) u=tree[u].r;else u=tree[u].l;}else{if(ai==0) u=tree[u].l;else u=tree[u].r;}if(!u) return res;}return res+tree[u].v;
}
int A[N],n,m;
int last[N];
int lowbit(int x){return x&-x;}
void Add(int k,int x){for(;k<=n;k+=lowbit(k))insert(rt[k],x);}
void Sub(int k,int x){for(;k<=n;k+=lowbit(k))del(rt[k],x);}int ask(int k,int a,int b)
{int res=0;for(;k;k-=lowbit(k)) res+=query(rt[k],a,b);return res;
}
struct nodeq
{int l,a,b,id;
};
vector<nodeq> q[N];
int ans[N];
int main()
{n=rd();for(int i=1;i<=n;i++) A[i]=rd();m=rd();for(int i=1;i<=m;i++){int l=rd(),r=rd(),a=rd(),b=rd();q[r].push_back({l,a,b,i});}for(int i=1;i<=n;i++){if(last[A[i]]) Sub(last[A[i]],A[i]);Add(i,A[i]);last[A[i]]=i;for(auto t:q[i]) ans[t.id]=ask(i,t.a,t.b)-ask(t.l-1,t.a,t.b);}for(int i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串:凯撒密码(洛谷P1914)

解析 只需将每一位ascll码加n即可 但要注意的是c的ascll码是有上限的 我一开始是这么写的&#xff1a; for(int i1;i<l;i){s[i] n;while(s[i]>z) s[i] - 26;printf("%c",s[i]);}结果&#xff1a; (真的是随便打的&#xff0c;不巧有些攻击性。。&#xff0…

P6113-[模板]一般图最大匹配【带花树】

正题 题目链接:https://www.luogu.com.cn/problem/P6113 题目大意 给出一张无向图&#xff0c;求最大匹配。 1≤n≤103,1≤m≤51041\leq n\leq 10^3,1\leq m\leq 5\times 10^41≤n≤103,1≤m≤5104 解题思路 带花树的模板&#xff0c;我也不会讲/kel 所以看下面两篇大佬的博…

牛客题霸 [跳台阶] C++题解/答案

牛客题霸 [跳台阶] C题解/答案 题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法&#xff08;先后次序不同算不同的结果&#xff09;。 题解&#xff1a; 递归的入门题 如果只剩一个台阶&#xff0c;只有一种跳…

.NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

写在前面上篇文章.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程&#xff0c;然后又带着大家熟悉了一遍配置文件的加载方式&#xff0c;最后引出了依赖注入以及控制反转的概念&#xff01;如果…

高精度:麦森数*(洛谷P1045)

P1045 [NOIP2003 普及组] 麦森数 解析 看似只是正常的一个高精 然而 暗藏杀机 一开始随手那么一写 。。。 (即使用了快速幂)时间复杂度过于感人 后来我们发现&#xff1a; 第一问位数的计算不必真的算出来&#xff0c;只需把2的p次幂转化为10的k次幂即可&#xff08;具体请…

2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)

I love exam 不知道为啥刚开始不写&#xff0c;那么简单的背包预处理dp&#xff0c;太菜了吧 fi,jf_{i,j}fi,j​对于第i门课来说花费j天得到的最大分数 gi,j,pg_{i,j,p}gi,j,p​考虑前i门课&#xff0c;花费j天复习得到的最大分数 #include<bits/stdc.h> using namespa…

P2012-拯救世界2【EGF】

正题 题目链接:https://www.luogu.com.cn/problem/P2012 题目大意 121212种东西排列成长度为nnn的序列&#xff0c;要求前四种出现奇数次&#xff0c;后四种出现偶数次&#xff0c;求方案。TTT组数据&#xff0c;对10910^9109取模。 1≤n<263,1≤T≤21051\leq n< 2^{63}…

彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践

“描述一个事物&#xff0c;唯有一个名词定义它的概念&#xff0c;唯有一个动词揭露它的行为&#xff0c;唯有一个形容词表现它的特征。要做的&#xff0c;就是用心去寻找那个名词、那个动词、那个形容词……”—— 福楼拜 (Gustave Flaubert)我想讲个故事。很久很久以前&#…

贪心: Array Splitting(数列分段)(洛谷CF1175D)

解析 这题可以转化一下&#xff1a; &#xff08;《神笔马良》。。。。&#xff09; 计算这些长方形对应下标的总加和 我们可以一层一层往上垒,假设第i层起始点为xi&#xff0c;总和为sumi&#xff0c;再设从1到i的前缀和为si 显然第一层x11&#xff0c;sum1sn 对于第二层x2&…

牛客题霸 [合并有序链表] C++题解/答案

牛客题霸 [合并有序链表] C题解/答案 题目描述 将两个有序的链表合并为一个新链表&#xff0c;要求新的链表是通过拼接两个链表的节点来生成的。 题解&#xff1a; 首先判断l1和l2是否为空 然后依次比较l1和l2的值&#xff0c;然后存到新的链表里&#xff0c;当有一方全部结…

2021牛客暑期多校训练营2 G.League of Legends(转化+单调队列)

G.League of Legends Zechariah_2001题解 对于可以包含其他区间的大区间&#xff0c;要使得答案最优无非就是两种分组方式&#xff1a;单独一组或者与被包含的区间一组。单独一组那么贡献就是区间长度&#xff1b;如果说与被包含的区间一组&#xff0c;对答案贡献为0&#xff…

P5056-[模板]插头dp

正题 题目链接:https://www.luogu.com.cn/problem/P5056 题目大意 n∗mn*mn∗m的网格&#xff0c;求有多少条回路可以铺满整个棋盘。 解题思路 插头dpdpdp的&#xff0c;写法是按照题解上的写法。 状态用的是括号匹配&#xff0c;然后用了哈希邻接表&#xff08;挂表&#x…

牛客题霸 [用两个栈实现队列] C++题解/答案

题目描述 用两个栈来实现一个队列&#xff0c;完成队列的Push和Pop操作。 队列中的元素为int类型。 题解&#xff1a; 我们都知道栈的性质是先进后出&#xff0c;队列是先进先出 我们用两个栈来模拟出队列 可以先用一个栈来存数&#xff0c;当要输出时&#xff0c;最上面的是…

Docker最全教程——从理论到实战(一)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右&#xff0c;只是为了大家更好地了解、理解和消化这个技术&#xff0c;能够搭上这波车。你可以关注我们的公众号“magiccode…

二分:路标设置(洛谷)

传送门. 解析 只需二分枚举空旷指数即可 对于单次判断的check函数&#xff0c;可以相当于n个路标把路面分成n1个间隔&#xff0c;而对于每个间隔[l,r]和空旷指数x&#xff08;边界已有路标&#xff09;&#xff0c;所需路标应为&#xff1a; (r-l-1)/x&#xff08;比如[2,5…

2020 ICPC亚洲区域赛(沈阳)F-Kobolds and Catacombs(思维+模拟)

F-Kobolds and Catacombs 考虑每一段&#xff0c;先找到最小的&#xff0c;然后把编号小于它的都化为一组&#xff0c;此时有一个最大值需要把小于最大值的在划分进来&#xff0c;然后又有编号小于它的&#xff0c;于是再把编号小于它的划分为一组&#xff0c;while1 循环一下…

P3190-[HNOI2007]神奇游乐园【插头dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3190 题目大意 n∗mn*mn∗m的网格上有权值&#xff0c;求一条权值和最大的不交回路。 1≤n≤100,1≤m≤61\leq n\leq 100,1\leq m\leq 61≤n≤100,1≤m≤6 解题思路 经典的棋盘形插头dpdpdp&#xff0c;和模板不同的地方是求…

牛客题霸 [最长公共子串]C++题解/答案

牛客题霸 [最长公共子串]C题解/答案 题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串&#xff0c;如果最长公共子串为空&#xff0c;输出-1 题解&#xff1a; lcs模板 代码&#xff1a; class Solution { public:/*** longest common substring* param …

二分:[BJWC2008]秦腾与教学评估

洛谷传送门 解析 因为至多有一个单数 假设其位置为k&#xff0c;1-i的累加和为s[i] 则s[1]-s[k-1]全是偶数 s[k]-s[max]全是奇数 答案呈单调性&#xff0c;可以用二分算法 check函数&#xff08;计算前缀和&#xff09;也很容易用O&#xff08;n&#xff09;写出&#xff1a…

微软Azure予力Green Dot客服成就不凡

点击蓝字关注我碧点公司&#xff08;Green Dot&#xff09;是仔细聆听消费者心声&#xff0c;以消费者为导向的金融科技创新公司&#xff0c;致力于为大众带来高效、便捷与体验舒适的个人银行业务。Green Dot创造了预付借记卡产业&#xff0c;也是美国最大的可增值预付借记卡和…