白白的(baibaide)

白白的(baibaide)

有一個長度為 $n$ 的序列 $a_1, a_2, \dots, a_n$,一開始每個位置都是白色。如果一個區間中每個位置都是白色,則稱這是一個白白的區間。如果一個白白的區間向左或向右延長后都不是白白的區間了,則稱這是一個極長的白白的區間。有 $q$ 次操作,每次操作會修改某個位置的值,或者把某個位置變成黑色。每次操作后,求所有極長的白白的區間中含有的逆序對數的異或和。強制在線。

$n ≤ 150000,q ≤ 20000,0 ≤ a_i ≤ 10^9,1 ≤ x ≤ n,0 ≤ y ≤ 10^9$

$Subtask1(10pts) : n ≤ 10^3, q ≤ 10^3$
$Subtask2(20pts) : 只有 0 操作$
$Subtask3(30pts) : 只有 1 操作$
$Subtask4(40pts) : 沒有特殊限制$


Solution

毒題

有種高級的東西叫做啟發式分裂,可以應用于只分裂不合并的題目。

每次掃描較小的那一段,復雜度似乎是nlogn的。

那我們考慮每次枚舉小的那一段區間的每個數x,然后在大的區間中查找比x大(小)的數的個數,也就是x對于大區間的逆序對貢獻。

大區間的答案等于原來區間的答案減去每次查出的答案,小的重新算。

統計小于?主席樹就行。修改?樹套樹。

然而這題沒完...

我們算下復雜度:分裂$nlogn$ ,樹套樹 $nlog^2n$ ,修改 $qlog^2n$

總復雜度 $ nlog^3n +?qlog^2n $

n=150000?炸了

我們考慮優化前面的那個^3

按權值為比較大小的關鍵字建splay

一棵splay維護一段區間,分裂時查詢某一段比x大的有幾個。

分裂完小的區間暴力重建splay,總共可以有多棵splay

這樣前面就是$nlog^2n$了

樹套樹似乎不用了?然而splay在單點修改時不能維護答案,于是還要。

總復雜度 $ nlog^2n +?qlog^2n $

