Mato的文件管理 (莫队)题解
生活随笔
收集整理的這篇文章主要介紹了
Mato的文件管理 (莫队)题解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
思路:
莫隊(duì)模板題,轉(zhuǎn)換幾次就是找逆序數(shù),用樹狀數(shù)組來儲(chǔ)存數(shù)就行了
注意要離散化
代碼:
#include<queue> #include<cstring> #include<set> #include<map> #include<stack> #include<cmath> #include<vector> #include<cstdio> #include<iostream> #include<algorithm> #define ll long long const int N = 50000+5; using namespace std; int k[N],p[N],arr[N],pos[N],ans[N],n,m; struct node{int l,r;int id; }e[N]; bool cmp(node a,node b){return pos[a.l] == pos[b.l]? a.r < b.r : pos[a.l] < pos[b.l];} int lowbit(int x){return x&(-x); } void update(int x,int val){for(int i = x;i <= n;i += lowbit(i))arr[i] += val; } int sum(int x){int ret = 0;for(int i = x;i > 0;i -= lowbit(i)){ret += arr[i];}return ret; } void Do(){//i位置 //L右移,逆序?qū)?shù)減少p[i]的逆序數(shù) //L左移,逆序?qū)?shù)增加p[i-1]的逆序數(shù) //R右移,逆序?qū)?shù)增加大于p[i+1]的數(shù) //R左移,逆序?qū)?shù)減少大于p[i]的數(shù) int L = 1,R = 0;int ret = 0;for(int i = 1;i <= m;i++){while(L < e[i].l){update(p[L],-1);ret -= sum(p[L] - 1);L++;}while(L > e[i].l){L--;update(p[L],1);ret += sum(p[L] - 1);}while(R < e[i].r){R++;update(p[R],1);ret += R - L + 1 - sum(p[R]); //大于減去自己和比己小的 }while(R > e[i].r){update(p[R],-1);ret -= R - L -sum(p[R]);R--;}ans[e[i].id] = ret;} } int main(){scanf("%d",&n);int block = sqrt(n);for(int i = 1;i <= n;i++){scanf("%d",&p[i]);k[i] = p[i];pos[i] = (i - 1) / block + 1;}sort(k+1,k+n+1);for(int i = 1;i <= n;i++) p[i] = lower_bound(k+1,k+n+1,p[i]) - k;scanf("%d",&m);for(int i = 1;i <= m;i++){scanf("%d%d",&e[i].l,&e[i].r);e[i].id = i;}sort(e+1,e+m+1,cmp); //分塊 Do();for(int i =1;i <= m;i++)printf("%d\n",ans[i]);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/KirinSB/p/9408798.html
總結(jié)
以上是生活随笔為你收集整理的Mato的文件管理 (莫队)题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch简单操作(一)
- 下一篇: Spring核心——IOC处理器扩展