超级钢琴

小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。

这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。

一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。

小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。

n,k ⩽ 500000

题解

固定左端点,维护右端点的区间,用堆维护最大值。每次取出的时候拆区间即可。

时间复杂度 O(k log n)。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<class T> T read(){
  4. T x=0,w=1;char c=getchar();
  5. for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
  6. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  7. return x*w;
  8. }
  9. template<class T> T read(T&x){
  10. return x=read<T>();
  11. }
  12. #define CO const
  13. #define IN inline
  14. typedef long long LL;
  15. CO int N=500000+10;
  16. pair<int,int> st[N][19];
  17. int lg[N];
  18. IN pair<int,int> query(int l,int r){
  19. int k=lg[r-l+1];
  20. return max(st[l][k],st[r-(1<<k)+1][k]);
  21. }
  22. struct node {int val,p,st,l,r;};
  23. IN bool operator<(CO node&a,CO node&b){
  24. return a.val<b.val;
  25. }
  26. priority_queue<node> Q;
  27. int main(){
  28. int n=read<int>(),K=read<int>();
  29. int L=read<int>(),R=read<int>();
  30. lg[0]=-1;
  31. for(int i=1;i<=n;++i) lg[i]=lg[i>>1]+1;
  32. for(int i=1;i<=n;++i) st[i][0]=make_pair(st[i-1][0].first+read<int>(),i);
  33. for(int j=1;j<=lg[n];++j)
  34. for(int i=1;i+(1<<j)-1<=n;++i) st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
  35. for(int i=1;i<=n-L+1;++i){
  36. pair<int,int> t=query(i+L-1,min(i+R-1,n));
  37. Q.push((node){t.first-st[i-1][0].first,t.second,i,i+L-1,min(i+R-1,n)});
  38. }
  39. LL ans=0;
  40. while(K--){
  41. node x=Q.top();Q.pop();
  42. ans+=x.val;
  43. if(x.l<=x.p-1){
  44. pair<int,int> t=query(x.l,x.p-1);
  45. Q.push((node){t.first-st[x.st-1][0].first,t.second,x.st,x.l,x.p-1});
  46. }
  47. if(x.p+1<=x.r){
  48. pair<int,int> t=query(x.p+1,x.r);
  49. Q.push((node){t.first-st[x.st-1][0].first,t.second,x.st,x.p+1,x.r});
  50. }
  51. }
  52. printf("%lld\n",ans);
  53. return 0;
  54. }

异或粽子

题目描述

小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。

小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$。第 $i$ 种馅儿具有一个非负整数的属性值 $a_i$。每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子。小粽准备用这些馅儿来做出 $k$ 个粽子。

小粽的做法是:选两个整数数 $l$, $r$,满足 $1 \leqslant l \leqslant r \leqslant n$,将编号在 $[l, r]$ 范围内的所有馅儿混合做成一个粽子,所得的粽子的美味度为这些粽子的属性值的异或和。(异或就是我们常说的 xor 运算,即 C/C++ 中的 ˆ 运算符或 Pascal 中的 xor 运算符)

小粽想品尝不同口味的粽子,因此它不希望用同样的馅儿的集合做出一个以上的
粽子。

小粽希望她做出的所有粽子的美味度之和最大。请你帮她求出这个值吧!

输入输出格式

输入格式:

第一行两个正整数 $n$, $k$,表示馅儿的数量,以及小粽打算做出的粽子的数量。

接下来一行为 $n$ 个非负整数,第 $i$ 个数为 $a_i$,表示第 $i$ 个粽子的属性值。
对于所有的输入数据都满足:$1 \leqslant n \leqslant 5 \times 10^5$, $1 \leqslant k \leqslant \min\left\{\frac{n(n-1)}{2},2 \times 10^{5}\right\}$, $0 \leqslant a_i \leqslant 4 294 967 295$。

输出格式:

输出一行一个整数,表示小粽可以做出的粽子的美味度之和的最大值。

输入输出样例

输入样例#1:
复制

  1. 3 2
  2. 1 2 3
输出样例#1:
复制

  1. 6

说明

测试点 $n$ $k$
$1$, $2$, $3$, $4$, $5$, $6$, $7$, $8$ $\leqslant 10^3$ $\leqslant 10^3$
$9$, $10$, $11$, $12$ $\leqslant 5 \times 10^5$ $\leqslant 10^3$
$13$, $14$, $15$, $16$ $\leqslant 10^3$ $\leqslant 2 \times 10^5$
$17$, $18$, $19$, $20$ $\leqslant 5 \times 10^5$ $\leqslant 2 \times 10^5$

