[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 ...
随机推荐
- EditPlus直接连接Linux服务器编辑文本文件
填写好:描述,ip地址,用户名,密码, 然后点下面的高级选项: 然后返回上一个页面,继续 确定 OK: 然后,在主界面左侧点倒三角: 就可以选择我们之前配置的远程服务器地址,弹出提示框 点确定, 就连 ...
- git使用笔记(八)团队协作
By francis_hao Nov 24,2016 本文由 刘英皓 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可.欢迎转载,请注明出处 ...
- idea xml 绿背景色 去掉拼写检查
去掉背景色 去掉拼写检查
- [Python]简单的外星人入侵游戏
alien_invasion.py: import sys import pygame from setting import Settings from ship import Ship impor ...
- 关于javascript中的this 一段小实例深有体会啊
先声明鄙人正在努力的把脚抬进门来,说的都是比较粗浅的知识,但都是我实践中得出的体会,很深刻. 正在自学中挣扎的DOG. 先看段代码: function highlightRows() { if(!d ...
- Lucene4.6 把时间信息写入倒排索引的Offset偏移量中,并实现按时间位置查询
有个新的技术需求,需要对Lucene4.x的源码进行扩展,把如下的有时间位置的文本写入倒排索引,为此,我扩展了一个TimeTokenizer分词器,在这个分词器里将时间信息写入 偏移量Offset中. ...
- 【bzoj2219-数论之神】求解x^a==b(%n)-crt推论-原根-指标-BSGS
http://www.lydsy.com/JudgeOnline/problem.php?id=2219 弄了一个晚上加一个午休再加下午一个钟..终于ac..TAT 数论渣渣求轻虐!! 题意:求解 x ...
- 汕头市队赛 SRM 07 B 好玩的麻将
B 好玩的麻将 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂. KPM上周又打了n场麻将,又控了分使得自己的排名是1..n的一个排列. 但她 ...
- Ansible在节点间传输文件
1. 在控制节点(the control machine )与远程节点( the current remote host)之间传输文件 1.1 如果需要传输文件,可以使用copy模块,注意copy模块 ...
- (十二)进一步掌握STVD/COSMIC
如何分配变量到指定的地址 举例:unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00unsigned char temp_B@0x100; //定 ...