樹狀陣列預處理之後直接搞就可以了,也不是很好解釋,反正就是乙個模擬過程的暴力用樹狀陣列維護,還挺巧妙的。
我為什麼考場上想不出來嚶嚶嚶
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
namespace
std;
8const
int maxn=600010;9
intn,m,q;
10int xx[maxn]={},yy[maxn]={};
11int num[maxn]={},z[maxn]={};
12int lag[maxn]={};
13int t[maxn]={},mx;
14 vectorid[maxn];
15 vectorval[maxn];
16 vector
long >shu[maxn];
17void add(int x,int
v)22}23
int getit(int
x)return
tsn;29}
30int find(int
x)37
return
l;38}39
intmain()
48else
49 z[i]=1;50
}51for(int i=1;i<=mx;i++)add(i,1
);52
for(int i=1;i<=n;i++)
58for(int j=0;j1
);59}60
long
long
ans;
61for(int i=0;i<=n;i++)shu[0].push_back((long
long)i*m);
62 lag[0]=m;
63for(int i=1;i<=q;i++)
68else
if(num[i]<=m+lag[xx[i]]-1)74
else
78 shu[0].push_back(ans);lag[0]++;
79 printf("
%lld\n
",ans);80}
81return0;
82 }
題解 P3960 列隊
考慮到每個點都是先橫向移動,然後再縱向移動,所以我們可以考慮每行維護乙個splay,最後一列再維護乙個splay。但是考慮到n和m的規模都是 3 10 5 級別的,普通的splay肯定會爆空間,所以我們使用動態開點的splay,對於每個節點記錄乙個l和乙個r,如果需要splay的元素在這個區間當中,...
題解 P3960 列隊
考慮到每個點都是先橫向移動,然後再縱向移動,所以我們可以考慮每行維護乙個splay,最後一列再維護乙個splay。但是考慮到n和m的規模都是 3 10 5 級別的,普通的splay肯定會爆空間,所以我們使用動態開點的splay,對於每個節點記錄乙個l和乙個r,如果需要splay的元素在這個區間當中,...
NOIP2017 列隊(樹狀陣列)
定義第i行為所有的點 i,j 0 可以發現,每一行是相對獨立的,每一次操作只會影響到當前行和最後一列 考慮每一行和最後一列各開乙個樹狀陣列,但這樣顯然會爆空間 實際上,對於沒有離隊過的點是沒必要儲存的,可以直接算出編號,因此只要用vector儲存每一行和最後一列後加入的點即可 還需要預處理乙個陣列d...