1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在。
2:在当前的人物集合中询问程序员的mod Y 最小的值。 (为什么统计这个?因为拯救
过世界的人太多了,只能取模)
标签:
1 //It is made by jump~ 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <ctime> 9 #include <vector> 10 #include <queue> 11 #include <map> 12 #include <set> 13 #ifdef WIN32 14 #define OT "%I64d" 15 #else 16 #define OT "%lld" 17 #endif 18 using namespace std; 19 typedef long long LL; 20 const int MAXN = 100011; 21 const int MAXM = 300011; 22 const int size = 300; 23 int n,father[MAXM],N; 24 bool vis[MAXM]; 25 char ch[2]; 26 int ans[size+1]; 27 struct wen{ 28 int type,x; 29 int ans; 30 }q[MAXN]; 31 32 inline int getint() 33 { 34 int w=0,q=0; 35 char c=getchar(); 36 while((c<‘0‘ || c>‘9‘) && c!=‘-‘) c=getchar(); 37 if (c==‘-‘) q=1, c=getchar(); 38 while (c>=‘0‘ && c<=‘9‘) w=w*10+c-‘0‘, c=getchar(); 39 return q ? -w : w; 40 } 41 42 inline int find(int x){ 43 if(father[x]!=x) father[x]=find(father[x]); 44 return father[x]; 45 } 46 47 inline void work(){ 48 n=getint(); 49 for(int i=1;i<=size;i++) ans[i]=(1<<30); 50 for(int i=1;i<=n;i++) { 51 scanf("%s",ch); q[i].x=getint(); 52 if(ch[0]==‘A‘) { q[i].type=1; vis[q[i].x]=1; N=max(N,q[i].x); for(int j=1;j<=size;j++) ans[j]=min(ans[j],q[i].x%j); } 53 else { q[i].type=2; if(q[i].x<=size) q[i].ans=ans[q[i].x]; } 54 } 55 for(int i=1;i<=N;i++) if(vis[i]) father[i]=i; else father[i]=i+1;//father[i]表示大于i的最小值 56 father[N+1]=N+1; 57 for(int i=n;i>=1;i--) { 58 if(q[i].type==1) { father[q[i].x]=q[i].x+1; }//改变原来的值 59 else if(q[i].x>size) { 60 q[i].ans=find(1); 61 for(int j=q[i].x;j<=N;j+=q[i].x) { 62 int lin=find(j); 63 if(lin<=N) q[i].ans=min(lin%q[i].x,q[i].ans);//记得取模 64 else break; 65 } 66 } 67 } 68 for(int i=1;i<=n;i++) if(q[i].type==2) printf("%d\n",q[i].ans); 69 } 70 71 int main() 72 { 73 work(); 74 return 0; 75 }
BZOJ4320 ShangHai2006 Homework
标签:
原文地址:http://www.cnblogs.com/ljh2000-jump/p/5751026.html