日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj3339 Rmq Problem

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj3339 Rmq Problem 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  直接跑了莫隊勉強跑過,正解應該是一開始算出所有區間[1,i]的sg值,然后考慮從區間[1,i]到區間[2,i]的sg值變換,發現只有區間[2,next[a[1]]-1]內,sg值大于a[1]的數字sg值全部變成a[1],這里next[a[1]]表示下一個與a[1]相同的數字的位置。用線段樹維護一下即可。

? ? ?莫隊代碼

1 #include<cstdio> 2 #include<algorithm> 3 #define N 500010 4 using namespace std; 5 int n,m,i,a[N],ans[N],sum[N],L,R,s[N]; 6 struct g{ 7 int l,r,id; 8 }b[N]; 9 bool cmp(g a,g b) 10 { 11 if (a.l/400==b.l/400) 12 return a.r<b.r; 13 return a.l/400<b.l/400; 14 } 15 void cc(int x,int w) 16 { 17 if ((s[a[x]]==0)&&(w>1)) sum[a[x]/400]++; 18 if ((s[a[x]]==1)&&(w<-1)) sum[a[x]/400]--; 19 s[a[x]]+=w; 20 } 21 int query() 22 { 23 int i; 24 for (i=0;;i++) 25 if (sum[i]==400) continue;else break; 26 int j; 27 for (j=400*i;;j++) 28 if (s[j]) continue;else break; 29 return j; 30 } 31 int main() 32 { 33 scanf("%d%d",&n,&m); 34 for (i=1;i<=n;i++) 35 scanf("%d",&a[i]); 36 for (i=1;i<=m;i++) 37 { 38 scanf("%d%d",&b[i].l,&b[i].r); 39 b[i].id=i; 40 } 41 sort(b+1,b+1+m,cmp); 42 L=1;R=0; 43 for (i=1;i<=m;i++) 44 { 45 46 while (R<b[i].r) R++,cc(R,1); 47 while (R>b[i].r) cc(R,-1),R--; 48 while (L<b[i].l) cc(L,-1),L++; 49 while (L>b[i].l) L--,cc(L,1); 50 ans[b[i].id]=query(); 51 } 52 for (i=1;i<=m;i++) 53 printf("%d\n",ans[i]); 54 }

?

  

轉載于:https://www.cnblogs.com/fzmh/p/5391481.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的bzoj3339 Rmq Problem的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。