分析

又是问前k大,可以参考线段树求所有区间前k大的做法,拆区间。

但是Trie树不支持任意区间查询,即使可持久化后也只能查询右端点固定的。但是没有关系,把每个右端点对应的部分区间都插入二叉堆就行了。

时间复杂度\(O(n \log v+k \log v)\)

  1. #include<bits/stdc++.h>
  2. #define rg register
  3. #define il inline
  4. #define co const
  5. template<class T>il T read(){
  6. rg T data=0,w=1;rg char ch=getchar();
  7. while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
  8. while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
  9. return data*w;
  10. }
  11. template<class T>il T read(rg T&x) {return x=read<T>();}
  12. typedef long long ll;
  13. using namespace std;
  14. co int N=2e5+5,INF=0x3f3f3f3f;
  15. char s[N];
  16. int n,na,nb,m;
  17. pair<int,int> a[N],b[N];
  18. int trie[N][26],tot,root;
  19. vector<int> val[N],edge[N];
  20. int newnode(){
  21. ++tot,memset(trie[tot],0,sizeof trie[tot]),val[tot].clear();
  22. return tot;
  23. }
  24. void insert(char*s,int n,int id){
  25. int u=root;
  26. for(int i=0;i<n;++i){
  27. int k=s[i]-'a';
  28. if(!trie[u][k]) trie[u][k]=newnode();
  29. u=trie[u][k],val[u].push_back(id);
  30. }
  31. }
  32. void link(char*s,int n,int id){
  33. int u=root;
  34. for(int i=0;u&&i<n;++i){
  35. int k=s[i]-'a';
  36. u=trie[u][k];
  37. }
  38. if(!u) return;
  39. for(int i=0;i<val[u].size();++i)
  40. edge[id].push_back(val[u][i]);
  41. }
  42. int deg[N],dis[N],pos[N],ref[N],ans;
  43. queue<int> que;
  44. int lpfa(){
  45. fill(deg+1,deg+na+1,0);
  46. fill(pos,pos+na+1,0);
  47. fill(dis+1,dis+na+1,-INF);
  48. for(int i=1;i<=na;++i)
  49. for(int j=0;j<edge[i].size();++j)
  50. ++deg[edge[i][j]];
  51. for(int i=1;i<=na;++i)
  52. if(!deg[i]) que.push(i),dis[i]=a[i].second-a[i].first+1;
  53. for(int u;que.size();){
  54. u=que.front(),que.pop();
  55. pos[u]=++pos[0],::ref[pos[0]]=u;
  56. for(int i=0,v;i<edge[u].size();++i){
  57. v=edge[u][i];
  58. if(--deg[v]==0) que.push(v);
  59. }
  60. }
  61. if(pos[0]<na) return -1;
  62. ans=-INF;
  63. for(int i=1,u;i<=na;++i){
  64. u=::ref[i],ans=max(ans,dis[u]);
  65. for(int j=0,v;j<edge[u].size();++j){
  66. v=edge[u][j];
  67. if(dis[v]<dis[u]+a[v].second-a[v].first+1)
  68. dis[v]=dis[u]+a[v].second-a[v].first+1;
  69. }
  70. }
  71. return ans;
  72. }
  73. void String(){
  74. scanf("%s",s+1),n=strlen(s+1);
  75. read(na),tot=0,root=newnode();;
  76. for(int i=1;i<=na;++i){
  77. read(a[i].first),read(a[i].second),edge[i].clear();
  78. insert(s+a[i].first,a[i].second-a[i].first+1,i);
  79. }
  80. read(nb);
  81. for(int i=1;i<=nb;++i) read(b[i].first),read(b[i].second);
  82. read(m);
  83. for(int i=1,x,y;i<=m;++i){
  84. read(x),read(y);
  85. link(s+b[y].first,b[y].second-b[y].first+1,x);
  86. }
  87. printf("%d\n",lpfa());
  88. }
  89. int main(){
  90. // freopen(".in","r",stdin),freopen(".out","w",stdout);
  91. for(int T=read<int>();T--;) String();
  92. return 0;
  93. }

伪作法

