本文共 2059 字,大约阅读时间需要 6 分钟。
分块(超时)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 using namespace std;12 typedef long long ll;13 const int inf=0x7fffffff;14 const int N=100000+100;15 const int M=5000+10;16 const double PI=acos(-1.0);17 int B=1000;18 int n,m,a[N],num[N];19 int I,J,K;20 vector buck[N/1000];21 int main()22 {23 scanf("%d %d",&n,&m);24 for(int i=0;i >1;40 int x=num[md];41 int tl=I-1,tr=J,c=0;42 while(tl=K) ub=md-1;51 else lb=md+1;52 }53 printf("%d\n",num[lb]);54 }55 56 57 return 0;58 }
主席树:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 using namespace std;12 typedef long long ll;13 const int inf=0x7fffffff;14 const int N=100000+100;15 const int M=5000+10;16 const double PI=acos(-1.0);17 int n,m,a[N],num[N];18 int I,J,K;19 vector buck[(1<<18)-1];20 void build(int rt,int l,int r)21 {22 if(l==r)23 {24 buck[rt].push_back(a[l]);25 return ;26 }27 int m= l+r >>1;28 build(rt<<1,l,m);29 build(rt<<1|1,m+1,r);30 buck[rt].resize(r-l+1);31 merge(buck[rt<<1].begin(),buck[rt<<1].end(),buck[rt<<1|1].begin(),buck[rt<<1|1].end(),buck[rt].begin());32 }33 int query(int L,int R,int x,int rt,int l,int r)34 {35 if(R >1;40 ans+=query(L,R,x,rt<<1,l,m);41 ans+=query(L,R,x,rt<<1|1,m+1,r);42 return ans;43 }44 int main()45 {46 scanf("%d %d",&n,&m);47 for(int i=1;i<=n;i++)48 {49 scanf("%d",&a[i]);50 num[i]=a[i];51 }52 sort(num+1,num+1+n);53 build(1,1,n);54 while(m--)55 {56 scanf("%d %d %d",&I,&J,&K);57 //J++;58 int lb=1,ub=n;59 while(lb<=ub)60 {61 int md=lb+ub >>1;62 int c=query(I,J,num[md],1,1,n);63 if(c>=K) ub=md-1;64 else lb=md+1;65 }66 printf("%d\n",num[lb]);67 }68 69 return 0;70 }
转载于:https://www.cnblogs.com/Kaike/p/10808572.html