3443: 装备合成

Time Limit: 15 Sec  Memory Limit: 128 MB
Submit: 63  Solved: 31

Description

【背景】
    lll6924在某游戏中有n件装备。
【描述】
    游戏中共有m种属性,装备有属性加成。当将A装备合成到B装备上时,A装备消失,B装备的所有小于A装备的属性更新为A装备的这个属性。然而lll6924的记性不太好,因为装备很多,所以一些属性常常记错,他在合成时会突然想起,某个装备的某个属性的初始值应该是多少(暂且认为修改后是正确的,这个属性可能会被修改多次)(请注意,这是理解题意的难点,请结合样例)。在合成过程中lll6924想知道一些装备的一些属性(根据之前给出的数据(初始属性、合成、修改),输出装备当前认为是正确的属性)。

Input

    输入有n+1+q行,第一行有三个用空格隔开的正整数n、m、q,q表示操作(合成操作、询问操作和修改操作)数。接下来的n行,每行有m个用空格隔开的正整数,表示这个装备的各个属性。接下来的q行,每行格式为“k a b c”,若k为1,则为将第a个装备合成到第b个装备,输入数据保证a、b装备存在,此时c=0。若k为2,则为询问第a个装备的第b个属性(若第a个装备已被合成掉,则输出该装备在被合成前的第b个属性是多少),此时c=0。若k为3,则为将第a个装备的第b个属性的初始值更新为c(注意,若a装备已被合成掉,该操作仍然有效,会影响他合成到的装备的属性)。

Output

    输出如输入格式所述,每个输出占一行。

Sample Input

3 5 10
1 2 3 4 3
0 0 0 0 0
2 0 0 0 0
1 1 2 0
2 2 3 0
3 2 4 5
1 2 3 0
3 1 3 2
2 3 1 0
3 3 1 0
2 3 1 0
2 3 4 0
2 2 3 0

Sample Output

3
2
1
5
2
【数据范围及约定】
100%的数据,0<n≤1500,0<m≤400,0<q≤200000,0≤装备属性≤50000。

HINT

Source

【分析】

  突然爱上可以离线的题。。

  【上面那题强制在线spaly还不会做啊啊啊

  这题,跟BZOJ2333差不多啊,就是先把树建出来,然后弄dfs序,再用线段树维护。

  建树就是按时间顺序,两个合并的时候弄一个新的点,询问的时候就问新的这个点。

T了之后乱开数组范围了ORZ。。【发现我数组范围永远开不对。。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. #define Maxn 1000010
  9. #define Mn 1010
  10.  
  11. int a[Maxn],pos[Maxn],b[Maxn];
  12. int rt[Mn],ft[Mn],add[Mn];
  13. int sq;
  14.  
  15. bool cmp(int x,int y) {return x>y;}
  16.  
  17. void upd(int x)
  18. {
  19. for(int i=ft[x];i<=rt[x];i++) b[i]=a[i];
  20. sort(b+ft[x],b++rt[x],cmp);
  21. }
  22.  
  23. void change(int x,int y,int c)
  24. {
  25. if(pos[x]==pos[y])
  26. {
  27. for(int i=x;i<=y;i++) a[i]+=c;
  28. upd(pos[x]);
  29. }
  30. else
  31. {
  32. for(int i=x;i<=rt[pos[x]];i++) a[i]+=c;
  33. for(int i=ft[pos[y]];i<=y;i++) a[i]+=c;
  34. for(int i=pos[x]+;i<pos[y];i++) add[i]+=c;
  35. upd(pos[x]);upd(pos[y]);
  36. }
  37. }
  38.  
  39. int ffind(int x,int y)
  40. {
  41. int l=ft[x],r=rt[x];
  42. if(b[l]+add[x]<y) return ;
  43. while(l<r)
  44. {
  45. int mid=(l+r+)>>;
  46. if(b[mid]+add[x]>=y) l=mid;
  47. else r=mid-;
  48. }
  49. return l-ft[x]+;
  50. }
  51.  
  52. int query(int x,int y,int c)
  53. {
  54. int ans=;
  55. if(pos[x]==pos[y])
  56. {
  57. for(int i=x;i<=y;i++) if(a[i]+add[pos[i]]>=c) ans++;
  58. }
  59. else
  60. {
  61. for(int i=x;i<=rt[pos[x]];i++) if(a[i]+add[pos[x]]>=c) ans++;
  62. for(int i=ft[pos[y]];i<=y;i++) if(a[i]+add[pos[y]]>=c) ans++;
  63. for(int i=pos[x]+;i<pos[y];i++) ans+=ffind(i,c);
  64. }
  65. return ans;
  66. }
  67.  
  68. int main()
  69. {
  70. int n,q;
  71. scanf("%d%d",&n,&q);
  72. sq=(int)ceil(sqrt((double)n));
  73. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  74. for(int i=;i<=n;i++) b[i]=a[i];
  75. for(int i=;i<=n;i++) pos[i]=(i-)/sq+;
  76. for(int i=;i<n;i++) if(pos[i]!=pos[i+]) rt[pos[i]]=i,ft[pos[i+]]=i+;
  77. ft[]=;rt[pos[n]]=n;
  78. for(int i=;i<=pos[n];i++) add[i]=;
  79. for(int i=;i<=pos[n];i++) sort(b+ft[i],b+rt[i]+,cmp);
  80. /*printf("sq = %d\n",sq);
  81. for(int i=1;i<=n;i++) printf("%d ",pos[i]);printf("\n");
  82. for(int i=1;i<=sq;i++) printf("%d ",ft[i]);printf("\n");
  83. for(int i=1;i<=sq;i++) printf("%d ",rt[i]);printf("\n");*/
  84. // while(1);
  85. for(int i=;i<=q;i++)
  86. {
  87. char s[];
  88. int x,y,c;
  89. scanf("%s%d%d%d",s,&x,&y,&c);
  90. if(s[]=='M')
  91. {
  92. change(x,y,c);
  93. }
  94. else
  95. {
  96. printf("%d\n",query(x,y,c));
  97. }
  98. }
  99. return ;
  100. }