逐位考虑,计数。\(O(n \log^2 v)\)。最慢的点要跑13s。

  1. #include<bits/stdc++.h>
  2. #define rg register
  3. #define il inline
  4. #define co const
  5. il char nc(){
  6. static char buf[6000000], *p1=buf,*p2=buf;
  7. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  8. }
  9. il unsigned read(){
  10. rg char ch=nc();rg unsigned sum=0;
  11. while(!(ch>='0'&&ch<='9'))ch=nc();
  12. while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
  13. return sum;
  14. }
  15. typedef long long ll;
  16. using namespace std;
  17. co int N=5e5+1;
  18. int n,k;
  19. unsigned s,a[N];
  20. unordered_map<unsigned,int> c;
  21. unordered_map<unsigned,unordered_map<int,int> > v;
  22. ll cnt,ans,res;
  23. int main(){
  24. // freopen("xor.in","r",stdin),freopen("xor.out","w",stdout);
  25. n=read(),k=read();
  26. for(int i=1;i<=n;++i) a[i]=read()^a[i-1];
  27. for(int p=31;k&&p>=0;--p){
  28. s|=1U<<p,c.clear(),cnt=0;
  29. for(int i=0;i<=n;++i){
  30. cnt+=c[(s^a[i])>>p];
  31. if(cnt>k) break;
  32. ++c[a[i]>>p];
  33. }
  34. // fprintf(stderr,"%d s=%u cnt=%lld\n",p,s,cnt);
  35. if(cnt<=k){
  36. ans+=(ll)s*cnt,k-=cnt,c.clear(),v.clear();
  37. for(int i=0;i<=n;++i){
  38. for(int q=p-1;q>=0;--q){
  39. if(a[i]>>q&1) ans+=(1LL<<q)*(c[(s^a[i])>>p]-v[(s^a[i])>>p][q]),++v[a[i]>>p][q];
  40. else ans+=(1LL<<q)*v[(s^a[i])>>p][q];
  41. }
  42. ++c[a[i]>>p];
  43. }
  44. s^=1U<<p;
  45. }
  46. }
  47. ans+=(ll)s*k;
  48. printf("%lld\n",ans);
  49. return 0;
  50. }

伪作法2

从前往后扫描,建立Trie树,直接用每个点更新二叉堆,当这个点的当前最大值小于堆中的最小值时continue,时间复杂度\(O(n^2 \log v)\),爆踩标算。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. inline ll read()
  5. {
  6. ll out=0,fh=1;
  7. char jp=getchar();
  8. while ((jp>'9'||jp<'0')&&jp!='-')
  9. jp=getchar();
  10. if (jp=='-')
  11. fh=-1,jp=getchar();
  12. while (jp>='0'&&jp<='9')
  13. out=out*10+jp-'0',jp=getchar();
  14. return out*fh;
  15. }
  16. const int MAXN=5e5+10;
  17. const int N=32;
  18. ll a[MAXN];
  19. ll s[MAXN],t=0;
  20. struct Trie
  21. {
  22. int idx;
  23. int ch[MAXN*32][2];
  24. int tot[MAXN*32][2];
  25. Trie(){idx=0;}
  26. void ins(ll x)
  27. {
  28. int u=0;
  29. for(int i=N-1; i>=0; --i)
  30. {
  31. int k=(int)((x>>i)&1LL);
  32. tot[u][k]++;
  33. if(ch[u][k])
  34. u=ch[u][k];
  35. else
  36. u=(ch[u][k]=++idx);
  37. }
  38. }
  39. ll query(ll x,int p)
  40. {
  41. int u=0;
  42. --p;
  43. ll res=0;
  44. for(ll i=N-1; i>=0; --i)
  45. {
  46. int k=(int)((x>>i)&1LL);
  47. int v;
  48. if(ch[u][k^1])
  49. {
  50. if(p>=tot[u][k^1] && ch[u][k])
  51. {
  52. v=k;
  53. p-=tot[u][k^1];
  54. }
  55. else
  56. {
  57. v=k^1;
  58. res+=(1LL<<i);
  59. }
  60. }
  61. else
  62. {
  63. v=k;
  64. }
  65. u=ch[u][v];
  66. }
  67. return res;
  68. }
  69. } T;
  70. priority_queue<ll> q;
  71. int siz=0;
  72. int n,k;
  73. void solve()//One Must Have His Dream.
  74. {
  75. srand(19260817);
  76. random_shuffle(a+1,a+1+n);
  77. reverse(a+1,a+1+n);
  78. for(int i=1; i<=n; ++i)
  79. {
  80. int f=1;
  81. for(int p=1; p<=min(k,i-1) && f; ++p)
  82. {
  83. ll c=T.query(a[i],p);
  84. if(siz<k)
  85. q.push(-c),++siz;
  86. else
  87. {
  88. if(c<=-q.top())
  89. f=0;
  90. else
  91. {
  92. q.pop();
  93. q.push(-c);
  94. }
  95. }
  96. }
  97. T.ins(a[i]);
  98. }
  99. ll ans=0;
  100. while(!q.empty())
  101. {
  102. ll x=q.top();
  103. ans-=x;
  104. q.pop();
  105. }
  106. cout<<ans<<endl;
  107. }
  108. int main()
  109. {
  110. // freopen("xor.in","r",stdin);
  111. // freopen("xor.out","w",stdout);
  112. n=read(),k=read();
  113. for(int i=1; i<=n; ++i)
  114. a[i]=a[i-1]^read();
  115. a[++n]=0;
  116. solve();
  117. return 0;
  118. }

