清北学堂 清北-Day3-R2-打架 (fight)
题目描述
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\)
这个题是标准的大毒瘤数据结构,在图上建线段树再从线段树上统计三元环
这就是一句话做法......
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define pii std::pair<LL,LL>
#define mp std::make_pair
#define ls ( rt << 1 )
#define rs ( rt << 1 | 1 )
#define mid ( ( l + r ) >> 1 )
#define pushup(rt) t[rt].data = t[ls].data + t[rs].data
#define LL long long
#define noip2018RpINF return 0
using std::vector;
const int N = 1e5 + 5;
LL n,k,v[N],vic,ans,res,cnt = 1;
vector<pii>change,other;
struct tree{
LL left,right;
LL data,tag;
LL lc,rc;
}t[(N<<2)];
inline LL read(){
LL v = 0,c = 1;char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-') c = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
v = v * 10 + ch - 48;
ch = getchar();
}
return v * c;
}
inline void build(LL rt,LL l,LL r){
t[rt].left = l ; t[rt].right = r ; t[rt].tag = 0 ;//建树过程中统计节点信息
if( l == r ) return ;//到达叶子节点
build( ls , l , mid ) ; build( rs , mid + 1 , r );//向左右两棵子树递归
pushup( rt ) ; return ;//合并子树信息
}
inline void pushdown(LL rt){
LL l = t[rt].left , r = t[rt].right ;
if(t[rt].tag){
t[ls].tag ^= 1;t[rs].tag ^= 1;//标记取反
t[ls].data = mid - l + 1 - t[ls].data;//左区间取反
t[rs].data = r - mid - t[rs].data;//右区间取反
}
t[rt].tag = 0;//标记回置
return ;
}
inline void update(LL rt,LL ll,LL rr){
LL l = t[rt].left , r = t[rt].right ;//取出左右端点
if(ll <= l && r <= rr){//到达的节点属于被更新区间
t[rt].data = r - l + 1 - t[rt].data;//区间取反
t[rt].tag ^= 1 ; return ;//打标记
}
pushdown(rt);//下传标记
if(ll <= mid) update(ls,ll,rr);
if(rr > mid) update(rs,ll,rr);
pushup(rt) ; return ;//左右递归及合并子树信息
}
inline void query(LL rt,LL ll,LL rr,LL val){
LL l = t[rt].left , r = t[rt].right ;//取出左右端点
if(ll <= l && r <= rr){
if(val == 1ll) res += t[rt].data ;//如果查询1的个数直接累加统计
else res += ( r - l + 1 - t[rt].data ) ;//否则用区间长度减去1的个数
return ;
}
pushdown(rt);//下传标记
if(ll <= mid) query(ls,ll,rr,val);
if(rr > mid) query(rs,ll,rr,val);
return ;//左右递归及合并子树信息
}
int main(){
n = read() ; k = read() ;
for(int i = 1 ; i <= n ; ++ i ) v[i] = read();
std::sort(v + 1 , v + n + 1);
for(int i = 1 ; i <= k ; ++ i ){
LL l = read(),r = read();
l = std::lower_bound(v + 1 , v + n + 1 ,l) - v ;
r = std::upper_bound(v + 1 , v + n + 1 ,r) - v - 1;
if( l > r ) continue;
change.push_back( mp( l , r ) );
other.push_back( mp( r , l ) );
}
build ( 1 , 1 , n ) ;
std::sort(change.begin(),change.end());
std::sort(other.begin(),other.end());
ans = (LL) ( n * ( n - 1 ) * ( n - 2 ) ) / 6;
for(int i = 1 , r = 0 , l = 0 ; i <= n ; ++ i ){
while( l < change.size() && change[l].first == i ){update( 1 , change[l].first , change[l].second ) ; ++ l ;}
vic = 0 ;
if( i != 1 ) {res = 0 ; query( 1 , 1 , i - 1 ,0) ; vic += res;}
if( i != n ) {res = 0 ; query( 1 , i + 1 , n ,1) ; vic += res;}
ans -= ( ( vic * ( vic - 1 ) ) >> 1 ) ;
while( r < other.size() && other[r].first == i){update( 1 , other[r].second , other[r].first ) ; ++ r ;}
}
printf("%lld\n",ans);
noip2018RpINF;
}
清北学堂 清北-Day3-R2-打架 (fight)的更多相关文章
- 清北学堂学习总结day3
小学知识总结 上午篇 •积性函数的卷积公式 (1)(f * g)( n ) = ∑(d|n) f( d ) x g ( n / d ) (2)代码实现 LL f[N], g[N], h[N]; voi ...
- 清北学堂 清北-Day5-R2-xor
有 $ n $ 个物品,每个物品有两个属性 $ a_i,b_i $ ,挑选出若干物品,使得这些物品 $ a_i $ 的异或和 $ x \le m \(.问在这一限制下,\) b_i $ 的总和最大可能 ...
- 清北学堂 清北-Day1-R1-Count
题目描述 问有几个无序二元组 (x; y) 满足 xy ≡ 1 (mod P ); 0 ≤ x < P; 0 ≤ y <P.无序二元组是指,如果 P = 10, (3; 7) 和 (7; ...
- 清北学堂 清北-Day1-R2-监听monitor
题目描述 [背景] 不阅读本题的[背景]并不影响通过本题. 三体信息中没有包含对三体⼈⽣物形态的任何描述,⼈类要在四百多年以后才能真正看到三体⼈.在阅读信息时,叶⽂洁只能把三体⼈想象成⼈类的形象. 1 ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 济南清北学堂游记 Day 1.
快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
随机推荐
- 关于"Linux下使用Windows应用程序的尝试"总结
首推 Flatpak .Flatpak爽啊,命令行启动能不爽吗!? 其他的: 0. AppImage:AppImage试了下,唉,启动TIM时就没反应,其他的应用没试过 1. crossover:收费 ...
- cpp #,##
#define语句中的#是把参数字符串化,##是连接两个参数成为一个整体. #define FACTORY_REF(name) { #name, Make##name } 中#name就是将传入的na ...
- luogu P3242 [HNOI2015]接水果
传送门 其实这题难点在于处理路径包含关系 先求出树的dfn序,现在假设路径\(xy\)包含\(uv(dfn_x<dfn_y,dfn_u<dfn_v)\) 如果\(lca(u,v)!=u\) ...
- day 5 - 2 字典(dict)练习
1. 有如下变量(tu 是个元祖),请实现要求的功能 tu = ("alex",[11,22,{"k1":'v1',"k2":[" ...
- BigDecimal实现末尾去掉无用0
BigDecimal 原生提供了 stripTrailingZeros 方法可以实现去掉末尾的 0,然后使用 toPlainString 可以输出数值,注意这里如果使用 toString() 会变成 ...
- 【mmall】mybatis三剑客
mybatis-generator mybatis-plugin Mybatis Plugin插件安装破解及使用:http://blog.csdn.net/u011410529/article/det ...
- eureka ... is an unknown property 在 application.properties 中
问题如图 在application.properties中无法识别eureka 解决方式 (想了想这个好像是在某个依赖里面来的)发现 eureka 是在 某个依赖里面 所以添加了以下之后就解决了 ...
- CSS-联合选择器
深层布局,逐级进去,指向某一个标签,叫:关联选择器 - 设置嵌套标签的样式 div p {} day02 昨天内容回顾 1.html的操作思想 ** 使用标签把要操作的数据包起来,通过修改标签的属性值 ...
- telnet能通但是ping不通
以前本人以为Telnet通 ping一定也是通的, telnet能通,表示两台计算机之间建立了连接通道.理论上是能ping通的.如果不能ping通,可能的原因是对方主机关闭了ping回显,或者是对方的 ...
- IMAGENT CLASSIFICATION WITH DEEP CONVOLUTIONAL NEURAL NETWORKS(翻译)
0 - 摘要 我们训练了一个大型的.深度卷积神经网络用来将ImageNet LSVRC-2010竞赛中的120万高分辨率的图像分为1000个不同的类别.在测试集上,我们在top-1和top-5上的错 ...