多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > hdu5212 Code 莫隊算法

hdu5212 Code 莫隊算法

來源:程序員人生   發布時間:2015-05-19 08:09:14 閱讀次數:3163次
這道題需要1些莫隊算法的知識 定義記號f(A,B)表示詢問區間A,B時的答案 用記號+表示集合的并 利用莫隊算法我們可以計算出任意f(A,A)的值 無妨假定A=[l1,r1],B=[l2,r2],C=[r1+1,l2?1] 容易知道f(A,B)=f(A+B+C,A+B+C)+f(C,C)?f(A+C,A+C)?f(C+B,C+B) 因此1個詢問被拆成4個可以用莫隊算法做的詢問 總的時間復雜度為O(msqrt(n))
(以上是官方題解)
代碼:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<map> using namespace std; typedef long long LL; const int N = 30000*4 + 10; int pos[N]; struct pp{     int l,r,id;     int ans; }p[N]; int cmp(pp a,pp b){     if(pos[a.l]==pos[b.l]) return a.r < b.r;     return a.l < b.l; } int cmp2(pp a,pp b){     return a.id < b.id; } struct que{     int l1,l2,r1,r2; }q[N]; int block,n,k,m,num; int a[N],cnt[N],answer; LL x; map<LL,int> mm; void update(int x,int v){     int val = k - a[x];     if(val <= 0) return ;     answer += cnt[val]*v;     cnt[a[x]] += v; } void solve(){     int l,r;     answer = 0;     for(int i=1,l=1,r=0;i<=num;i++){//按塊進行更新         for(;r<p[i].r;r++)             update(r+1,1);         for(;r>p[i].r;r--)             update(r,⑴);         for(;l<p[i].l;l++)             update(l,⑴);         for(;l>p[i].l;l--)             update(l⑴,1);         p[i].ans = answer;     } } int main(){     while(scanf("%d",&n)!=EOF){         mm.clear();         num = 0;         block = (int)sqrt(n)+1;         for(int i=1;i<=n;i++) pos[i] = i/block + 1;         scanf("%d",&k);         memset(cnt,0,sizeof(cnt));         for(int i=1;i<=n;i++)             scanf("%d",&a[i]);         scanf("%d",&m);         for(int i=1;i<=m;i++){             int l1,l2,r1,r2;             scanf("%d%d%d%d",&l1,&r1,&l2,&r2);             q[i].l1 = l1 , q[i].r1 = r1 , q[i].l2 = l2 , q[i].r2 = r2;             p[++num].l = l1 , p[num].r = l2⑴ ;             x = l1*40000+(l2⑴);             mm[x] = num;             p[num].id = num;             p[++num].l = r1+1 , p[num].r = r2 ;             x = (r1+1)*40000+r2;             mm[x] = num;             p[num].id = num;             if(l2⑴ >= r1+1){                 p[++num].l = r1+1 , p[num].r = l2⑴ ;                 x = (r1+1)*40000+(l2⑴);                 mm[x] = num;                 p[num].id = num;             }             p[++num].l = l1 , p[num].r = r2 ;             x = l1*40000+r2;             mm[x] = num;             p[num].id = num;         }         sort(p+1,p+1+num,cmp);         solve();         sort(p+1,p+1+num,cmp2);         for(int i=1;i<=m;i++){             int l1,l2,r1,r2;             l1 = q[i].l1 , l2 = q[i].l2 , r1 = q[i].r1 , r2 = q[i].r2 ;             LL ans = 0;             x = l1*40000+r2;             ans += p[mm[x]].ans;             if(l2⑴>=r1+1){                 x = (r1+1)*40000+(l2⑴);                 ans += p[mm[x]].ans;             }             x = (r1+1)*40000+r2;             ans -= p[mm[x]].ans;             x = l1*40000+(l2⑴);             ans -= p[mm[x]].ans;             printf("%lld ",ans);         }     }     return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美日韩亚洲另类 | 99综合网 | 成人五月网 | 老外一级毛片免费看 | 亚洲成人福利在线观看 | 欧美日韩亚洲一区二区精品 | 亚洲欧美久久精品 | 国产成人久久精品一区二区三区 | 免费操人视频 | 俺去啦最新官网 | 欧洲久久 | 免费在线观看视频a | 亚洲国产成人久久一区www妖精 | 白嫩美女一级毛片免费看 | 国产精品久久久久国产精品三级 | 国产日韩欧美精品一区二区三区 | 天天综合视频网 | 欧美又大粗又爽又黄大片视频黑人 | 久久这里精品 | 欧美日本免费 | 国产精品免费一区二区三区 | 校园春色 激情 | 伊人久久精品成人网 | 91久久国产综合精品 | 国产免费叼嘿网站免费 | 久久久日韩精品国产成人 | 一级做a爱久久久久久久 | 综合亚洲精品一区二区三区 | 精品国产日韩久久亚洲 | 亚欧毛片| 欧美另类性| 久久一品道 | 一级毛片视频免费 | 欧美人与禽xoxo性伦交 | 免费网站在线看 | 自拍偷拍亚洲第一页 | jiucao在线观看精品 | 亚洲成人免费 | 99视频精品全部在线播放 | 精品国产美女福利在线 | 99视频精品免视3 |