其实BZOJ上有一道只是求最大值的可持久化Trie原题。

BZOJ3261 最大异或和

给定一个非负整数序列{a},初始长度为N。

有M个操作,有以下两种操作类型:

1、Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。

2、Qlrx:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:

a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。

对于测试点 8-10,N,M<=300000 。

分析

记个异或前缀和数组s,则

a[p] xor a[p+1] xor ... xor a[N] xor x =s[p-1] xor s[N] xor x

那么使用可持久化Trie,对于每个节点维护latest,表示子节点中最新插入的是哪个,然后查询是时候往root[r-1]中latest ≥ l-1的节点走就行了。

时间复杂度\(O((N+M)\log 10^7)\)

由于要更新latest,所以插入时要用递归实现。

  1. co int N=6e5+1;
  2. int trie[N*24][2],latest[N*24];
  3. int s[N],root[N],n,m,tot;
  4. void insert(int i,int k,int p,int q){
  5. if(k<0) return latest[q]=i,void();
  6. int c=s[i]>>k&1;
  7. if(p) trie[q][c^1]=trie[p][c^1];
  8. trie[q][c]=++tot;
  9. insert(i,k-1,trie[p][c],trie[q][c]);
  10. latest[q]=std::max(latest[trie[q][0]],latest[trie[q][1]]);
  11. }
  12. int ask(int now,int val,int k,int limit){
  13. if(k<0) return s[latest[now]]^val;
  14. int c=val>>k&1;
  15. if(latest[trie[now][c^1]]>=limit)
  16. return ask(trie[now][c^1],val,k-1,limit);
  17. else
  18. return ask(trie[now][c],val,k-1,limit);
  19. }
  20. int main(){
  21. // freopen(".in","r",stdin),freopen(".out","w",stdout);
  22. read(n),read(m);
  23. latest[0]=-1,root[0]=++tot;
  24. insert(0,23,0,root[0]);
  25. for(int i=1;i<=n;++i){
  26. read(s[i]),s[i]^=s[i-1];
  27. root[i]=++tot;
  28. insert(i,23,root[i-1],root[i]);
  29. }
  30. for(int i=1;i<=m;++i){
  31. static char op[2];scanf("%s",op);
  32. if(op[0]=='A'){
  33. static int x;read(x);
  34. root[++n]=++tot,s[n]=s[n-1]^x;
  35. insert(n,23,root[n-1],root[n]);
  36. }
  37. else{
  38. static int l,r,x;read(l),read(r),read(x);
  39. printf("%d\n",ask(root[r-1],x^s[n],23,l-1));
  40. }
  41. }
  42. return 0;
  43. }

简单数据结构



分析

#3:

区间把比一个数小的数字变成这个数,查询区间最小值.

因为查询内容与区间和值等无关,所以无需Segment Tree Beats中的方法实现,

直接在每个线段树节点上维护当前区间min值以及区间与哪个数取max的lazy标记即可

#4:

考虑操作2怎么解决,因为K的和值不超过5*10^6,考虑与其相关的做法.

对序列建一棵线段树,线段树上每个节点维护当前区间最小值的值和位置,同时用一个小根堆去维护最后的答案,线段树上每次query(l,r)返回一组{val,pos,l,r}表示[l,r]区间中最小值为val,位置为pos,按照val去建立这个小根堆.

开始把query(1,n)的结果入堆,然后重复K次以下操作:

