【NOI2007】项链工厂 ——老题新做.jpg
第一次是用 ODT 过的...(虽说跑得飞慢但它就是能过)
而且还写了发题解...
第二次是在考场上碰到了这道题,然后居然打了线段树,各种 bug 直接让代码爆零
但还是补好了代码重新交了一发,发现跑得还可以...
于是题解也再来一发,不过鉴于 luogu 审题解有点麻烦于是就 cnblogs 上写好了...
ODT 联动 请点赞谢谢...QWQ
关于线段树咱其实就是把原来的环破成链,然后维护这个序列,对于旋转和翻转操作打标记,然后其余四种操作都是线段树上询问和维护就能解决了
然后注意维护的方式就好了,一个是 rotate 要倒着维护以及根据 fl 决定旋转方向,并且对于跨过原端点的区间,我们分成两部分求救,最后合并一下输出就好了
最最关键的一点,询问整个环的时候原本是有个首位相连颜色是否相同的操作,但如果整个环都是一个颜色就需要特判否则会输出 0
当然还有线段树别打炸...
//by Judge
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define open(S) freopen(S".in","r",stdin),freopen(S".out","w",stdout)
#define ll long long
using namespace std;
const int M=5e5+3;
typedef int arr[M];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1,*p2;
inline int read(){ int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-48; return x*f;
} inline int pread(){ char c=getchar(); while(!isalpha(c)) c=getchar();
if(c!='C') return c=='F'?1:(c=='R'?2:(c=='S'?3:4)); c=getchar(); return c=='S'?5:6;
} char sr[1<<21],z[21]; int Z,C=-1;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
inline void print(int x,char chr='\n'){
if(C>1<<20) Ot(); if(x<0) x=-x,sr[++C]='-';
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z); sr[++C]=chr;
} int n,q,Ro,Fl; arr a;
namespace Seg_T{ int tag[M<<2];
struct Tr{ int num,L,R; }t[M<<2],ans,ze;
#define ls (k<<1)
#define rs (k<<1|1)
#define lson ls,l,mid
#define rson rs,mid+1,r
inline Tr merge(Tr x,Tr y){
if(!x.num) return y; if(!y.num) return x;
return (Tr){x.num+y.num-(x.R==y.L),x.L,y.R};
}
inline void pushdown(int k){ if(!tag[k]) return ;
t[ls]=t[rs]=(Tr){1,tag[k],tag[k]};
tag[ls]=tag[rs]=tag[k],tag[k]=0;
}
void build(int k,int l,int r){ int mid=(l+r)>>1;
if(l==r) return t[k]=(Tr){1,a[l],a[l]},void();
build(lson),build(rson),t[k]=merge(t[ls],t[rs]);
}
void update(int k,int l,int r,int L,int R,int c){ int mid=(l+r)>>1;
if(l>R||L>r) return ; if(L<=l&&r<=R) return t[k]=(Tr){1,c,c},tag[k]=c,void();
pushdown(k); update(lson,L,R,c),update(rson,L,R,c),t[k]=merge(t[ls],t[rs]);
}
Tr query(int k,int l,int r,int L,int R){ int mid=(l+r)>>1;
if(l>R||L>r) return ze; if(L<=l&&r<=R) return t[k];
pushdown(k); return merge(query(lson,L,R),query(rson,L,R));
}
void update_c(int k,int l,int r,int x,int c){ int mid=(l+r)>>1;
if(l==r) return t[k]=(Tr){1,c,c},void(); pushdown(k);
if(x<=mid) update_c(lson,x,c); else update_c(rson,x,c); t[k]=merge(t[ls],t[rs]);
}
int query_c(int k,int l,int r,int x){ int mid=(l+r)>>1;
if(l==r) return t[k].L; pushdown(k);
return x<=mid?query_c(lson,x):query_c(rson,x);
}
} using namespace Seg_T;
// 对于 R、F 操作,打标记处理。对于剩下的操作线段树上维护 (心情复杂)
int main(){ int op,x,y,z;
n=read(),z=read(),ze.num=0;
fp(i,1,n) a[i]=read();
build(1,1,n),q=read();
while(q--){ op=pread();
if(op==1) Fl^=1;
else if(op==2){ x=read();
if(Fl) Ro=(Ro+x)%n; else Ro=(Ro-x+n)%n;
} else if(op==3){ x=read(),y=read();
if(Fl) x=(n-x+1)%n+1,y=(n-y+1)%n+1;
x=(x+Ro-1)%n+1,y=(y+Ro-1)%n+1;
a[x]=query_c(1,1,n,x),a[y]=query_c(1,1,n,y);
update_c(1,1,n,x,a[y]),update_c(1,1,n,y,a[x]);
} else if(op==4){ x=read(),y=read(),z=read();
if(Fl) x=(n-x+1)%n+1,y=(n-y+1)%n+1;
x=(x+Ro-1)%n+1,y=(y+Ro-1)%n+1;
if(Fl) swap(x,y);
if(x>y) update(1,1,n,x,n,z),update(1,1,n,1,y,z);
else update(1,1,n,x,y,z);
} else if(op==5){ x=read(),y=read();
if(Fl) x=(n-x+1)%n+1,y=(n-y+1)%n+1;
x=(x+Ro-1)%n+1,y=(y+Ro-1)%n+1;
if(Fl) swap(x,y);
if(x>y) ans=merge(query(1,1,n,x,n),query(1,1,n,1,y));
else ans=query(1,1,n,x,y); print(max(ans.num,1));
} else print(max(t[1].num-(t[1].L==t[1].R),1));
} return Ot(),0;
}
【NOI2007】项链工厂 ——老题新做.jpg的更多相关文章
- Splay POJ3468(老题新做)
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d ...
- 数据结构(Splay平衡树): [NOI2007] 项链工厂
[NOI2007] 项链工厂 ★★★ 输入文件:necklace.in 输出文件:necklace.out 简单对比 时间限制:4 s 内存限制:512 MB [问题描述] T公司是一 ...
- BZOJ1493 [NOI2007]项链工厂
未完待续... 终于改对了 热泪盈眶.jpg 错误原因:pushdown的时候没有判断是否有左右儿子,也没当x=0 return,于是出现一些奇怪的错误 #include<bits/stdc++ ...
- bzoj 1493: [NOI2007]项链工厂(线段树)
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1256 Solved: 545[Submit][Status] ...
- bzoj1493[NOI2007]项链工厂 线段树
1493: [NOI2007]项链工厂 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 1712 Solved: 723[Submit][Status] ...
- BZOJ_1493_[NOI2007]项链工厂_Splay
BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...
- BZOJ1493 NOI2007 项链工厂 线段树模拟
提交地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1493 题目大意:给一个数列,进行一系列操作.包括旋转,翻转,改变等操作,以及查询颜色段数. ...
- 旧题新做:从idy的视角看数据结构
“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 sec ...
- 1493: [NOI2007]项链工厂
线段树. 真还就是个线段树.. 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2.(这点没想到).. 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k. 每次读入i和 ...
随机推荐
- chrome浏览器调试js,结果Sources里面找不到js文件解决办法
页面出现问题,就debug,这是前端开发工程师最常见的做法,但是有时候,我们打开开发者工具,在sources查找js文件,却发现怎么也找不到,无法设置断点.但是文件在network选项卡里确实 ...
- springboot(十)使用LogBack作为日志组件
简介: 企业级项目在搭建的时候,最不可或缺的一部分就是日志,日志可以用来调试程序,打印运行日志以及错误信息方便于我们后期对系统的维护,在SpringBoot兴起之前记录日志最出色的莫过于log4j了, ...
- PHP基础教程探讨一些php编程性能优化总结
兄弟连PHP培训 小编最近在做php程序的性能优化,一些经过测试后发现的东西就先记录下来,以备后用. 首先对于一些反应慢的操作或页面要跟踪处理一下,可以使用webGrind的方式看一下主要问题出在 ...
- 2019hdu多校 K-th Closest Distance
题目链接:Click here 大致题意:q次询问,每次询问你区间[L,R]中|p-ai|的值第k小的是多少 Solution: 直接找是很困难的,我们考虑二分答案,那么本题就十分简单了 我们对权值维 ...
- PID221 / 烦人的幻灯片☆ x
超详细解释!我都被我自己惊呆了! (这个题目意思我缓冲了很久!一定要读懂题!否则做不出来) 题目不懂就多读呀~ 提交你的代码 查看讨论和题解 题目描述 李教授于今天下午做一个非常重要的演讲.不幸的是他 ...
- 【BZOJ3811/UOJ36】 玛里苟斯
Description 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,…,an}. 等概率随机取 S 的一个子集 A={ai1,… ...
- ArrayList类源码浅析(一)
1.首先来看一下ArrayList类中的字段 可以看出,ArrayList维护了一个Object数组,默认容量是10,size记录数组的长度: 2.ArrayList提供了三个构造器:ArrayLis ...
- springCloud分布式事务实战(一)案例需求及实现步骤
本文不对分布式事务原理进行探索,而是通过一个案例来说明如何使用分布式事务 案例需求:创建2个基于springCloud的微服务,分别访问不同的数据库:然后创建一个整合服务,调用微服务实现数据的保存到2 ...
- nested exception is java.lang.OutOfMemoryError: PermGen space
原因: 持久带内存溢出. 方法:在启动的catalina.sh 里加上这个配置,增加持久带的大小. JAVA_OPTS="XX:PermSize=64M-XX:MaxPermSize=128 ...
- RTMP服务器的延迟,多级边缘不影响延迟,gop为最大因素
转自:http://blog.chinaunix.net/uid-26000296-id-4932826.html 编码器用FMLE,用手机秒表作为延迟计算. 结论: 1. 影响延迟的三个重要因素:网 ...