题目描述

LYK有 \(n\) 个小朋友排成一排。第 \(i\) 个小朋友的战斗力是 $ a_i $,且他们的战斗力互不相同。

战斗力高的会打败战斗力低的。

LYK想恶搞这些小朋友们,具体地,它有 \(k\) 次操作。

第i次操作会有两个参数 \(l_i\) 和 \(r_i\) ,表示如果两个小朋友A,B的战斗力均在 \([l_i,r_i]\) 这段区间中,它们的打架结果会相反。即如果一开始A能赢B,则现在变成B能赢A。当然它们的打架结果可能在后来的操作中又被反过来。

LYK想知道,m次操作后,存在多少三元组(a,b,c),其中a能赢b,b能赢c,c能赢a。注意这里(a,b,c),(b,c,a),(c,a,b)算同一种三元组。

输入

第一行两个数n,k。

第二行n个数表示 \(a_i\)。

接下来m行,每行两个数 \(l_i,r_i\)。

输出

一个数表示答案。

样例输入

3 2

1 2 3

1 2

2 3

样例输出

1

样例解释

进行过操作后,1能赢2,2能赢3,而3一开始就能赢1并且结果没被改变过,所以就存在1个符合条件的三元组。

数据范围

对于20%的数据 \(n,k \le 100\)

对于60%的数据 \(n,k \le 1000\)

对于另外10%的数据 $ k=0 $

对于100%的数据,$ 3 \le n \le 10^5,0 \le k \le 10^5,0 \le a_i,l_i,r_i \le 10^9,li \le ri $

呃.......这个题......你们先看一眼代码再决定要不要继续看吧 \(QwQ\)

这个题是标准的大毒瘤数据结构,在图上建线段树再从线段树上统计三元环

这就是一句话做法......

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <vector>
  6. #define pii std::pair<LL,LL>
  7. #define mp std::make_pair
  8. #define ls ( rt << 1 )
  9. #define rs ( rt << 1 | 1 )
  10. #define mid ( ( l + r ) >> 1 )
  11. #define pushup(rt) t[rt].data = t[ls].data + t[rs].data
  12. #define LL long long
  13. #define noip2018RpINF return 0
  14. using std::vector;
  15. const int N = 1e5 + 5;
  16. LL n,k,v[N],vic,ans,res,cnt = 1;
  17. vector<pii>change,other;
  18. struct tree{
  19. LL left,right;
  20. LL data,tag;
  21. LL lc,rc;
  22. }t[(N<<2)];
  23. inline LL read(){
  24. LL v = 0,c = 1;char ch = getchar();
  25. while(ch < '0' || ch > '9'){
  26. if(ch == '-') c = -1;
  27. ch = getchar();
  28. }
  29. while(ch >= '0' && ch <= '9'){
  30. v = v * 10 + ch - 48;
  31. ch = getchar();
  32. }
  33. return v * c;
  34. }
  35. inline void build(LL rt,LL l,LL r){
  36. t[rt].left = l ; t[rt].right = r ; t[rt].tag = 0 ;//建树过程中统计节点信息
  37. if( l == r ) return ;//到达叶子节点
  38. build( ls , l , mid ) ; build( rs , mid + 1 , r );//向左右两棵子树递归
  39. pushup( rt ) ; return ;//合并子树信息
  40. }
  41. inline void pushdown(LL rt){
  42. LL l = t[rt].left , r = t[rt].right ;
  43. if(t[rt].tag){
  44. t[ls].tag ^= 1;t[rs].tag ^= 1;//标记取反
  45. t[ls].data = mid - l + 1 - t[ls].data;//左区间取反
  46. t[rs].data = r - mid - t[rs].data;//右区间取反
  47. }
  48. t[rt].tag = 0;//标记回置
  49. return ;
  50. }
  51. inline void update(LL rt,LL ll,LL rr){
  52. LL l = t[rt].left , r = t[rt].right ;//取出左右端点
  53. if(ll <= l && r <= rr){//到达的节点属于被更新区间
  54. t[rt].data = r - l + 1 - t[rt].data;//区间取反
  55. t[rt].tag ^= 1 ; return ;//打标记
  56. }
  57. pushdown(rt);//下传标记
  58. if(ll <= mid) update(ls,ll,rr);
  59. if(rr > mid) update(rs,ll,rr);
  60. pushup(rt) ; return ;//左右递归及合并子树信息
  61. }
  62. inline void query(LL rt,LL ll,LL rr,LL val){
  63. LL l = t[rt].left , r = t[rt].right ;//取出左右端点
  64. if(ll <= l && r <= rr){
  65. if(val == 1ll) res += t[rt].data ;//如果查询1的个数直接累加统计
  66. else res += ( r - l + 1 - t[rt].data ) ;//否则用区间长度减去1的个数
  67. return ;
  68. }
  69. pushdown(rt);//下传标记
  70. if(ll <= mid) query(ls,ll,rr,val);
  71. if(rr > mid) query(rs,ll,rr,val);
  72. return ;//左右递归及合并子树信息
  73. }
  74. int main(){
  75. n = read() ; k = read() ;
  76. for(int i = 1 ; i <= n ; ++ i ) v[i] = read();
  77. std::sort(v + 1 , v + n + 1);
  78. for(int i = 1 ; i <= k ; ++ i ){
  79. LL l = read(),r = read();
  80. l = std::lower_bound(v + 1 , v + n + 1 ,l) - v ;
  81. r = std::upper_bound(v + 1 , v + n + 1 ,r) - v - 1;
  82. if( l > r ) continue;
  83. change.push_back( mp( l , r ) );
  84. other.push_back( mp( r , l ) );
  85. }
  86. build ( 1 , 1 , n ) ;
  87. std::sort(change.begin(),change.end());
  88. std::sort(other.begin(),other.end());
  89. ans = (LL) ( n * ( n - 1 ) * ( n - 2 ) ) / 6;
  90. for(int i = 1 , r = 0 , l = 0 ; i <= n ; ++ i ){
  91. while( l < change.size() && change[l].first == i ){update( 1 , change[l].first , change[l].second ) ; ++ l ;}
  92. vic = 0 ;
  93. if( i != 1 ) {res = 0 ; query( 1 , 1 , i - 1 ,0) ; vic += res;}
  94. if( i != n ) {res = 0 ; query( 1 , i + 1 , n ,1) ; vic += res;}
  95. ans -= ( ( vic * ( vic - 1 ) ) >> 1 ) ;
  96. while( r < other.size() && other[r].first == i){update( 1 , other[r].second , other[r].first ) ; ++ r ;}
  97. }
  98. printf("%lld\n",ans);
  99. noip2018RpINF;
  100. }

