[jzoj 1214] [luogu 4130] [NOI2007]项链工厂 {线段树}

news/2024/11/2 2:22:46/

题目

https://www.luogu.org/problemnew/show/P4130


解题思路

S p l a y 不 会 \color{red}Splay不会 Splay,那就正经的打线段树。
这道题目的后4问,就是纯正的线段树。
对于前两问,其实只是改变了每一个端点的位置,但没有改变他们的顺序,所以我们可以记录下他们的翻转次数和旋转次数,查询时倒推回去就可以了。
细节很多。

比如打函数名的时候,注意 s w a p swap swap是常用库中的定义函数,尽量不要重复。


代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std; 
const int N=500010; 
int n,m,flag,Q,sum,b[N]; char ch[5]; 
struct node{int l,r,lv,rv,cn,la; 
}a[N*4];
inline int read(){int p=0; char c=getchar(); while (!isdigit(c)) c=getchar(); while (isdigit(c)) p=p*10+c-48,c=getchar(); return p; 
}
void up(int x){a[x].cn=a[x*2].cn+a[x*2+1].cn; if (a[x*2].rv==a[x*2+1].lv) a[x].cn--; a[x].lv=a[x*2].lv,a[x].rv=a[x*2+1].rv; 
}
void pushlazy(int x){if (a[x].la){a[x*2].lv=a[x*2].rv=a[x*2].la=a[x].la; a[x*2+1].lv=a[x*2+1].rv=a[x*2+1].la=a[x].la; a[x*2].cn=a[x*2+1].cn=1; a[x].la=0; }
}
void build(int x){if (a[x].l==a[x].r){a[x].lv=a[x].rv=b[a[x].l]; a[x].cn=1; return; }int mid=(a[x].l+a[x].r)>>1; a[x*2].l=a[x].l,a[x*2].r=mid;a[x*2+1].l=mid+1,a[x*2+1].r=a[x].r; build(x*2),build(x*2+1); up(x); 
}
int find(int x,int k){if (a[x].l==a[x].r) return a[x].lv; pushlazy(x); int mid=(a[x].l+a[x].r)>>1; if (k<=mid) find(x*2,k); else find(x*2+1,k); 
}
void change(int x,int k,int val){if (a[x].l==k&&a[x].r==k){a[x].lv=a[x].rv=val; a[x].cn=1; return; }pushlazy(x); int mid=(a[x].l+a[x].r)>>1; if (k<=mid) change(x*2,k,val); else change(x*2+1,k,val); up(x); 
}
void changes(int x,int l,int r,int val){if (a[x].l==l&&a[x].r==r) {a[x].lv=a[x].rv=a[x].la=val; a[x].cn=1; return; }if (a[x].l==a[x].r) return; pushlazy(x); int mid=(a[x].l+a[x].r)>>1; if (r<=mid) changes(x*2,l,r,val); else if (l>mid) changes(x*2+1,l,r,val); else changes(x*2,l,mid,val),changes(x*2+1,mid+1,r,val); up(x); 
}
void Swap(int x,int y){int qx=find(1,x),qy=find(1,y); change(1,y,qx),change(1,x,qy);
}
int ask(int x,int l,int r){if (a[x].l==l&&a[x].r==r) return a[x].cn; pushlazy(x); int mid=(a[x].l+a[x].r)>>1; if (r<=mid) return ask(x*2,l,r); if (l>mid) return ask(x*2+1,l,r); int ans=ask(x*2,l,mid)+ask(x*2+1,mid+1,r); if (a[x*2].rv==a[x*2+1].lv) ans--; return ans; 
}
int get(){int x=read();if (flag) x=n-x+2; return ((x-sum)%n+2*n-1)%n+1;
}
int main(){
//	freopen("testdata.in","r",stdin); n=read(),m=read(); rep(i,1,n) b[i]=read(); a[1].l=1,a[1].r=n; build(1); Q=read(); int x,y,k; while (Q--){scanf("%s",ch); if (ch[0]=='R') {k=read(); if (flag) sum-=k; else sum+=k; }if (ch[0]=='F') flag^=1; if (ch[0]=='S') {x=get(),y=get(); Swap(x,y); }if (ch[0]=='P') {x=get(),y=get(),k=read(); if (flag) swap(x,y); if (x<=y) changes(1,x,y,k); else changes(1,1,y,k),changes(1,x,n,k); }if (ch[0]=='C'&&ch[1]=='S'){x=get(),y=get(); if (flag) swap(x,y); if (x<=y) printf("%d\n",ask(1,x,y)); else {int ans=ask(1,1,y)+ask(1,x,n); if (a[1].lv==a[1].rv) ans--; printf("%d\n",ans); }}if (ch[0]=='C' && ch[1]!='S'){int ans=ask(1,1,n);if (a[1].lv==a[1].rv&&ans!=1) ans--;printf("%d\n",ans); }}
}

