1275. 最大数
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e6+10;
ll a[N];
int m,p;
struct segmentTree{
#define lson (node<<1)
#define rson (node<<1|1)
ll sum[N<<2],lazy[N<<2];
ll big[N<<2];
void spread(int node,int l,int r){//下放
int mid=(r+l)>>1;
if(lazy[node]!=0){
sum[lson]+=1ll*lazy[node]*(mid-l+1);
sum[rson]+=1ll*lazy[node]*(r-(mid+1)+1);
lazy[lson]+=lazy[node];
lazy[rson]+=lazy[node];
lazy[node]=0;
}
}
void pushup(int node){//回溯
sum[node]=sum[lson]+sum[rson];
big[node]=max(big[lson],big[rson]);
}
void build(int node,int l,int r){//创建树
lazy[node]=0;
if(l==r){
sum[node]=a[l];
big[node]=a[l];
return;
}
int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(node);
}
void change(int node,int l,int r,int idx,int x){//单点修改
if(l==r){
sum[node]+=x;
big[node]+=x;
return;
}
spread(node,l,r);
int mid=(l+r)>>1;
if(idx<=mid){
change(lson,l,mid,idx,x);
}else{
change(rson,mid+1,r,idx,x);
}
pushup(node);
}
void change(int node,int l,int r,int L,int R,int x){//区间修改
if(l==L&&r==R){
sum[node]+=1ll*x*(r-l+1);
lazy[node]+=x;
return ;
}
spread(node,l,r);
int mid=(l+r)>>1;
if(R<=mid){
change(lson,l,mid,L,R,x);
}else if(L>mid){
change(rson,mid+1,r,L,R,x);
}else{
change(lson,l,mid,L,mid,x);
change(rson,mid+1,r,mid+1,R,x);
}
pushup(node);
}
ll query(int node,int l,int r,int L,int R){
if(l==L&&r==R){
return big[node];
}
//spread(node,l,r);
int mid=(l+r)>>1;
if(R<=mid)
return query(lson,l,mid,L,R);
else if(L>mid)
return query(rson,mid+1,r,L,R);
else{
ll ans=0;
ans=query(lson,l,mid,L,mid);
ans=max(ans,query(rson,mid+1,r,mid+1,R));
return ans;
}
}
ll query(int node,int l,int r,int idx){//单点查询
if(l==r){
return sum[node];
}
spread(node,l,r);
int mid=r+l>>1;
if(idx<=mid){
return query(lson,l,mid,idx);
}else{
return query(rson,mid+1,r,idx);
}
}
}tree;
int main(){
// 如果该行的内容是 Q L,则表示这个操作是询问序列中最后 L 个数的最大数是多少;
// 如果是 A t,则表示向序列后面加一个数,加入的数是 (t+a) mod p。其中,t 是输入的参数,a 是在这个添加操作之前最后一个询问操作的答案(如果之前没有询问操作,则 a=0)。
// 第一个操作一定是添加操作。对于询
int n=0;
cin>>m>>p;
string c;
int x;
tree.build(1,1,m);
int last=0;
for(int i=1;i<=m;i++){
cin>>c>>x;
if(c=="Q"){
last=tree.query(1,1,m,n-x+1,n);
cout<<last<<endl;
}else{
tree.change(1,1,m,n+1,(last+x)%p);
n++;
}
}
}
245. 你能回答这些问题吗
1.题意:
2.题解:
改模板了呜呜呜人傻了
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
typedef long long ll;
ll a[N];
struct Node{
int l,r;
ll lsum,rsum,tsum,sum;
}tr[N<<2];
void pushup(Node &u,Node &l,Node &r){
u.sum=l.sum+r.sum;
u.lsum=max(l.sum+r.lsum,l.lsum);
u.rsum=max(r.rsum,r.sum+l.rsum);
u.tsum=max(max(l.tsum,r.tsum),l.rsum+r.lsum);
}
void pushup(int u){
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r){
if(l==r){
tr[u]={l,r,a[l],a[l],a[l],a[l]};
return;
}
tr[u].l=l;tr[u].r=r;
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void change(int u,int x,int v){
if(tr[u].l==x&&tr[u].r==x){
tr[u]={x,x,v,v,v,v};
}else{
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid){
change(u<<1,x,v);
}else{
change(u<<1|1,x,v);
}
pushup(u);
}
}
Node query(int u,int l,int r){
if(l<=tr[u].l&&tr[u].r<=r){
return tr[u];
}
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid){
return query(u<<1,l,r);
}else if(l>mid){
return query(u<<1|1,l,r);
}else{
Node node;
auto left=query(u<<1,l,r);
auto right=query(u<<1|1,l,r);
pushup(node,left,right);
return node;
}
}
int main(){
int n,m;
cin>>n>>m;
int op,x,y;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>op>>x>>y;
int a,b;
a=min(x,y);
b=max(x,y);
if(op==1){
Node res=query(1,a,b);
cout<<res.tsum<<endl;
}else{
change(1,x,y);
}
}
}
AcWing 246. 区间最大公约数
1.题意:
2.题解:
debug 搞了一天。。。。。。!!!!!
写了这么久,球球审核让我过把,都是线段树代码,大差不差啊!
3.ac代码:
#include<bits/stdc++.h>
#include<math.h>
#include<string>
using namespace std;
const int N=5e5+10;
typedef long long ll;
ll a[N];
struct Node{
int l,r;
ll sum,d;
}tr[N<<2];
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
void pushup(Node &u,Node &l,Node &r){
u.d=gcd(l.d,r.d);
u.sum=l.sum+r.sum;
}
void pushup(int u){
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}
void build(int u,int l,int r){
if(l==r){
tr[u]={l,r,a[l]-a[l-1],a[l]-a[l-1]};
return ;
}
// printf("%d,%d,%d\n",u,l,r);
int mid=l+r>>1;
tr[u].l=l;tr[u].r=r;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void change(int u,int idx,ll x){
if(tr[u].l==idx&&tr[u].r==idx){
tr[u].sum+=x;
tr[u].d=tr[u].sum;
}else{
int mid=tr[u].l+tr[u].r>>1;
if(idx<=mid) change(u<<1,idx,x);
else change(u<<1|1,idx,x);
pushup(u);
}
}
Node query(int u,int l,int r){
if(l>r) return {0};
//printf("%d %d %d\n",u,l,r);
if(l<=tr[u].l&&tr[u].r<=r){
return tr[u];
}
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid) return query(u<<1,l,r);
else if(l>mid) return query(u<<1|1,l,r);
else{
auto left=query(u<<1,l,r);
auto right=query(u<<1|1,l,r);
Node node;
pushup(node,left,right);
return node;
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
string s;
int l,r;
ll d;
for(int i=1;i<=m;i++){
cin>>s>>l>>r;
if(s=="C"){
cin>>d;
change(1,l,d);
if(r+1<=n)
change(1,r+1,-d);
}else{
auto left=query(1,1,l);
auto right=query(1,l+1,r);
//cout<<left.sum<<" "<<right.d<<endl;
cout<<abs(gcd(left.sum,right.d))<<endl;
}
}
}