真是道挺好的题,做一道题学了挺多东西

从操作入手比较困难,所以对硬币进行讨论

考虑一个硬币$(A,B)$,假设$A\lt B$,那么我们可以把操作分成三类

第一类$T_j\lt A$,这种操作是没用的

第二类$A\leq T_j\lt B$,只要有这种操作,最后一次第二类操作后,这个硬币一定$B$面朝上

第三类$T_j\geq B$,这类操作强制把硬币翻面

所以对于每个硬币,只需要①找最后一个第二类操作,②统计之后第三类操作的奇偶性即可

①相当于是找最大的$j$满足$A\leq T_j\lt B$,设答案为$p$

②相当于是找$T_j\geq B$且$j\gt p$的数量

浓厚的树套树气息扑面而来...

所以建线段树套树状数组,外层操作时间内层$T_j$,注意内层要离散化,内层查询先二分找到下标再在树状数组上跑

最后是找哪些询问覆盖某个硬币$i$

把询问按左端点排序,用优先队列维护右端点即可,每次加入$l\leq i$的,删除$r\lt i$的

做这种全是区间操作,但是要以序列中的元素为观察点的题,这个方法再套上数据结构是挺好的

以前一直以为树状数组是不可以做内层树套树的(因为下标要访问到$n$)但是实际上加个离散化后,内层用树状数组完全没有问题

p.s.一开始写线段树套treap,T到爆炸,这个常数啊,excited!

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
struct quev{
	int r,id;
	quev(int a=0,int b=0){r=a;id=b;}
};
bool operator<(quev a,quev b){return a.r>b.r;}
priority_queue<quev>pq;
struct coin{
	int a,b;
}c[100010];
struct ask{
	int l,r,t,id;
}q[100010];
struct seg{
	int*c,*t,len;
	seg(){c=t=0;}
}t[400010];
int m;
bool cmp(ask a,ask b){return a.l<b.l;}
void build(int l,int r,int x){
	t[x].len=r-l+1;
	t[x].c=new int[t[x].len+2];
	t[x].t=new int[t[x].len+2];
	for(int i=l;i<=r;i++){
		t[x].c[i-l+1]=q[i].t;
		t[x].t[i-l+1]=0;
	}
	sort(t[x].c+1,t[x].c+t[x].len+1);
	if(l==r)return;
	int mid=(l+r)>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
}
int lowbit(int x){return x&-x;}
int getsum(int x,int p){
	if(p<t[x].c[1])return 0;
	p=upper_bound(t[x].c+1,t[x].c+t[x].len+1,p)-t[x].c-1;
	int s=0;
	while(p){
		s+=t[x].t[p];
		p-=lowbit(p);
	}
	return s;
}
void modify(int x,int p,int d){
	p=lower_bound(t[x].c+1,t[x].c+t[x].len+1,p)-t[x].c;
	while(p<=t[x].len){
		t[x].t[p]+=d;
		p+=lowbit(p);
	}
}
void tmodify(int p,int T,int d){
	int l=1,r=m,x=1,mid;
	while(1){
		modify(x,T,d);
		if(l==r)return;
		mid=(l+r)>>1;
		if(p<=mid){
			r=mid;
			x<<=1;
		}else{
			l=mid+1;
			x=x<<1|1;
		}
	}
}
int query1(int L,int R){
	int l=1,r=m,x=1,mid;
	while(l!=r){
		mid=(l+r)>>1;
		if(getsum(x<<1|1,R)-getsum(x<<1|1,L-1)!=0){
			l=mid+1;
			x=x<<1|1;
		}else{
			r=mid;
			x<<=1;
		}
	}
	return(getsum(x,R)-getsum(x,L-1)!=0)?l:0;
}
int query2(int p,int T){
	int l=1,r=m,x=1,res=0,mid;
	while(1){
		mid=(l+r)>>1;
		if(l==p)return res+getsum(x,1000000001)-getsum(x,T-1);
		if(p<=mid){
			res+=getsum(x<<1|1,1000000001)-getsum(x<<1|1,T-1);
			r=mid;
			x<<=1;
		}else{
			l=mid+1;
			x=x<<1|1;
		}
	}
}
int query(int x){
	int s=0,a=c[x].a,b=c[x].b,f=0;
	if(a>b)swap(a,b);
	if(a<b)s=query1(a,b-1);
	if(s!=0&&c[x].a<c[x].b)f=1;
	if(s<m)s++;
	if(query2(s,b)&1)f^=1;
	return f?c[x].b:c[x].a;
}
int main(){
	int n,i,nq;
	ll ans;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&c[i].a);
	for(i=1;i<=n;i++)scanf("%d",&c[i].b);
	scanf("%d",&m);
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].t);
		q[i].id=i;
	}
	build(1,m,1);
	sort(q+1,q+m+1,cmp);
	nq=1;
	ans=0;
	for(i=1;i<=n;i++){
		while(nq<=m&&q[nq].l<=i){
 			tmodify(q[nq].id,q[nq].t,1);
 			pq.push(quev(q[nq].r,nq));
			nq++;
		}
		while(!pq.empty()&&pq.top().r<i){
			tmodify(q[pq.top().id].id,q[pq.top().id].t,-1);
			pq.pop();
		}
		ans+=query(i);
	}
	printf("%lld\n",ans);
}