每次弹出堆顶,显然这时的val是所剩下的数中的最小值,然后将query(l,pos-1)以及query(pos+1,r)的结果入堆,

这样得到的K个堆顶显然是最小的K个元素,判断-1后输出即可,

而关于时间复杂度,query与入堆的次数都是2K次,弹出的次数为K次,所以总复杂度为\(O(n+\sum K \cdot \log n)\).

#5,#6:

发现在#4与#3的维护区间min值并不会产生影响,于是将#3,#4一起实现,即可通过全部数据,时间复杂度\(O\left((n+\sum K) \cdot \log n\right)\),空间复杂度\(O(n+\sum K)\).

  1. #include<cstdlib>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<string>
  7. #include<vector>
  8. #include<list>
  9. #include<deque>
  10. #include<stack>
  11. #include<queue>
  12. #include<map>
  13. #include<set>
  14. #include<bitset>
  15. #include<algorithm>
  16. #include<complex>
  17. #include<cassert>
  18. #define rg register
  19. #define il inline
  20. #define co const
  21. #pragma GCC optimize ("O3")
  22. using namespace std;
  23. il char nc(){
  24. static char buf[100000],*p1=buf,*p2=buf;
  25. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  26. }
  27. il int read(int&x){
  28. char ch=nc();int sum=0;
  29. while(!(ch>='0'&&ch<='9'))ch=nc();
  30. while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
  31. return x=sum;
  32. }
  33. typedef long long ll;
  34. typedef pair<int,int> pii;
  35. co int INF=0x7fffffff;
  36. co int MAXN=5e5+7;
  37. int n,m;
  38. struct SegTree
  39. {
  40. int minv[MAXN<<2],pos[MAXN<<2];
  41. int tag[MAXN<<2];
  42. #define lson (now<<1)
  43. #define rson (now<<1|1)
  44. il void pushup(rg int now)
  45. {
  46. minv[now]=min(minv[lson],minv[rson]);
  47. pos[now]=minv[lson]<minv[rson]?pos[lson]:pos[rson];
  48. }
  49. il void puttag(rg int now,rg int v)
  50. {
  51. minv[now]=max(minv[now],v);
  52. tag[now]=max(tag[now],v);
  53. }
  54. il void pushdown(rg int now)
  55. {
  56. if(tag[now])
  57. {
  58. puttag(lson,tag[now]);
  59. puttag(rson,tag[now]);
  60. tag[now]=0;
  61. }
  62. }
  63. il void build(rg int now,rg int l,rg int r)
  64. {
  65. if(l==r)
  66. {
  67. read(minv[now]);
  68. pos[now]=l;
  69. return;
  70. }
  71. rg int m=(l+r)>>1;
  72. build(lson,l,m);
  73. build(rson,m+1,r);
  74. pushup(now);
  75. }
  76. il void modify(rg int now,rg int l,rg int r,rg int ql,rg int qr,rg int v)
  77. {
  78. if(ql<=l&&r<=qr)
  79. {
  80. puttag(now,v);
  81. return;
  82. }
  83. pushdown(now);
  84. rg int m=(l+r)>>1;
  85. if(ql<=m)
  86. modify(lson,l,m,ql,qr,v);
  87. if(qr>=m+1)
  88. modify(rson,m+1,r,ql,qr,v);
  89. pushup(now);
  90. }
  91. il pii qmin(rg int now,rg int l,rg int r,rg int ql,rg int qr)
  92. {
  93. if(ql<=l&&r<=qr)
  94. {
  95. return pii(minv[now],pos[now]);
  96. }
  97. pushdown(now);
  98. rg int m=(l+r)>>1;
  99. if(qr<=m)
  100. return qmin(lson,l,m,ql,qr);
  101. if(ql>=m+1)
  102. return qmin(rson,m+1,r,ql,qr);
  103. pii x=qmin(lson,l,m,ql,qr),y=qmin(rson,m+1,r,ql,qr);
  104. return x.first<y.first?x:y;
  105. }
  106. }T;
  107. struct node
  108. {
  109. int val,pos,l,r;
  110. il bool operator<(const node&rhs)const
  111. {
  112. return val>rhs.val;
  113. }
  114. };
  115. priority_queue<node>H;
  116. il void addH(rg int l,rg int r)
  117. {
  118. node t;
  119. pii p=T.qmin(1,1,n,l,r);
  120. t.val=p.first,t.pos=p.second;
  121. t.l=l,t.r=r;
  122. H.push(t);
  123. }
  124. int ans[MAXN];
  125. il void query(rg int l,rg int r,rg int x,rg int k)
  126. {
  127. if(r-l+1<k)
  128. {
  129. puts("-1");
  130. return;
  131. }
  132. while(!H.empty())
  133. H.pop();
  134. addH(l,r);
  135. for(rg int i=1;i<=k;++i)
  136. {
  137. rg node t=H.top();
  138. H.pop();
  139. if(t.val>=x)
  140. {
  141. puts("-1");
  142. return;
  143. }
  144. ans[i]=t.val;
  145. if(t.l<=t.pos-1)
  146. addH(t.l,t.pos-1);
  147. if(t.pos+1<=t.r)
  148. addH(t.pos+1,t.r);
  149. }
  150. for(rg int i=1;i<=k;++i)
  151. {
  152. printf("%d ",ans[i]);
  153. }
  154. puts("");
  155. }
  156. int main()
  157. {
  158. freopen("segtree.in","r",stdin);
  159. freopen("segtree.out","w",stdout);
  160. read(n);
  161. T.build(1,1,n);
  162. read(m);
  163. rg int opt,l,r,x,k;
  164. while(m--)
  165. {
  166. read(opt);
  167. if(opt==1)
  168. {
  169. read(l);read(r);read(x);
  170. T.modify(1,1,n,l,r,x);
  171. }
  172. else
  173. {
  174. read(l);read(r);read(x);read(k);
  175. query(l,r,x,k);
  176. }
  177. }
  178. // fclose(stdin);
  179. // fclose(stdout);
  180. return 0;
  181. }

