会员
周边
众包
新闻
博问
闪存
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
c语言源码
ural 1846. GCD 2010
简单线段树。用sort+unique离散化(注意要erase)
#include<cstdio> #include<vector> #include<algorithm> #define con 100100 using namespace std; int op[con],pos[con],sum[con],n; vector<int> in; int tree[270010]; int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } void insert(int s,int t,int pos,int v,int id){ if(s==t){ tree[id]=v; return; } int mid=(s+t)>>1; if(mid<pos) insert(mid+1,t,pos,v,id*2+1); else insert(s,mid,pos,v,id*2); tree[id]=gcd(tree[id*2],tree[id*2+1]); } int main() { int i,j,tem; char s[5]; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%s %d",s,&pos[i]); in.push_back(pos[i]); if(s[0]=='+') op[i]=1; else op[i]=0; } sort(in.begin(),in.end()); in.erase(unique(in.begin(),in.end()),in.end()); int nn=in.size(); for(int i=1;i<=n;i++) pos[i]=lower_bound(in.begin(),in.end(),pos[i])-in.begin(); // 有可能出现in里面为1,2,1,2,2,2,2,2,2(nn=2),这时二分搜2的位置就不是第一个2了,所以要先erase for(i=1;i<=n;i++){ if(op[i]){ sum[pos[i]]++; if(sum[pos[i]]==1){ insert(1,nn,pos[i]+1,in[pos[i]],1); } } else{ sum[pos[i]]--; if(sum[pos[i]]==0){ insert(1,nn,pos[i]+1,0,1); } } if(tree[1]!=0) printf("%d\n",tree[1]); else printf("1\n"); } }
posted on
2012-02-24 13:09
c语言源码
阅读(
286
) 评论(
0
)
编辑
收藏
举报
刷新页面
返回顶部
导航
博客园
首页
新随笔
联系
订阅
管理
公告