[xsy2369]取名字的更多相关文章

  1. Linux-c给线程取名字

    https://blog.csdn.net/jasonchen_gbd/article/details/51308638 #define wtm_set_thread_name(n) ({ \ ] = ...

  2. 【Python】海贼王取名字

    #-*- coding: UTF-8 -*- #coding==utf-8 #from selenium.webdriver.support.wait import WebDriverWait fro ...

  3. 再谈CAAnimation动画

    CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...

  4. ASP.NET Core 中间件详解及项目实战

    前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...

  5. 【月入41万】Mono For Android中使用百度地图SDK

    借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...

  6. Atitit 会话层和表示层的异同

    Atitit 会话层和表示层的异同 会话层 这一层也称为会晤层或对话层.在会话层及以上的更高层次中,数据传送的单位没有另外再取名字,一般都可称为报文. 会话层虽然不参与具体的数据传输,但它却对数据传输 ...

  7. JavaScript : 零基础打造自己的类库

    写作不易,转载请注明出处,谢谢. 文章类别:Javascript基础(面向初学者) 前言 在之前的章节中,我们已经不依赖jQuery,单纯地用JavaScript封装了很多方法,这个时候,你一定会想, ...

  8. NetBean 8 创建EJB

    一. 介绍 百度了一下关于在NetBean开发环境里创建EJB的教程,没有找到好的例子,2天的调试过程,写下来帮助后人. EJB (Enterprise Java Bean) 是一套高扩展性的开发企业 ...

  9. oracle(sql)基础篇系列(三)——数据维护语句、数据定义语句、伪列

      DML语句 insert 向表中插入新的记录   --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 insert into dept2 values(50,'DANAM ...

随机推荐

  1. spring中Constructor、@Autowired、@PostConstruct的顺序【转】

    其实从依赖注入的字面意思就可以知道,要将对象p注入到对象a,那么首先就必须得生成对象p与对象a,才能执行注入.所以,如果一个类A中有个成员变量p被@Autowired注解,那么@Autowired注入 ...

  2. getActionBar为null的解决以及ActionBar的Back键

    http://blog.csdn.net/lincyang/article/details/46286895

  3. C++开源库,欢迎补充。

    转载自:http://blog.csdn.net/kobejayandy/article/details/8681741 C++在"商业应用"方面,曾经是天下第一的开发语言,但这一 ...

  4. php文件上传错误代码

    注意: 1.上传文件的时候,在html里面的form表单一定要标注:enctype='multipart/form-data' 2.有种说法,要求一定要在form表单里面,在file前面加上隐藏域如: ...

  5. Ueditor 1.4.3 插入表格后无边框无颜色,不能正常显示

    在使用Ueditor 插入表格的功能时,发现插入时正常. 但保存到后台后再取出来,表格不能正常显示.查看保存的html代码,发现保存时并未给table 添加border属性.以致于再次取出来时,不能正 ...

  6. bzoj3786 星际探索 splay dfs序

    这道题 首先 因为他求的是当前点到根节点的路径和 我们可以将题目转换为括号序列的写法 将点拆为左括号以及右括号 左括号为正 右括号为负 这样题目就变为了求前缀和了 如果一个点是这个点的子树 那么他的左 ...

  7. kvm的vmcall

    这几个接口的区别在于参数个数的不用,本质是一样的.挑个参数最多的看下: static inline long kvm_hypercall4(unsigned int nr, unsigned long ...

  8. Mark : Bootstrap fileInput控制预览页面上传、删除、详情按钮

    Bootstrap fileInput默认预览上传效果: 而我们可能想要的结果是: 这时候可以通过初始参数layoutTemplates来控制:

  9. GIT指令简洁篇

    查看.添加.提交.删除.找回,重置修改文件 git help <command> # 显示command的help git show # 显示某次提交的内容 git show $id gi ...

  10. 关于因各种原因,造成LINUX主机不能通过域名访问自己的解决办法

    因路由黑洞或其它原因造成自己域名或外网IP的解决办法: vi /etc/hosts 添加一行: 10.28.86.250 www.edusoa.com 保存退出.