训练的时候对G想了一个假算法。。也有很大可能是写错了。。

下来一看别人的G 看起来很奇妙。。

开始把所有的左括号翻成右括号,然后cost*=-1 这样在优先队列中就是最优的 然后for每一段 如果前缀和小于0就从优先队列中取右括号翻转

最后的结果一定是一个可行的括号序列

1 如果所有的原左括号都被重新反转,那么我们的选择仍然是最优,因为实际上没有在这个上面消耗

2 如果原左括号没有都被反转回去 那么我们的实际消耗也是最少的

J题一看就能想出来nmmm的想法 但是很远。。并没有想到nmm的 没想到可以nmmlogm过 就比较神奇了

画图可以发现 数字的大小其实是从右向左不断扩散的

思考nmmm的做法 对于第i个数字 枚举他是第k个a中的数字,那么就需要找到 第j个数字让它在a中做第k+1位来承接状态

但是这样状态不全 第j个数字是有限制的 它需要比第i个数字大或者小 而又有范围

因为数字的大小有规律 所以把范围也记录下来 第i个数字一定是范围的一边 于是只需要记录另一边就可以了

对于“另一边” 要么是第j个数字要么是之前传下来的 总之我们需要for一下这个范围来让他们加上当前状态

考虑区间加直接把状态加上去就可以把m变成logm了。。虽然复杂度仍然感觉不科学

G

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<vector>
  6. #include<queue>
  7. #include<map>
  8. #include<algorithm>
  9. #include<stack>
  10. using namespace std;
  11. #define L long long
  12.  
  13. #define rep(i,l,r) for(L i = l ; i <= r ; i ++ )
  14.  
  15. const L mod = 1000000000 + 7 ;
  16.  
  17. struct node {
  18. L cost ;
  19. L num ;
  20. friend bool operator < (node A , node B) {
  21. return A.cost > B.cost ;
  22. }
  23. };
  24.  
  25. L a[100050] ;
  26. L b[100050] ;
  27.  
  28. int main () {
  29. L n ;
  30. while(scanf("%lld" , &n) != EOF) {
  31. L ans = 0 ;
  32. rep(i,1,n) {
  33. L l,d ; char s[20] ;
  34. scanf("%lld%s%lld" , &l,s,&d) ;
  35. a[i] = l ;
  36. b[i] = d ;
  37. if(s[0] == '(') {
  38. ans += a[i] * b[i] ;
  39. b[i] *= -1 ;
  40. }
  41. }
  42. priority_queue<node> q ;
  43. L sum = 0 ;
  44. rep(i,1,n) {
  45. node c ;
  46. c.num = a[i] ;
  47. c.cost = b[i] ;
  48. q.push(c) ;
  49. sum -= c.num ;
  50. if(sum >= 0) continue ;
  51. L ned = sum * (-1) ;
  52. ned ++ ; ned /= 2 ;
  53. sum += ned * 2;
  54. while(ned > 0) {
  55. node c = q.top() ; q.pop() ;
  56. if(c.num >= ned) {
  57. c.num -= ned ;
  58. ans += ned * c.cost ;
  59. q.push(c) ;
  60. ned = 0 ;
  61. }
  62. else {
  63. ned -= c.num ;
  64. ans += c.num * c.cost ;
  65. }
  66. }
  67. }
  68. printf("%lld\n" , ans) ;
  69. }
  70. }

J

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<vector>
  6. #include<queue>
  7. #include<map>
  8. #include<algorithm>
  9. #include<stack>
  10. using namespace std;
  11. #define L long long
  12.  
  13. #define rep(i,l,r) for(L i = l ; i <= r ; i ++ )
  14.  
  15. const L mod = 1000000000 + 7 ;
  16.  
  17. L n , m ;
  18.  
  19. L a[22] ;
  20. L b[505] ;
  21.  
  22. L dp[505][505][22] ;
  23. L s[505][505][22] ;
  24.  
  25. L lowbit(L x) {
  26. return (x & (-x)) ;
  27. }
  28.  
  29. void add(L x,L j,L k,L val) {
  30. while(x <= m) {
  31. s[x][j][k] += val ;
  32. while(s[x][j][k] < 0) s[x][j][k] += mod ;
  33. s[x][j][k] %= mod ;
  34. x += lowbit(x) ;
  35. }
  36. }
  37. L sum(L x,L j,L k) {
  38. L sum = 0 ;
  39. while(x) {
  40. sum += s[x][j][k] ;
  41. sum %= mod ;
  42. x -= lowbit(x) ;
  43. }
  44. return sum ;
  45. }
  46. void upda(L l,L r,L val,L j,L k) {
  47. add(l,j,k,val) ;
  48. add(r+1,j,k,-val) ;
  49. }
  50.  
  51. int main () {
  52. while(cin >> n >> m) {
  53. rep(i,1,n) cin >> a[i] ;
  54. rep(i,1,m) cin >> b[i] ;
  55. memset(dp, 0, sizeof(dp)) ;
  56. memset(s, 0, sizeof(s)) ;
  57. L ans = 0 ;
  58. for(L i = 1 ; i <= m ; i ++ ) {
  59. for(L j = 1 ; j <= m ; j ++ ) {
  60. for(L k = 1 ; k <= n ; k ++ ) {
  61. if(k == 1) {
  62. L bord ;
  63. if(a[1] == 0) bord = m ;
  64. else bord = 1 ;
  65. if (bord != j) continue ;
  66. dp[i][bord][1] = 1 ;
  67. if (k == n){
  68. ans += dp[i][j][k];
  69. ans %= mod ;
  70. }
  71. } else {
  72. dp[i][j][k] = sum(b[i], j, k);
  73. if (k == n){
  74. ans += dp[i][j][k];
  75. ans %= mod ;
  76. }
  77. }
  78. }
  79. }
  80. for(L j = 1 ; j <= m ; j ++ ) {
  81. for(L k = 1 ; k <= n ; k ++ ) {
  82. if(k == 1) {
  83. L bord ;
  84. if(a[1] == 0) bord = m ;
  85. else bord = 1 ;
  86. if (bord != j) continue ;
  87. L x = min(bord,b[i]) ;
  88. L y = max(bord,b[i]) ;
  89. if(a[2] == 0) {
  90. upda(x,y,1,y,2) ;
  91. } else {
  92. upda(x,y,1,x,2) ;
  93. }
  94. } else {
  95. L x = min(j, b[i]);
  96. L y = max(j, b[i]);
  97. if (dp[i][j][k] == 0) continue;
  98. if (a[k + 1] == 0) {
  99. upda(x, y, dp[i][j][k], y, k + 1);
  100. } else {
  101. upda(x, y, dp[i][j][k], x, k + 1);
  102. }
  103. }
  104. }
  105. }
  106.  
  107. }
  108. printf("%lld\n" , ans) ;
  109. }
  110. }

