专栏文章

8-4作业/重写ren_gao_zu

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioio77x
此快照首次捕获于
2025/12/02 19:50
3 个月前
此快照最后确认于
2025/12/02 19:50
3 个月前
查看原文

作业

P10589 楼兰图腾

CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=5e5+5;
int c[N],n,m,s1,s2,a[N];
int lowbit(int x){
	return x & -x;
}
int get_sum(int x){
	int res=0;
	while(x){
		res+=c[x];
		x-=lowbit(x);
	}
	return res;
}
void modify(int x,int val){
	while(x<=n){
		c[x]+=val;
		x+=lowbit(x);
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		int l=get_sum(a[i]-1),r=i-1-l;
		s1+=l*(a[i]-1-l);
		s2+=r*(n-a[i]-r);
		modify(a[i],1);
	}
	cout<<s2<<" "<<s1;
	
	return 0;
}

P3372 【模板】线段树 1

CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=1e6+5;
int c1[N],c2[N],n,m,a[N];
int lowbit(int x){
	return x & -x;
}
int get_sum(int x,int c[]){
	int res=0;
	while(x){
		res+=c[x];
		x-=lowbit(x);
	}return res;
}
void modify(int x,int val,int c[]){
	while(x<=n){
		c[x]+=val;
		x+=lowbit(x);
	}
}
int d[N];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		d[i]=a[i]-a[i-1];
	}
	for(int i=1;i<=n;i++){
		modify(i,d[i],c1);
		modify(i,(i-1)*d[i],c2);
	}
	while(m--){
		int op,x,y,k;
		cin>>op>>x;
		if(op==1){
			cin>>y>>k;
			modify(x,k,c1);modify(y+1,-k,c1);
			modify(x,k*(x-1),c2);
			modify(y+1,-k*y,c2);
		}
		else{
			cin>>y;
			int ans=(x-1)*get_sum(x-1,c1)-get_sum(x-1,c2);
			int top=y*get_sum(y,c1)-get_sum(y,c2);
			cout<<top-ans<<endl;
		}
	}
	return 0;
}

重写

P1198 [JSOI2008] 最大数

CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=5e5+5;
int n,m,D,sum[N];
int lowbit(int x){
	return x&-x;
}
void modify(int x,int k){
	while(x>=1){
		sum[x]=max(sum[x],k);
		x-=lowbit(x);
	}
	return;
}
int get_sum(int x)
{
	int res=-1e9;
	while(x<=n){
		res=max(res,sum[x]);
		x+=lowbit(x);
	}
	return res;
}
int pre;
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>m>>D;
	while(m--){
		char op;
		int x;
		cin>>op>>x;
		if(op=='A'){
			n++;
			x+=pre;
			modify(n,x%D);
		}
		else if(op=='Q'){
			int len=n-x+1;
			pre=get_sum(len);
			cout<<pre<<endl;
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...