题意:给你一个集合,动态插入 ,动态询问,然后问你这个集合的sg值(这个集合用加法运算不能产生的那个最小正整数)是多少.

解题思路:假设我们现在的这个SG值是 x  

1)现在插入集合里面一个数v   如果这个v > x ,那么显然  sg值x不变,  把v放进从小到大的优先队列中

2)如果这个 v <= x 那么sg值x肯定就会变成  x + v, 每更新一次 sg值,就去看优先队列top元素是否是 小于等于 x的 ,如果小于等于,其实就等于把这个top元素进行1操作,这样就不会错了。

解题代码:

 1 // File Name: h.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月28日 星期六 16时28分10秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #include<queue>
25 #define LL long long
26 
27 using namespace std;
28 int t;
29 priority_queue<int,vector<int>,greater<int> > qu;
30 int main(){
31     //freopen("input","r",stdin);
32     //freopen("output","w",stdout);
33     while(scanf("%d",&t)!= EOF)
34     {
35         while(!qu.empty())
36             qu.pop();
37         LL l,r;
38         l = r = 0 ; 
39         int op,v;
40         for(int i = 1; i<= t ;i ++)
41         {
42             scanf("%d",&op);
43             if(op == 1)
44             {       
45                 scanf("%d",&v);
46                 if(v <= r +1)
47                 {
48                     r += v;
49                     while(!qu.empty())
50                     {
51                         int tmp = qu.top();
52                         if(tmp <= r+1)
53                         {
54                            r += tmp;
55                            qu.pop();
56                         }else{
57                           break;
58                         }
59                     }
60                 }else{
61                     qu.push(v);
62                 }
63             }else{
64                 printf("%lld\n",r+1);
65             }
66         }
67     }
68     return 0;
69 }
View Code

 

posted on 2015-03-29 09:35  dark_dream  阅读(200)  评论(0编辑  收藏  举报