2017-03-27 22:08:51

【BZOJ 3443】 3443: 装备合成 (离线+线段树)的更多相关文章

  1. BZOJ 2333 棘手的操作(离线+线段树+带权并查集)

    这题搞了我一天啊...拍不出错原来是因为极限数据就RE了啊,竟然返回WA啊.我的线段树要开8倍才能过啊... 首先可以发现除了那个加边操作,其他的操作有点像线段树啊.如果我们把每次询问的联通块都放在一 ...

  2. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  3. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  4. bzoj2333 离线 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...

  5. HDU 5700 区间交 离线线段树

    区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...

  6. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  7. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  8. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  9. BZOJ 3339 Rmq Problem(离线+线段树+mex函数)

    题意: q次询问,问[l,r]子区间的mex值 思路: 对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减 对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r] ...

随机推荐

  1. 【BZOJ】2599: [IOI2011]Race 点分治

    [题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...

  2. 用Vue来实现图片上传多种方式

    没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景.假设我们要做一个后台系统添加商品的页面,有一些商品名称.信息等字段,还有需要上传商品轮播图的需求. 我们就以Vue.Element ...

  3. h5+js随机拖动鼠标产生动画效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. UNIX环境高级编程学习笔记(十)为何 fork 函数会有两个不同的返回值【转】

    转自:http://blog.csdn.net/fool_duck/article/details/46917377 以下是基于 linux 0.11 内核的说明. 在init/main.c第138行 ...

  5. Python3中字符串的编码与解码以及编码之间转换(decode、encode)

    一.编码 二.编码与解码 Python3中对py文件的默认编码是urf-8.但是字符串的编码是Unicode. 由于Unicode采用32位4个字节来表示一个字符,存储和传输太浪费资源,所以传输和存储 ...

  6. AJP与HTTP比较和分析

    系统环境: OS:Ubuntu 10.10 (2G) Servlet Container:tomcat-tomcat-7.0.23  (最大内存:default 256M  maxThreads:50 ...

  7. curl 发送请求的时候报错

    AWS HTTP error: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see ...

  8. Nginx - 隐藏或修改版本号

    1. 前言 无论是修改 Nginx 版本还是隐藏 Nginx 版本号,都是很简单的操作,对外来说,相对更安全些. 2. 修改 Nginx 版本号 对于修改 Nginx 版本号来说,需要在源码的基础上进 ...

  9. 表格中上移下移置顶的js操作

    <script> $(function(){  //上移  var $up = $(".up")  $up.click(function() {   var $tr = ...

  10. leetcode 之Valid Sudoku(七)

    判断行.列.九宫格内数字是否重复. 按照行.列.九宫格进行检查即可. bool validSudoku(const vector<vector<char>>& boar ...