顛覆我對數據結構的認知

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<cmath>
  7 #include<set>
  8 #define ll long long
  9 #define maxn 150005
 10 #define Max 1000000000
 11 using namespace std;
 12 int n,q,a[maxn],rt[maxn],tot,cnt,root[maxn];
 13 ll Ans,ans[maxn];
 14 struct no{
 15     int ls,rs,v;
 16 }tr[maxn*400];
 17 set<int>dd;
 18 void wh(int k){
 19     tr[k].v=tr[tr[k].ls].v+tr[tr[k].rs].v;
 20 }
 21 void add(int &k,int l,int r,int pl,int v){
 22     if(!k)k=++cnt;
 23     if(l==r){
 24         tr[k].v+=v;
 25         return;
 26     }
 27     int mid=l+r>>1;
 28     if(pl<=mid)add(tr[k].ls,l,mid,pl,v);
 29     else add(tr[k].rs,mid+1,r,pl,v);
 30     wh(k);
 31 }
 32 ll t_ask(int k,int l,int r,int v,int fl){
 33     if(!k)return 0;
 34     ll sl=0,sr=0;
 35     if(l==r){
 36         return tr[k].v;
 37     }
 38     int mid=l+r>>1;
 39     if(fl==1){//>v
 40         if(v<=mid)return tr[tr[k].rs].v+t_ask(tr[k].ls,l,mid,v,fl);
 41         else return t_ask(tr[k].rs,mid+1,r,v,fl);
 42     }
 43     else{
 44         if(v<=mid)return t_ask(tr[k].ls,l,mid,v,fl);
 45         else return tr[tr[k].ls].v+t_ask(tr[k].rs,mid+1,r,v,fl);
 46     }
 47 }
 48 ll ask(int l,int r,int v,int fl){
 49     if(l>r)return 0;
 50     ll sl=0,sr=0;
 51     if(fl)v++;else v--;
 52     if(l-1>0)for(int i=l-1;i;i-=i&-i)sl+=t_ask(root[i],0,Max,v,fl);
 53     for(int i=r;i;i-=i&-i)sr+=t_ask(root[i],0,Max,v,fl);
 54     return sr-sl;
 55 }
 56 ll query(int l,int r,int x){
 57     ll n1=0,n2=0;
 58     n1=ask(l,x-1,a[x],1);n2=ask(x+1,r,a[x],0);
 59     return n1+n2;
 60 }
 61 struct Splay{
 62     int ch[2],f,v,num,sz;
 63 }t[maxn*50];
 64 void upd(int x){
 65     int ls=t[x].ch[0],rs=t[x].ch[1];
 66     t[x].sz=t[ls].sz+t[rs].sz+t[x].num;
 67 }
 68 int get(int x){return t[t[x].f].ch[1]==x;}
 69 void rotate(int x){
 70     int y=t[x].f,z=t[y].f;
 71     int wx=get(x),wy=get(y);
 72     t[z].ch[wy]=x;t[x].f=z;
 73     t[y].ch[wx]=t[x].ch[wx^1];t[t[x].ch[wx^1]].f=y;
 74     t[x].ch[wx^1]=y;t[y].f=x;
 75     upd(y);upd(x);
 76 }
 77 void splay(int x,int g){
 78     while(t[x].f!=g){
 79         int y=t[x].f,z=t[y].f;
 80         if(z!=g)rotate(get(x)==get(y)?y:x);
 81         rotate(x);
 82     }
 83 }
 84 void modify(int &R,int k,int x,int Num){
 85     int fa=0;
 86     while(k&&t[k].v!=x){
 87         fa=k,k=t[k].ch[x>t[k].v];
 88     }
 89     if(k)t[k].num+=Num;
 90     else {
 91         k=++tot;
 92         if(fa)t[fa].ch[x>t[fa].v]=k;
 93         t[k].v=x;t[k].num=t[k].sz=1;t[k].f=fa;
 94     }
 95     splay(k,0);R=k;
 96 }
 97 ll ask_min(int k,int v){
 98     ll sum=0;
 99     while(k){
100         if(t[k].v<v)sum+=t[t[k].ch[0]].sz+t[k].num,k=t[k].ch[1];
101         else if(t[k].v==v){
102             sum+=t[t[k].ch[0]].sz;
103             break;
104         }    
105         else k=t[k].ch[0];
106     }
107     return sum;
108 }
109 ll ask_max(int k,int v){//>
110     ll sum=0;
111     while(k){
112         if(t[k].v<v)k=t[k].ch[1];
113         else if(t[k].v==v){
114             sum+=t[t[k].ch[1]].sz;
115             break;
116         }    
117         else sum+=t[t[k].ch[1]].sz+t[k].num,k=t[k].ch[0];
118     }
119     return sum;
120 }
121 int main()
122 {
123     cin>>n>>q;dd.insert(1);dd.insert(n+1);
124     for(int i=1;i<=n;i++){
125         scanf("%d",&a[i]);
126         modify(rt[1],rt[1],a[i],1);
127     }
128     for(int i=1;i<=n;i++)
129     for(int j=i;j<=n;j+=j&-j){
130         add(root[j],0,Max,a[i],1);
131     }
132     for(int i=1;i<=n;i++)ans[1]+=query(1,n,i);
133     ans[1]/=2;Ans=ans[1];ll la=0;
134     for(int i=1,op;i<=q;i++){
135         scanf("%d",&op);
136         ll x,y;
137         if(op==0){
138             scanf("%lld%lld",&x,&y);x^=la;y^=la;
139             set<int>::iterator it;
140             it=dd.upper_bound(x);
141             int r=*it-1;it--;int l=*it;
142             Ans^=ans[l];
143             ll num=query(l,r,x);
144             modify(rt[l],rt[l],a[x],-1);
145             ans[l]-=num;
146             for(int j=x;j<=n;j+=j&-j)add(root[j],0,Max,a[x],-1);
147             a[x]=y;
148             modify(rt[l],rt[l],a[x],1);
149             for(int j=x;j<=n;j+=j&-j)add(root[j],0,Max,a[x],1);
150             num=query(l,r,x);
151             ans[l]+=num;Ans^=ans[l];
152             printf("%lld\n",Ans);la=Ans;
153         }
154         else {
155             scanf("%lld",&x);x^=la;
156             set<int>::iterator it;
157             it=dd.upper_bound(x);
158             int r=*it-1;it--;int l=*it;
159             Ans^=ans[l];ll co=0;
160             if(x==l){
161                 co=ask_min(rt[l],a[l]);
162                 modify(rt[l],rt[l],a[l],-1);
163                 ans[l+1]=ans[l]-co;ans[l]=0;
164                 rt[l+1]=rt[l];rt[l]=0;
165                 Ans^=ans[l+1];
166                 dd.insert(l+1);
167             }
168             else if(x==r){
169                 co=ask_max(rt[l],a[r]);
170                 modify(rt[l],rt[l],a[r],-1);
171                 ans[l]-=co;Ans^=ans[l];
172                 dd.insert(r);
173             }
174             else {
175                 if(x-l<r-x){
176                     for(int i=l;i<=x;i++){
177                         co+=ask_min(rt[l],a[i]);
178                         modify(rt[l],rt[l],a[i],-1);
179                     }
180                     ans[x+1]=ans[l]-co;
181                     rt[x+1]=rt[l];rt[l]=0;ans[l]=0;
182                     for(int i=l;i<x;i++){
183                         modify(rt[l],rt[l],a[i],1);
184                         ans[l]+=ask_max(rt[l],a[i]);
185                     }
186                     Ans=(Ans^ans[l]^ans[x+1]);
187                 }
188                 else {
189                     for(int i=r;i>=x;i--){
190                         co+=ask_max(rt[l],a[i]);
191                         modify(rt[l],rt[l],a[i],-1);
192                     }
193                     ans[l]-=co;
194                     for(int i=x+1;i<=r;i++){
195                         modify(rt[x+1],rt[x+1],a[i],1);
196                         ans[x+1]+=ask_max(rt[x+1],a[i]);
197                     }
198                     Ans=(Ans^ans[l]^ans[x+1]);
199                 }
200                 dd.insert(x);dd.insert(x+1);
201             }
202             printf("%lld\n",Ans);la=Ans;
203         }
204     }
205     return 0;
206 }
View Code