J线段树会T。。。

2017 湘潭邀请赛&JSCPC G&J的更多相关文章

  1. XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]

    2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下…… 题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id ...

  2. XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]

    这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...

  3. XTU 1260 - Determinant - [2017湘潭邀请赛A题(江苏省赛)][高斯消元法][快速幂和逆元]

    是2017江苏省赛的第一题,当时在场上没做出来(废话,那个时候又不懂高斯消元怎么写……而且数论也学得一塌糊涂,现在回来补了) 省赛结束之后,题解pdf就出来了,一看题解,嗯……加一行再求逆矩阵从而得到 ...

  4. XTU 1261 - Roads - [最小割][2017湘潭邀请赛B题(江苏省赛)]

    之前在网上搜了一个下午没搜到这道题的题解,然后同时又对着叉姐写的两行字题解看了一个下午: 虽然基本上已经知道了这题的思路,但愣是因为自己代码实现起来太繁复,外加不确定正确性,没敢码…… 但是一道题肝了 ...

  5. 1250 Super Fast Fourier Transform(湘潭邀请赛 暴力 思维)

    湘潭邀请赛的一题,名字叫"超级FFT"最终暴力就行,还是思维不够灵活,要吸取教训. 由于每组数据总量只有1e5这个级别,和不超过1e6,故先预处理再暴力即可. #include&l ...

  6. 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结

    湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...

  7. HDU 6270 Marriage (2017 CCPC 杭州赛区 G题,生成函数 + 容斥 + 分治NTT)

    题目链接  2017 CCPC Hangzhou Problem G 题意描述很清晰. 考虑每个家庭有且仅有$k$对近亲的方案数: $C(a, k) * C(b, k) * k!$ 那么如果在第$1$ ...

  8. 湘潭邀请赛 Hamiltonian Path

    湘潭邀请赛的C题,哈密顿路径,边为有向且给定的所有边起点小于终点,怎么感觉是脑筋急转弯? 以后一定要牢记思维活跃一点,把复杂的事情尽量简单化而不是简单的事情复杂化. #include<cstdi ...

  9. 湘潭邀请赛 2018 I Longest Increasing Subsequence

    题意: 给出一个长度为n的序列,序列中包含0.定义f(i)为把所有0变成i之后的Lis长度,求∑ni=1i⋅f(i). 题解: 设不考虑0的Lis长度为L,那么对于每个f(i),值为L或L+1. 预处 ...

随机推荐

  1. instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系

    instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系          编程的时候可能会遇到一个不知道它属于哪个类的 ...

  2. Spoken English Practice(Look, That cute guy is checking me out. come on, give me a break, he's just looking around.)

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/7/6) 英 ...

  3. c#读取excel到dataset

    public DataSet TransExcelToDataSet(string fileName, List<string> sheetNames) { OleDbConnection ...

  4. Xcode 编译静态库

    有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...

  5. 如何重定向 stderr ?

    可以使用该方法写一个轻量级日志类 #include <cstdio> int main() { FILE *stream = freopen("freopen.txt" ...

  6. c++智能指针,new之后不需要delete,简单的垃圾回收

    http://www.cnblogs.com/TenosDoIt/p/3456704.html 智能指针的初始化: 错误: std::shared_ptr<Serializer> seri ...

  7. EC断言16种判断

    expected_conditions一般也简称EC,本篇先介绍下有哪些功能,后续更新中会单个去介绍. title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值 titl ...

  8. 初识Locust---认识

    性 能测试工具: 基于Python的性能测试工具-locust 现在性能测试方面有很多测试工具,比如我们熟悉的loadrunner.jmeter.ab等,用过的也就是这几种,如果是学过这些工具的可能对 ...

  9. Keras网络层之常用层Core

    常用层 常用层对应于core模块,core内部定义了一系列常用的网络层,包括全连接.激活层等 Dense层 keras.layers.core.Dense(units, activation=None ...

  10. Hbase1.2.4概述

    安装Hbase的时候,需要注意版本与Hadoop的版本兼容,具体查看:https://hbase.apache.org/book.html#basic.prerequisites 如下图: 我的Had ...