清北学堂 清北-Day3-R2-打架 (fight)的更多相关文章

  1. 清北学堂学习总结day3

    小学知识总结 上午篇 •积性函数的卷积公式 (1)(f * g)( n ) = ∑(d|n) f( d ) x g ( n / d ) (2)代码实现 LL f[N], g[N], h[N]; voi ...

  2. 清北学堂 清北-Day5-R2-xor

    有 $ n $ 个物品,每个物品有两个属性 $ a_i,b_i $ ,挑选出若干物品,使得这些物品 $ a_i $ 的异或和 $ x \le m \(.问在这一限制下,\) b_i $ 的总和最大可能 ...

  3. 清北学堂 清北-Day1-R1-Count

    题目描述 问有几个无序二元组 (x; y) 满足 xy ≡ 1 (mod P ); 0 ≤ x < P; 0 ≤ y <P.无序二元组是指,如果 P = 10, (3; 7) 和 (7; ...

  4. 清北学堂 清北-Day1-R2-监听monitor

    题目描述 [背景] 不阅读本题的[背景]并不影响通过本题. 三体信息中没有包含对三体⼈⽣物形态的任何描述,⼈类要在四百多年以后才能真正看到三体⼈.在阅读信息时,叶⽂洁只能把三体⼈想象成⼈类的形象. 1 ...

  5. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  6. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  7. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  8. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  9. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

随机推荐

  1. 本地测试使用Tomcat,生产环境使用GlassFish。

    总结:Tomcat8 = javaee7规范(servlet3.1 + jsp2.3 + el3.0 + websocket1.0) + java7 [配置初始化参数使用jdk8编译]conf/web ...

  2. mysql数据库允许远程连接

    1.验证初始是否允许远程连接 由于本次虚拟机IP为192.168.2.120,因此我们执行 mysql -h 192.168.20.120 -P 3306 -u root -proot(备注:-pro ...

  3. 【bzoj 3786】星系探索

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  4. PHP实现权限管理功能

    权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样. 首先先看下数据库 总共有5张表,users,roles和roleswork 3张表与另外2张表形 ...

  5. HttpClient 测试web API上传文件实例

    1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...

  6. Mysql清空表(truncate)与删除表中数据(delete)的区别

    来源:http://blog.is36.com/mysql_difference_of_truncate_and_delete/ 为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经 ...

  7. 玩转Google

    前言: 网上浏览信息,用百度搜索的时候,第一页都是广告,真是槽心到极点,果断放弃百度,现在用谷歌是真舒服,用起一句话用好谷歌.用好搜索引擎.你可以打开世界的大门! 加入特殊字符搜索: | 同时搜索关键 ...

  8. js常见的几种继承方式

    1.原型链继承 “父类”的实例作为子类的prototype SubType.prototype = new SuperType() 2.组合继承(原型链+构造函数) function SubType( ...

  9. 剑指Offer-表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...

  10. mysql 原理 ~ 线程与IO

    一 简介:今天来聊聊具体的线程和IO 二 具体线程与作用 1 master thread    mysql的主要工作触发线程 1 redo and binlog日志      2 合并插入缓冲.    ...