
C1099 [Contest #8] 菜菜种菜 (树状数组+二维偏序)(好题)
思路:首先转换以下问题,我们可以设置两个数组L【i】和R【i】,L【i】表示比i的左边所能到达的最近的数,R【i】表示比i的右边所能到达的最近的数,于是问题就转化为了,对于一个查询【l,r】如果i存在贡献的话,i一定满足l<=i<=r并且L【i】<l&&R【i】>r,这个就是典型的偏序问题了。我们还是先固定一遍,我们把查询按右端点固定,然后存一个优先队列表示当前查询下合法的i的集合。 对于当前的查询【li,ri】来说,我们先把i小于等于ri点的先全部存队列,我们假设这些点全部都能产生贡献,然后再查看队列里那些元素不符合条件,把不符合的全部pop同时把他们之前update给还原。
发布日期:2021-05-08 15:18:55
浏览次数:25
分类:精选文章
本文共 1237 字,大约阅读时间需要 4 分钟。


#include#define ll long longusing namespace std;const int maxn=1e6+100;#define pi pair ll c[maxn],a[maxn],l[maxn],r[maxn],ans=0;struct cxk{ int l,r,id;}s[maxn];int lowbit(int x) { return x&-x;}bool cmp(const cxk &a,const cxk &b){ return a.r 0) res+=c[x],x-=lowbit(x); return res;}int main(){ int n,m,q,u,v; scanf("%d %d %d",&n,&m,&q); for(int i=1;i<=n;++i) scanf("%lld",&a[i]),l[i]=0,r[i]=1e9; for(int i=1;i<=m;++i) { scanf("%d %d",&u,&v); if(v , greater >qq; for(int i=1;i<=q;++i) { while(now+1<=s[i].r)//先假设全部合法 { qq.push({ r[now+1],now+1}); update(now+1,a[now+1]); update(l[now+1],-a[now+1]); now++; } while(!qq.empty()&&qq.top().first<=now)//把队列里不合法的剔除掉,然后把他们之前的更新给还原 { pi x=qq.top(); qq.pop(); update(x.second,-a[x.second]); update(l[x.second],a[x.second]); } ans^=s[i].id*(query(s[i].r)-query(s[i].l-1)); } printf("%lld\n",ans);}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月20日 07时41分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MySQL的操作
2019-03-12
算术运算符
2019-03-12
MySQL学习之《查询数据》
2019-03-12
如何提高SQL查询的效率?
2019-03-12
Docker入门之-镜像(二)
2019-03-12
设置canvas图作为背景图?亲测有效
2019-03-12
搭建Docker本地 Registry
2019-03-12
数据结构——链表(3)
2019-03-12
32位机器与64位机器在编程方面的差别
2019-03-12
socket模块和粘包现象
2019-03-12
Python学习--模块
2019-03-12
分享拉线位移传感器有哪些实质性的特点
2019-03-12
去了解拉绳位移编码器的影响因素
2019-03-12
影响拉线位移传感器精度的原因有哪些?
2019-03-12
无法初始化Winsock2.2处理
2019-03-12
Horizon Cloud之UAG访问异常
2019-03-12
vm无法打开电源
2019-03-12
vMotion 操作失败进度卡在14% ,报错: Operation Timed out
2019-03-12
vCenter日志相关
2019-03-12
重置UAG Application admin密码
2019-03-12