| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
整体二分真的不知道怎么WA了本机和已经A了的主席树对拍。
跑极限数据,跑值很接近的数据都能过,但是一交就WA...
好不开心...蒟蒻求解。
不知道哪里出现了问题...
整体二分是从这题升级版那儿想到的,所以楼下神犇说不定可以用第6种方法AC了...求帮助...虽然我知道我的代码不好看= =
【附代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
const int INF=2*1e9;
struct Query{
int x,y,k,id,cur;
bool tp;
}q[maxn<<1],q1[maxn<<1],q2[maxn<<1];
int n,m,tot;
int ans[maxn],a[maxn],b[maxn],tmp[maxn<<1];
void add(int x,int d){
for(;x<=n;x+=x&-x) b[x]+=d;
}
int ask(int x){
int sum=0;
for(int i=x;i;i-=i&-i) sum+=b[i];
return sum;
}
void div(int H,int T,int l,int r){
if(H>T) return ;
if(l==r){
for(int i=H;i<=T;i++)
if(!q[i].tp) ans[q[i].id]=l;
return ;
}
int mid=(l+r)>>1;
for(int i=H;i<=T;i++){
if(q[i].tp && q[i].y<=mid) add(q[i].x,1);
else if(!q[i].tp)
tmp[i]=ask(q[i].y)-ask(q[i].x-1);
}
for(int i=H;i<=T;i++)
if(q[i].tp && q[i].y<=mid) add(q[i].x,-1);
int l1=0,l2=0;
for(int i=H;i<=T;i++){
if(q[i].tp){
if(q[i].y<=mid) q1[++l1]=q[i];
else q2[++l2]=q[i];
}
else{
if(q[i].cur+tmp[i]>=q[i].k) q1[++l1]=q[i];
else
q[i].cur+=tmp[i],q2[++l2]=q[i];
}
}
for(int i=1;i<=l1;i++) q[H+i-1]=q1[i];
for(int i=1;i<=l2;i++) q[H+l1+i-1]=q2[i];
div(H,H+l1-1,l,mid);
div(H+l1,T,mid+1,r);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2104.in","r",stdin);
freopen("2104.out","w",stdout);
#endif
int l,r,k;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
q[++tot].tp=1;q[tot].x=i;q[tot].y=a[i];
}
for(int i=1;i<=m;i++){
tot++;
scanf("%d%d%d",&q[tot].x,&q[tot].y,&q[tot].k);
q[tot].id=i;
}
div(1,tot,0,INF);
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator