二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

  1. /*
  2. LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力
  3.  
  4. 叫做计算几何
  5. 实则毒瘤数据结构
  6.  
  7. 看到xor后
  8. 考虑Trie树
  9. Trie树的每一个节点保存的是以当前子树中每个二进制位的个数
  10.  
  11. 给Trie打一个全局xor标记,如果标记这一位是1,就交换它的两个儿子
  12.  
  13. 另外维护一个前缀和
  14. 前缀和存的是没sort过的值的和
  15. Trie维护的是sort之后的值
  16.  
  17. 1操作直接在前缀和后加就好
  18. 2操作在前缀和和Trie树中一起查
  19.  
  20. */
  21. #include <cstdio>
  22. #include <iostream>
  23. #define rg register
  24. const int BUF = ; char Buf[BUF], *buf = Buf; typedef long long LL;
  25. inline void read (int &n)
  26. {
  27. bool temp = false;
  28. for (n = ; !isdigit (*buf); ++ buf) if (*buf == '-') temp = true;
  29. for (; isdigit (*buf); n = n * + *buf - '', ++ buf);
  30. if (temp) n = -n;
  31. }
  32. #define Max 200009
  33. struct T_D { T_D *c[]; int s, thb[]; }; int s[Max][], v[Max];
  34. int _T, _S, C, T;
  35. class Trie
  36. {
  37. private : T_D poor[Max * ], *Tail, *Root, *null;
  38. private :
  39. inline T_D *New ()
  40. { T_D *now = Tail ++; now->c[] = now->c[] = null, now->s = ; return now; }
  41. public :
  42. Trie ()
  43. {
  44. Tail = poor, null = Tail ++, null->c[] = null->c[] = null;
  45. null->s = , Root = New ();
  46. }
  47. void Insert (const int &k)
  48. {
  49. T_D *n = Root; ++ T;
  50. for (rg int i = , j; i >= ; -- i)
  51. {
  52. if (n->c[(k >> i) & ] == null) n->c[(k >> i) & ] = New ();
  53. n = n->c[(k >> i) & ], ++ n->s;
  54. for (j = ; j <= ; ++ j) n->thb[j] += (k >> j) & ;
  55. }
  56. }
  57. inline void P (const int &key)
  58. {
  59. v[++ C] = key;
  60. for (rg int i = ; i <= ; ++ i) s[C][i] = s[C - ][i] + ((key >> i) & );
  61. }
  62. inline void ReBuild () { for (; C; Insert (v[C --])); _S = _T; }
  63. LL Find (int k)
  64. {
  65. T_D *n = Root; LL r = ; rg int i, j;
  66. for (i = ; i >= ; -- i)
  67. {
  68. if (k == ) break;
  69. if (k < n->c[(_S >> i) & ]->s) n = n->c[(_S >> i) & ];
  70. else
  71. {
  72. T_D *p = n->c[(_S >> i) & ]; k -= p->s;
  73. for (j = ; j <= ; ++ j)
  74. if ((_T >> j) & ) r += (LL) (p->s - p->thb[j]) << j;
  75. else r += (LL) p->thb[j] << j;
  76. n = n->c[(_S >> i) & ^ ];
  77. }
  78. }
  79. for (i = ; i <= ; ++ i)
  80. {
  81. if (((_T >> i) & ) && n->thb[i] == ) r += (LL) k << i;
  82. if (((_T >> i) & ) == && n->thb[i]) r += (LL) k << i;
  83. }
  84. return r;
  85. }
  86. LL Q (int k)
  87. {
  88. if (k <= T) return Find (k); LL r = Find (T); k -= T;
  89. for (rg int i = ; i <= ; ++ i)
  90. if ((_T >> i) & ) r += (LL) (k - s[k][i]) << i;
  91. else r += (LL) s[k][i] << i;
  92. return r;
  93. }
  94. void Cg (const int key) { _T ^= key; return ; }
  95. } D;
  96. int main (int argc, char *argv[])
  97. {
  98. fread (buf, , BUF, stdin); int N, M, x, t, y; read (N); rg int i;
  99. for (i = ; i <= N; ++ i) read (x), D.P (x);
  100. for (read (M); M; -- M)
  101. {
  102. read (t);
  103. if (t == ) read (x), D.P (x ^ _T);
  104. else if (t == )
  105. read (x), read (y), printf ("%I64d\n", D.Q(y) - D.Q(x - ));
  106. else if (t == ) read (x), D.Cg (x);
  107. else D.ReBuild ();
  108. }
  109. return ;
  110. }

LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力的更多相关文章

  1. [LOJ#517]. 「LibreOJ β Round #2」计算几何瞎暴力[trie]

    题意 题目链接 分析 记操作异或和为 \(tx\) ,最后一次排序时的异或和为 \(ax\) ,每个数插入时的 \(tx\) 记为 \(b\). 我们发现,一旦数列排序,就会变得容易操作. 对于新加入 ...

  2. 「LibreOJ β Round #2」计算几何瞎暴力

    https://loj.ac/problem/517 题解 首先我们如果没有排序这个骚操作的话,可以直接记一下各个数位的前缀和,然后异或标记给全局打,查询的时候先把区间信息提取出来然后整体异或就好了. ...

  3. LibreOJ #528. 「LibreOJ β Round #4」求和

    二次联通门 : LibreOJ #528. 「LibreOJ β Round #4」求和 /* LibreOJ #528. 「LibreOJ β Round #4」求和 题目要求的是有多少对数满足他们 ...

  4. LibreOJ #527. 「LibreOJ β Round #4」框架

    二次联通门 : LibreOJ #527. 「LibreOJ β Round #4」框架 /* LibreOJ #527. 「LibreOJ β Round #4」框架 %% xxy dalao 对于 ...

  5. LibreOJ #526. 「LibreOJ β Round #4」子集

    二次联通门 : LibreOJ #526. 「LibreOJ β Round #4」子集 /* LibreOJ #526. 「LibreOJ β Round #4」子集 考虑一下,若两个数奇偶性相同 ...

  6. LibreOJ #525. 「LibreOJ β Round #4」多项式

    二次联通门 : LibreOJ #525. 「LibreOJ β Round #4」多项式 官方题解 : /* LibreOJ #525. 「LibreOJ β Round #4」多项式 由于会有多种 ...

  7. LibreOJ #524. 「LibreOJ β Round #4」游戏

    二次联通门 : LibreOJ #524. 「LibreOJ β Round #4」游戏 /* LibreOJ #524. 「LibreOJ β Round #4」游戏 找找规律就会发现.. 当有X的 ...

  8. LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿

    二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...

  9. LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律

    二次联通门 : LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律 /* LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律 set ...

随机推荐

  1. 【leetcode-11】盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  2. c# sharepoint client object model 客户端如何创建中英文站点

    c# sharepoint client object model 客户端如何创建中英文站点 ClientContext ClientValidate = tools.GetContext(Onlin ...

  3. 如何在Mybatis的xml文件调用java类的方法

    在mybatis的映射xml文件调用java类的方法:使用的是OGNL表达式,表达式格式为:${@prefix@methodName(传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只是 ...

  4. 用cmake构建gtk程序

    情况说明 先前已经在windows下基于GDI实现了一个简陋的imshow:基于GDI的imshow:使用stb_image读取图像并修正绘制.考虑跨平台,也考虑万一某天M$不让我们用盗版系统了,还是 ...

  5. Docker搭建Portainer

    1.介绍 Docker 图形化管理提供了很多工具,有Portainer.Docker UI.Shipyard等等,本文主要介绍Portainer. Portainer是一个开源.轻量级Docker管理 ...

  6. php环境Unknown column '*' in 'field list'解决方案

    在使用pymysql 做网站往数据库插入数据时发现如下错误:pymysql.err.InternalError: (1054, "Unknown column '*' in 'field l ...

  7. Linux指令(时间日期类)

    date指令-显示当前日期 基本语法: 1)date (功能描述:显示当前时间) 2)date +%Y (功能描述:显示当前年份) 3)date +%m (功能描述:显示当前月份) 4)date +% ...

  8. c风格的字符串

    c风格的字符串的标注库 #include <cstring> 使用c 风格的字符串,牢记,其必须以null为结束标志 如 char ca[]={'c','+','='}; cout< ...

  9. appium+python自动化63-使用Uiautomator2报错问题解决

    前言 appium desktop V1.7.1版本使用命令行版本启动appium后,使用Uiautomator2定位toast信息报错:appium-uiautomator2-server-v0.3 ...

  10. ARTS-week2

    Algorithm 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本.所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".&q ...