题目传送门

  传送门

题目大意

  给定一个数组$a$和数组$b$,每次操作可以选择$a$的一个子区间将其中的数在模4意义下加1,问把$a$变成$b$的最少操作次数。

  首先求$b - a$,再差分,令这个数组为$c$。

  那么操作的次数是这个数组$c$中正数的和。

  现在可以做的是选择一个地方+4,它后面的某个地方-4。

  考虑什么时候可以使得当前的答案减少。

  • 在$-3$处$+4$,在$3$处$-4$,答案减少2
  • 在$-3$处$+4$,在$2$处$-4$,答案减少1
  • 在$-2$处$+4$,在$3$处$-4$,答案减少1

  首先我们将尽量靠后的$-3$和$3$匹配,然后将对它操作。

  这个用一个栈就能做。

  剩下就贪心一下就好了。注意当$-3$和$2$操作时会多出$-2$。

Code

  1. /**
  2. * bzoj
  3. * Problem#3704
  4. * Accepted
  5. * Time: 1400ms
  6. * Memory: 128316k
  7. */
  8. #include <iostream>
  9. #include <cstdlib>
  10. #include <cstdio>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14. typedef bool boolean;
  15.  
  16. typedef class Input {
  17. protected:
  18. const static int limit = ;
  19. FILE* file;
  20.  
  21. int ss, st;
  22. char buf[limit];
  23. public:
  24.  
  25. Input():file(NULL) { };
  26. Input(FILE* file):file(file) { }
  27.  
  28. void open(FILE *file) {
  29. this->file = file;
  30. }
  31.  
  32. void open(const char* filename) {
  33. file = fopen(filename, "r");
  34. }
  35.  
  36. char pick() {
  37. if (ss == st)
  38. st = fread(buf, , limit, file), ss = ;//, cerr << "str: " << buf << "ed " << st << endl;
  39. return buf[ss++];
  40. }
  41. }Input;
  42.  
  43. #define digit(_x) ((_x) >= '0' && (_x) <= '9')
  44.  
  45. Input& operator >> (Input& in, unsigned& u) {
  46. char x;
  47. while (~(x = in.pick()) && !digit(x));
  48. for (u = x - ''; ~(x = in.pick()) && digit(x); u = u * + x - '');
  49. return in;
  50. }
  51.  
  52. Input& operator >> (Input& in, unsigned long long& u) {
  53. char x;
  54. while (~(x = in.pick()) && !digit(x));
  55. for (u = x - ''; ~(x = in.pick()) && digit(x); u = u * + x - '');
  56. return in;
  57. }
  58.  
  59. Input& operator >> (Input& in, int& u) {
  60. char x;
  61. while (~(x = in.pick()) && !digit(x) && x != '-');
  62. int aflag = ((x == '-') ? (x = in.pick(), -) : ());
  63. for (u = x - ''; ~(x = in.pick()) && digit(x); u = u * + x - '');
  64. u *= aflag;
  65. return in;
  66. }
  67.  
  68. Input& operator >> (Input& in, long long& u) {
  69. char x;
  70. while (~(x = in.pick()) && !digit(x) && x != '-');
  71. int aflag = ((x == '-') ? (x = in.pick(), -) : ());
  72. for (u = x - ''; ~(x = in.pick()) && digit(x); u = u * + x - '');
  73. u *= aflag;
  74. return in;
  75. }
  76.  
  77. Input& operator >> (Input& in, char* str) {
  78. for (char x; ~(x = in.pick()) && x != '\n' && x != ' '; *(str++) = x);
  79. return in;
  80. }
  81.  
  82. Input in (stdin);
  83.  
  84. template <typename T>
  85. void pfill(T* pst, const T* ped, T val) {
  86. for ( ; pst != ped; *(pst++) = val);
  87. }
  88.  
  89. int n;
  90. int *a, *b, *c;
  91. boolean *used;
  92.  
  93. inline void init() {
  94. in >> n;
  95. a = new int[(n + )];
  96. b = new int[(n + )];
  97. c = new int[(n + )];
  98. for (int i = ; i <= n; i++) {
  99. in >> a[i];
  100. }
  101. for (int i = ; i <= n; i++) {
  102. in >> b[i];
  103. c[i] = (b[i] - a[i] + ) % ;
  104. }
  105. }
  106.  
  107. stack<int> sta;
  108. inline void solve() {
  109. int ans = ;
  110. for (int i = n; i > ; i--)
  111. c[i] = c[i] - c[i - ];
  112. used = new boolean[(n + )];
  113. pfill(used, used + n + , false);
  114. for (int i = ; i <= n; i++)
  115. if (c[i] > )
  116. ans += c[i];
  117. for (int i = , y; i <= n; i++)
  118. if (c[i] == -)
  119. sta.push(i);
  120. else if (c[i] == && !sta.empty()) {
  121. y = sta.top();
  122. sta.pop();
  123. used[y] = used[i] = true;
  124. ans -= ;
  125. }
  126.  
  127. int have_2 = , have_3 = ;
  128. for (int i = ; i <= n; i++) {
  129. if (used[i])
  130. continue;
  131. switch (c[i]) {
  132. case :
  133. if (have_3)
  134. have_3--, ans--;
  135. else if (have_2)
  136. have_2--, ans--;
  137. break;
  138. case :
  139. if (have_3)
  140. have_3--, have_2++, ans--;
  141. break;
  142. case -:
  143. have_2++;
  144. break;
  145. case -:
  146. have_3++;
  147. break;
  148. }
  149. }
  150. printf("%d\n", ans);
  151. }
  152.  
  153. int main() {
  154. init();
  155. solve();
  156. return ;
  157. }