http://www.ppmy.cn/news/221953.html

相关文章

二分查找 ZOJ4130

ZOJ4130 题目链接在此&#xff01; 题目大意&#xff1a; 关灯问题。 总共n个灯&#xff0c;然后给状态&#xff0c;一次能关掉连续的m个灯。 关灯k次就能成功&#xff0c;问最少的m。 注意&#xff01;不是改变状态&#xff01;是关掉&#xff01;0不会重新变成1的。 题目…

zoj 4130(The 16th Zhejiang Provincial Collegiate Programming Contest D)(思维)

传送门&#xff1a; 题意&#xff1a; 你现在有nnn个点&#xff0c;对于第iii个点&#xff0c;可以到达第i−1i-1i−1、2∗i2*i2∗i、2∗(i1)2*(i1)2∗(i1)、⌊i2⌋\left \lfloor \frac{i}{2} \right \rfloor⌊2i​⌋号点。现在问你从111号点开始的哈密顿路径。 分析&#xff1…

ZOJ -4130 Turn It Off

题目描述&#xff1a; Its already 21:30 now, and its time for BaoBao to go to bed. To ensure his sleeping quality, BaoBao decides to turn all the lights in his bedroom off. There are n lights, numbered from 1 to n, arranged in a row in BaoBaos bedroom. Ea…

“同档位无对手”的荣耀90系列,有哪些厉害的能力?

5 月 29 日&#xff0c;荣耀90系列正式发布。该系列包括荣耀90 Pro与荣耀90两款机型。 这两款机型都有哪些厉害的能力&#xff1f; 一、赵明&#xff1a;荣耀90系列“同档位无对手” 发布会在天府之国的成都市举行&#xff0c;这个以时尚和美食著称的城市&#xff0c;近年来…

P4130或JZOJ 1214. 【NOI2007】项链工厂

D e s c r i p t i o n Description Description 写一种数据结构&#xff0c;支持区间染色&#xff0c;区间翻转&#xff0c;区间旋转&#xff0c;区间查询颜色&#xff0c;单点修改颜色 对 于 100 % 的 数 据 &#xff0c; N ≤ 500000 &#xff0c; Q ≤ 500000 &#xff0…

P4130,jzoj1214-[NOI2007]项链工厂【线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4130 题目大意 一个环形颜色珠子链&#xff0c;位置(注意不是上面的珠子)从最上顺时针下来位置依次标号 1 ∼ n 1\sim n 1∼n。 然后要求支持以下操作 R k : R\ k: R k:将所有珠子顺时针旋转 k k k个。 F : F: F:将所…

intel 从CPU上怎么看几代

比如现在的处理器&#xff0c;i系列&#xff0c;i3&#xff0c;i5&#xff0c;或i7&#xff0c;用i3举例&#xff0c;第一代是i3 1530&#xff0c;这里把1代省了&#xff0c;所以是i3 530。二代比如i3 2100&#xff0c;三代i3 3220&#xff0c;四代i3 4130&#xff0c;就是从i3…

图解LeetCode——114. 二叉树展开为链表

一、题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 二…