?

轉載于:https://www.cnblogs.com/liankewei/p/10657581.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何利用Python網絡爬蟲爬取微信朋友圈動態--附代碼(下)

前天給大家分享了如何利用Python網絡爬蟲爬取微信朋友圈數據的上篇&#xff08;理論篇&#xff09;&#xff0c;今天給大家分享一下代碼實現&#xff08;實戰篇&#xff09;&#xff0c;接著上篇往下繼續深入。一、代碼實現1、修改Scrapy項目中的items.py文件。我們需要獲取的數…

使用Adaptive cards來構建Teams app的界面

Teams app的task module十分好用&#xff0c;當用戶點擊了一個卡片上的按鈕是可以在Teams里彈出一個對話框&#xff0c;對話框的內容可以是開發人員自己的一個網頁頁面&#xff0c;或者是adaptive card。 在我的LuckyDraw bot里&#xff0c;我比較了這兩種的優勢和劣勢&#xf…

Boosting(提升方法)之GBDT

一、GBDT的通俗理解 提升方法采用的是加法模型和前向分步算法來解決分類和回歸問題&#xff0c;而以決策樹作為基函數的提升方法稱為提升樹&#xff08;boosting tree&#xff09;。GBDT(Gradient Boosting Decision Tree)就是提升樹算法的一種&#xff0c;它使用的基學習器是C…

CC攻擊原理及防范方法

一、 CC攻擊的原理&#xff1a; CC攻擊的原理就是攻擊者控制某些主機不停地發大量數據包給對方服務器造成服務器資源耗盡&#xff0c;一直到宕機崩潰。CC主要是用來消耗服務器資源的&#xff0c;每個人都有這樣的體驗&#xff1a;當一個網頁訪問的人數特別多的時候&#xff0c…

Team photo的新api

Graph API的更新速度真是快&#xff0c;今年9月中旬又增加了關于Team photo的兩個新的api。 https://docs.microsoft.com/en-us/graph/api/team-get-photohttps://docs.microsoft.com/en-us/graph/api/team-update-photo 今天就給大家介紹一下如何使用這兩個新的api。 實際上說…

BZOJ 1047: [HAOI2007]理想的正方形 單調隊列瞎搞

題意很簡明吧&#xff1f; 枚舉的矩形下邊界和右端點即右下角&#xff0c;來確定矩形位置&#xff1b; 每一個縱列開一個單調隊列&#xff0c;記錄從 i-n1 行到 i 行每列的最大值和最小值&#xff0c;矩形下邊界向下推移的時候維護一下&#xff1b; 然后在記錄的每一列的最大值…

分享到Teams

在今年三月份末&#xff0c;Teams的官方文檔推出了一個新功能&#xff1a;將網頁&#xff08;一個URL&#xff09;分享到Teams里。 也就是說開發人員現在可以很方便的開發一個頁面&#xff0c;頁面里有一個Teams的圖標&#xff0c;當訪問此頁面的最終用戶點擊這個圖標后可以將…

xshell使用xftp傳輸文件和使用pure-ftpd搭建ftp服務

xshell使用xftp傳輸文件 首先安裝xftp&#xff0c;然后建立會話&#xff0c;步驟和xshell一樣&#xff0c;在使用的時候用CtrlALTf呼出&#xff0c;左邊是windows桌面&#xff0c;右面是linux&#xff0c;雙擊或拖拽都可以實現命令互傳。 使用pure-ftpd搭建ftp服務 首先安裝yum…

MySQL命令行查詢亂碼解決方法