bzoj 3704 昊昊的机油之GRST - 贪心的更多相关文章

  1. bzoj 3704 昊昊的机油之GRST 贪心dp,思维

    昊昊的机油之GRST Time Limit: 10 Sec  Memory Limit: 1024 MBSubmit: 80  Solved: 33[Submit][Status][Discuss] ...

  2. UESTC 1256 昊昊爱运动 Map

    昊昊爱运动 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他N天 ...

  3. CDOJ 1259 昊昊爱运动 II 线段树+bitset

    昊昊爱运动 II 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r ...

  4. cdoj 1256 昊昊爱运动 预处理/前缀和

    昊昊爱运动 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1256 Descr ...

  5. CDOJ 1259 昊昊爱运动 II bitset+线段树

    题目链接 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了 ...

  6. cdojQ - 昊昊爱运动 II

    地址:http://acm.uestc.edu.cn/#/contest/show/95 题目: Q - 昊昊爱运动 II Time Limit: 3000/1000MS (Java/Others) ...

  7. UESTC-1259 昊昊爱运动 II

    昊昊爱运动 II Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)     昊昊喜 ...

  8. cdoj 1256 昊昊爱运动 预处理

    昊昊爱运动 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) 昊昊喜欢运动 他NN ...

  9. bzoj 3704: 昊昊的机油之GRST【贪心+脑洞】

    脑洞题大概 首先处理出每个位置需要操作的次数c,假设第一次达到目标就不能再走,这样的操作次数是c差分后值的正数和,就想成分治每一段然后同减最小值然后从0处断开 然后考虑能一圈一圈走的情况,连续一段多走 ...

随机推荐

  1. 搭建ionic3-angular5 开发环境并打包成安卓apk包教程

    安装node.js 搭建ionic3-angular5 开发环境,首先查看本地电脑是否安装node环境,打开终端,输入 命令: node -v 没有去安装nodejs  网址:http://nodej ...

  2. 微信小程序--地图组件与api-模拟器上返回的scale 与真机上不同--bindregionchange触发图标一直闪现问题

    场景:根据地理定位获取不同地区的充电桩位置,要求 1.平移的时候,跟随坐标变化展示不同区域的坐标点信息 2.不同的缩放等级,14以下,展示聚合点数据,14以上,展示真正的站点信息: 3.点击聚合点的时 ...

  3. 我喜欢的几款不错的vim插件

    插件安装组件 https://github.com/tpope/vim-pathogen supertab自动补齐 https://www.vim.org/scripts/script.php?scr ...

  4. C# Asp.net中简单操作MongoDB数据库(二)

    C# Asp.net中简单操作MongoDB数据库(一)    , mongodb数据库连接可以回顾上面的篇幅. 1.model类: public class BaseEntity { /// < ...

  5. HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】

    最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...

  6. python处理Excel - xlrd xlwr openpyxl

    python处理Excel - xlrd xlwr openpyxl 1 xlrd和xlwt Todo: 使用xlrd和xlwt读写Excel文件的方法和示例代码,待续... 参考链接: Creati ...

  7. JavaScript监控页面input输入整数且只能输入2位小数

    <input type="text" id="money" /> <script> $(function () { $('#money' ...

  8. Xamarin.Forms 开发资源集合

    收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...

  9. 编年史:OI测试

    2019.4.18 t1:给出不定方程ax+by+c=0,求x在x1~x2并且y在y1~y2时的解个数.考场上想的是一个扩欧板子敲下去,然后构造出x>=x1的最小解,同时得出y,然后通过通项来枚 ...

  10. C++ 自定义订单号

    自定义订单号 #include<iostream> #include<stack> #include <time.h> #include <sys/timeb ...