[xsy2369]取名字

真是道挺好的题,做一道题学了挺多东西
从操作入手比较困难,所以对硬币进行讨论
考虑一个硬币$(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]取名字的更多相关文章
- Linux-c给线程取名字
https://blog.csdn.net/jasonchen_gbd/article/details/51308638 #define wtm_set_thread_name(n) ({ \ ] = ...
- 【Python】海贼王取名字
#-*- coding: UTF-8 -*- #coding==utf-8 #from selenium.webdriver.support.wait import WebDriverWait fro ...
- 再谈CAAnimation动画
CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...
- ASP.NET Core 中间件详解及项目实战
前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...
- 【月入41万】Mono For Android中使用百度地图SDK
借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...
- Atitit 会话层和表示层的异同
Atitit 会话层和表示层的异同 会话层 这一层也称为会晤层或对话层.在会话层及以上的更高层次中,数据传送的单位没有另外再取名字,一般都可称为报文. 会话层虽然不参与具体的数据传输,但它却对数据传输 ...
- JavaScript : 零基础打造自己的类库
写作不易,转载请注明出处,谢谢. 文章类别:Javascript基础(面向初学者) 前言 在之前的章节中,我们已经不依赖jQuery,单纯地用JavaScript封装了很多方法,这个时候,你一定会想, ...
- NetBean 8 创建EJB
一. 介绍 百度了一下关于在NetBean开发环境里创建EJB的教程,没有找到好的例子,2天的调试过程,写下来帮助后人. EJB (Enterprise Java Bean) 是一套高扩展性的开发企业 ...
- oracle(sql)基础篇系列(三)——数据维护语句、数据定义语句、伪列
DML语句 insert 向表中插入新的记录 --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 insert into dept2 values(50,'DANAM ...
随机推荐
- hdu Shell Necklace 5730 分治FFT
Description Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell neckl ...
- jwplayer 部署方案1
<body> <div id="my_player" data_src="http://xx.com/jwplayer/uploads/test.mp4 ...
- 在Maven中怎么配置外部Jar
转摘自:http://liugang594.iteye.com/blog/1677712 假设我们有一个Maven的project,其中有些Jar包不是来自Maven库的,是存在本地的某些Jar文件, ...
- webpack 的第三方库分离并持久化缓存
我们常常需要在浏览器缓存一些稳定的资源,如第三方库等.要达到这个目标,只需要两步: 1.提取出“稳定的资源”: 2.提供稳定的文件hash . 处理后的出的文件就像这样子: app.1w3ad4q4. ...
- Spring任务调度<task:scheduled-tasks>【含cron参数详解】 (转载)
Spring内部有一个task是Spring自带的一个设定时间自动任务调度 task使用的时候很方便,但是他能做的东西不如quartz那么的多! 可以使用注解和配置两种方式,配置的方式如下 引入Spr ...
- 打砖块(codevs 1257)
题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[ ...
- loj6043 「雅礼集训 2017 Day7」蛐蛐国的修墙方案
传送门:https://loj.ac/problem/6043 [题解] 我们考虑这是个置换,所以一定形成了很多不相交的环. 对于每个环,我们只能选一段.不选.选一段.不选这样交替下去. 显然只有偶环 ...
- php session 阻塞 过期不自动清除session文件
php默认session session_start后,php就会打开session文件,然后同一时间用户再用那个session_id访问,就会被前面那个请求阻塞直到前面一个访问结束才会释放文件在使 ...
- DotNet 学习笔记 MVC模型
Model Binding Below is a list of model binding attributes: •[BindRequired]: This attribute adds a mo ...
- 第一个java的小东西
第一次自己写的一个java的小东西,毕竟自己第一次写的,其中可谓是历经艰难,最后总结下来就是java实在是不适合写界面化的东西代码量比较大,这还不是最关键的,最关键的是控件的位置实在是太难控制了. 这 ...