轉自Agoly的博客&#xff0c;原文鏈接https://www.cnblogs.com/qmfsun/p/4846467.html 感謝博主Agoly這篇文章說的很詳細很透徹。 MySQL會出現中文亂碼的原因不外乎下列幾點&#xff1a;1.server本身設定問題&#xff0c;例如還停留在latin1 2.table的語系設定問題(包含charact…

Teams Bot如何判斷用戶所在的時區

一說到時間&#xff0c;就會聯想到時區&#xff0c;夏令時等頭痛的問題&#xff0c;不同國家有不同國家的規定。如果你希望你的Teams Bot可以判斷出當前用戶所在的時區&#xff0c;從而可以針對性的進行一些處理時&#xff0c;你要做好心理準備&#xff0c;這個復雜程度遠遠超過…

『流暢的Python』第1~4章筆記_數據結構、編碼

由于1~4章內容零散且基礎&#xff0c;所以統計一下涉及到的內容&#xff0c;記錄一下&#xff0c;方便查閱&#xff08;第一張圖右鍵新頁面打開即可看到清晰大圖&#xff09;

docker 安裝ELK

參考文檔&#xff1a; Docker ELK使用文檔&#xff1a;http://elk-docker.readthedocs.io/ 1.拉取鏡像 查看 Docker Hub 的鏡像 docker search elk 拉取鏡像 sudo docker pull sebp/elk 2.啟動容器 docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 4560:4560 -it --na…

在Teams Hackathon上介紹LuckyDraw

很榮幸有機會在今天的Teams Hackathon上介紹LuckyDraw這個teams app。 因為到場的都是各路開發高手&#xff0c;所以當時在準備這個ppt的時候特別增加了難度等級&#xff0c;哈哈。 從如何構建云原生的Teams app&#xff0c;到IaC&#xff0c;重點講了如何開發一個面向全球用戶…

Word 2010 制作文檔結構之圖標自動編號設置

注意&#xff1a; 使用圖片自動編號時&#xff0c;如果文檔標題使用的樣式是通過“將所選內容保存為新快速樣式”所生成的樣式&#xff0c;則圖片自動編號不會生效 因此設置標題樣式時&#xff0c;不要 新建樣式&#xff0c;直接使用word預設的“標題 1”樣式和“標題 2”樣式即…

ubuntu linux下建立stm32開發環境: 程序燒錄 openocd+openjtag

原文出處&#xff1a; http://blog.csdn.net/embbnux/article/details/17619621 之前建立stm32開發環境,程序也已經編譯好生成main.bin,接下來就是要把該文件燒錄到stm32上.在linux下給arm燒錄程序主要使用openocd,這個軟件開源,而且支持眾多芯片,從ARM9到A8都可以,當然STM32也…

在Teams中對網站的URL特殊解析

Teams中有一個不太被大家注意的擴展點&#xff0c;名字叫Link unfurling&#xff0c;就是對于一些特殊域名的URL進行特別的解釋。 可能這么說&#xff0c;大家還是無法理解&#xff0c;我們看一下下面這個圖&#xff0c;當用戶在message輸入框中輸入了一竄url后&#xff0c;Te…

Wireshark 在Windows下的安裝

1、wireshark官網地址&#xff1a;https&#xff1a;//www.wireshark.ort/ 下載抓包驅動&#xff1a;windows使用winpcap&#xff0c;Linux使用libcap2、安裝下載好的wireshark程序包&#xff1a;3、安裝winpcap插件&#xff1a;4、安裝USBPcap插件&#xff1a;5、安裝完成&…

Teams團隊的成員列表API的已知問題

如果大家經常使用Graph API來對Teams進行操作管理的話&#xff0c;有時候會遇到一些奇怪的問題&#xff0c;我前兩天還在Stack Overflow上回答了一個用戶的問題&#xff0c;這個問題我自己也遇到過。所以我想用這篇文章來分享一下&#xff0c;萬一以后大家遇到類似的問題&#…

OSChina 周三亂彈 —— 爸爸說,這個是從他硬盤里掉出來的

2019獨角獸企業重金招聘Python工程師標準>>> Osc亂彈歌單&#xff08;2018&#xff09;請戳&#xff08;這里&#xff09; 【今日歌曲】 煥煥 &#xff1a;分享鄭秀文的單曲《唉聲嘆氣》 《唉聲嘆氣》 手機黨少年們想聽歌&#xff0c;請使勁兒戳&#xff08;這里&am…

改進的二分查找

1 import java.util.Comparator;2 3 public class MyUtil {4 5 public static <T extends Comparable<T>> int binarySearch(T[] x, T key) {6 return binarySearch(x, 0, x.length- 1, key);7 }8 9 // 使用循環實現的二分查找 10 public static…