LOJ3048 「十二省联考 2019」异或粽子的更多相关文章

  1. 「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题 ...

  2. LOJ#3048. 「十二省联考 2019」异或粽子 Trie

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案, ...

  3. LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)

    题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\), ...

  4. 「十二省联考 2019」异或粽子——tire树+堆

    题目 [题目描述] 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅 ...

  5. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  6. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  7. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  8. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

  9. 「十二省联考 2019」字符串问题——SAM+DAG

    题目 [题目描述] Yazid 和 Tiffany 喜欢字符串问题.在这里,我们将给你介绍一些关于字符串的基本概念. 对于一个字符串 $S$, 我们定义 $\lvert S\rvert$ 表示 $S$ ...

随机推荐

  1. leetcode ----ARRAY TWOSUM

    代码的(判断nums[i]或者是target-nums[i]都可以):

  2. python logging模块,升级print调试到logging。

    简介: 我们在写python程序的时候,很多时候都有bug,都是自己写的,自己造的孽,又的时候报错又是一堆,不知道是那部分出错了. 我这初学者水平,就是打print,看哪部分执行了,哪部分没执行,由此 ...

  3. angular4-事件绑定

    事件绑定语法(可以通过 (事件名) 的语法,实现事件绑定) <date-picker (dateChanged)="statement()"></date-pic ...

  4. Cracking The Coding Interview3.3

    //Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in re ...

  5. 4.8 C++ typeid操作符

    参考:http://www.weixueyuan.net/view/6378.html 总结: typeid操作符用于判断表达式的类型,注意它和sizeof一样是一个操作符而不是函数. 如果需要使用t ...

  6. SQL-25 获取员工其当前的薪水比其manager当前薪水还高的相关信息

    题目描述 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',结果第一列给出员工的emp_no,第二列给出其manager的manager_ ...

  7. powerdesigner导出sql时报错 Generation aborted due to errors detected during the verification of the model.

    powerdesigner导出sql时报错 Generation aborted due to errors detected during the verification of the model ...

  8. 循环神经网络-RNN进阶

    这部分许多内容要类比CNN来进行理解和解释,所以需要对CNN比较熟悉. RNN的特点 1. 权值共享 CNN权值共享,RNN也有权值共享,在入门篇可以看到RNN结构图中,权重使用的是同样的字母 为什么 ...

  9. python 时间格式化

    2018-10-25 17:49:51 监控软件 原始 2018-10-2517:49:51 切割后 2018/10/25 17:49:51 格式化后 shijian = ' '.join(respo ...

  10. 2019-04-03-day025-异常与日志

    内容回顾 考试 6个小时 120分 (100+20) 15:00-18:00 笔试 60分 19:00-22:00 上机考试 40分 + 20分 60分及格不算附加题 简答题 读程序 简单编程 编程题 ...