湖南多校对抗赛(2015.03.28) H SG Value

题意:给你一个集合,动态插入 ,动态询问,然后问你这个集合的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 }

时间: 2024-10-19 07:05:21

湖南多校对抗赛(2015.03.28) H SG Value的相关文章

湖南多校对抗赛3.28 J - Jerry&#39;s trouble

Problem J: Jerry's trouble Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 96  Solved: 46 [Submit][Status][Web Board] Description Jerry is caught by Tom. He was penned up in one room with a door, which only can be opened by its code. The code is the

iOS 学习笔记 六 (2015.03.28)常见错误

2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' objects You own any object you create You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, 

湖南多校对抗赛(2015.03.28) E Longest Increasing Subsequence Again

题意:给你一个序列,问你删除掉连续的一段,使得剩下的序列的最长上升字串最大,问你这个最大值. 解题思路:分段dp,  dp[i][0] ,dp[i][1]   , 0表示前面没有切过,只能从前一个数的0状态得到,1状态表示前面已经切过了,能从前一个的1状态得到,也能从 在他前面的比他值小的dp[j][0](j < i && a[j] < a[i])的最大值得到,这里用线段树维护就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkd

湖南多校对抗赛(2015.03.28) G Good subsequence

题意:找到一个序列中极值<=k的最长字串的长度. 解题思路:set容器双递推. 解题代码: 1 // File Name: g.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时04分39秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque>

湖南多校对抗赛(2015.03.28) A Rectangle

题意:给你一些最多宽为2 的木板,让你放在一个宽为二的盒子里面,问你这个盒子最短有多长. 解题思路:DP,离中间最近的那个值. 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时13分56秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9

湖南多校对抗赛(2015.03.28) B Design road

题意:给你起点(0,0),终点(x,y),中间有很多条河, 在河上面建桥花费c1,在陆地建路花费c2,问你最小花费是多少. 解题思路:我们知道,我们考虑的时候完全可以把河都移动到一边来求,这样只需要三分就行了. 解题代码: 1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 13时26分39秒 4 5 #include<vector> 6 #include<list> 7 #

湖南多校对抗赛(2015.03.28) I Inversion Sequence

题意:给你一个序列a[i],代表 i这个数 在b数列中有多少个值在它前面且比它大,问你求B序列 解题思路:线段树的简单应用,找第几个空,类似二分. 解题代码: 1 // File Name: i.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时56分11秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<

湖南多校对抗赛(2015.03.28)CSU1547~1536 题解

比赛链接:点击打开链接 A:点击打开链接 题意: 有2种矩阵1*x和2*x, 用最小的矩阵2*m来把这些框住,使得m最小,输出最小的m 输入: n个矩阵 下面n行给出wi, xi, wi的取值只有1,2两种,且矩阵不能旋转重叠. 思路: 矩阵宽为2就直接加到答案上,所以只考虑矩阵宽为1. dp[i]表示第一行能放的宽度,类似背包求出这个dp 然后if(dp[i] is ok) ans = min(ans, max(sum-i, i) ); #include <iostream> #includ

湖南多校对抗赛(2015.03.15)9题题解 ABCEFGHJK

比赛链接:点击打开链接 A:点击打开链接 题意: 问n的排列中多少个不满足 for(int i = 1; i <= n; i++) a[a[i]] == a[i]; 显然有 n!-1 所以输出 (n!-1)%mod; #include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstrin