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

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > CodeForces 301D(樹狀數組)

CodeForces 301D(樹狀數組)

來源:程序員人生   發布時間:2015-06-27 08:32:37 閱讀次數:3817次

題目鏈接:codeforces 301D

題意分析:
給你n , m兩個數,1?≤?n,?m?≤?2e5,n代表n個不同數字,且這些數字都在區間[ 1 , n ]之間,這就說明1~n每一個數出現1次。m代表m次查詢,查詢格式為兩個整數x , y,問你區間[ x , y ]之間有多少對數a , b滿足a%b==0。

解題思路:
考察點是區間的頻繁訪問,馬上想到線段樹和樹狀數組,線段樹太難寫了沒斟酌過,就說說樹狀數組的思路吧。
1)離線處理:把所有的插敘全部讀進來再按特定順序處理。為了讓樹狀數組求的和確確切實的是屬于這個區間的,沒有別的區間的干擾,我們按區間的左側界給區間排1次序,左側界大的先處理:

bool cmp(query a,query b){ return a.x>b.x; }

2)預處理:找到跟ai的所有可整除的數,根據索引大小保存在1個vector里面:

for(int i=1;i<=n;i++) { for(int j=a[i];j<=n;j+=a[i]) { if(p[j]>=i) vec[i].push_back(p[j]); else vec[p[j]].push_back(i); } }

3)樹狀數組處理:有1個虛擬數組cnt
首先有1個maxx變量,來記錄當前已處理到哪了(從右到左處理,初始值為n+1),來到達避免重復計算的效果。把所有該加上的值先加上,在求和;如果之前已加過了,不用加了,這里就需要maxx來判斷了:

int maxx=n+1; for(int i=0;i<m;i++) { int x=q[i].x,y=q[i].y,len; for(int j=x;j<maxx;j++) { len=vec[j].size(); for(int k=0;k<len;k++) add(vec[j][k],1); } ans[q[i].id]=sum(y); //求和 maxx=x; }

AC代碼:

#include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,m,a[200005],p[200005],bit[200005],ans[200005]; vector<int> vec[200005]; struct query{ int id,x,y; }q[200005]; bool cmp(query a,query b){ return a.x>b.x; } int lowbit(int num){ return num&(-num); } int sum(int index) { int res=0; for(int i=index;i>0;i-=lowbit(i)) res+=bit[i]; return res; } void add(int index,int delta){ for(int i=index;i<=n;i+=lowbit(i)) bit[i]+=delta; } int main() { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); p[a[i]]=i; } for(int i=1;i<=n;i++) { for(int j=a[i];j<=n;j+=a[i]) { if(p[j]>=i) vec[i].push_back(p[j]); else vec[p[j]].push_back(i); } } for(int i=0;i<m;i++) { scanf("%d %d",&q[i].x,&q[i].y); if(q[i].y<q[i].x) swap(q[i].x,q[i].y); q[i].id=i; } sort(q,q+m,cmp); int maxx=n+1; for(int i=0;i<m;i++) { int x=q[i].x,y=q[i].y,len; for(int j=x;j<maxx;j++) { len=vec[j].size(); for(int k=0;k<len;k++) add(vec[j][k],1); } ans[q[i].id]=sum(y); maxx=x; } for(int i=0;i<m;i++) printf("%d ",ans[i]); return 0; }

總結:
1、離線處理+樹狀數組
2、注意查詢的排序方式

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美日韩国产色综合一二三四 | 国产欧美又粗又猛又爽老 | 国产视频a区| 一区二区三区四区欧美 | 亚洲欧美国产精品久久久 | 俺去俺来也在线www色官网 | 国产成人精品日本亚洲语言 | 亚洲国产成人91精品 | 草的爽免费视频 | 中文字幕中文字幕中中文 | 四虎必出精品亚洲高清 | 亚欧美图片自偷自拍另类 | 亚洲一级毛片免费在线观看 | 欧美 亚洲 激情 | 亚洲综合一二三区 | 日韩有码视频在线 | 亚洲成人偷拍自拍 | 国产精品欧美一区二区三区 | 一区二区三区在线 | 网站 | 亚洲美女色视频 | 欧美日本在线 | 九九这里有精品 | 国产精品女上位在线观看 | 国产一区二区三区在线观看视频 | 色播成人网 | 亚洲欧美国产视频 | 最好免费高清视频在线看 | 永久在线观看 | 男女午夜爽爽大片免费 | 亚洲国产精品自在在线观看 | 麻豆高清视频在线观看 | 日本一区二区三区四区不卡 | 日韩理论片在线看免费观看 | www.99爱| 国产一区自拍视频 | 免费视频精品一区二区三区 | 日韩特级片 | www.国产一区二区三区 | 日韩一级片视频 | 福利盒子手机看片 | 亚洲高清国产一区二区三区 |