LightOJ-1097-线段树

来源:互联网 发布:嘀哩嘀哩下载下载软件 编辑:程序博客网 时间:2024/06/03 08:51

题目大意:有一个奇数组成的数列,每次选第i个元素,从val[i]到最后删除,每次下标加上val[i]-1;

题目解析:用线段树暴力更新预处理;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;typedef long long ll;const int maxn=1429431;int val[maxn*3];void pushup(int rt){val[rt]=val[rt<<1]+val[rt<<1|1];}void build(int l,int r,int rt){if(l==r){if(l%2==1)val[rt]=1;else val[rt]=0;return ;}int m=(l+r)>>1;build(lson);build(rson);pushup(rt);}void update(int pos,int l,int r,int rt){if(l==r){val[rt]=0;return ;}int m=(l+r)>>1;if(pos<=val[rt<<1])update(pos,lson);else update(pos-val[rt<<1],rson);pushup(rt);}ll query(int pos,int l,int r,int rt){if(l==r)return l;int m=(l+r)>>1;if(pos<=val[rt<<1])return query(pos,lson);else return query(pos-val[rt<<1],rson);}void solve(){int i,j,temp;build(1,maxn,1);for(i=2;i<=val[1];i++){temp=query(i,1,maxn,1);//cout<<temp<<" "<<val[1]<<endl;for(j=temp;j<=val[1];j+=(temp-1)){update(j,1,maxn,1);}}}int main(){int cas,c;solve();scanf("%d",&cas);for(c=1;c<=cas;c++){ll n;scanf("%lld",&n);printf("Case %d: %lld\n",c,query(n,1,maxn,1));}return 0;}


0 0
原创粉丝点击