ssr网站怎么做,沧州网站建设设计,mianf网站,网页设计作业制作个人网站http://vjudge.net/problem/viewProblem.action?id51622 题目大意#xff1a; 给定一列n个数字#xff0c;最初赋予值1到n 两个操作#xff1a;1.将区间[l,r]内的数改为x#xff0c;则这区间中所有数的改变值进行求和#xff0c;即ansabs(a[l]-x)abs[a[l1]-x).....abs(a[… http://vjudge.net/problem/viewProblem.action?id51622 题目大意 给定一列n个数字最初赋予值1到n 两个操作1.将区间[l,r]内的数改为x则这区间中所有数的改变值进行求和即ansabs(a[l]-x)abs[a[l1]-x).....abs(a[r]-x)但不要求输出 2.需要将刚才要求得到的区间改变值输出出来 这里我们利用一个color[]数组相当于给这堆数进行染色当某个区间内的赋予的值相等时我们可以看做有一个相同的color[]val了这样我们可以直接对这个区间 利用乘法求改变值。 这样的话我们还需要一个数组del[]时刻记录每个量改变的差值 sum[]数组的话就是用来保存区间改变量的和 1 #include cstdio2 #include cstring3 using namespace std;4 #define N 1000055 #define LL long long6 #define L ls,x,mid7 #define R rs,mid1,y8 LL color[N2],sum[N2],del[N2];9 LL abs(LL a)
10 {
11 return a0?a:-a;
12 }
13 void push_up(int cur)
14 {
15 if(color[cur1]color[cur1|1]) color[cur]color[cur1];
16 else color[cur]0;
17 sum[cur]sum[cur1]sum[cur1|1];
18 }
19 void push_down(int cur,int x,int y)
20 {
21 int mid(xy)/2,lscur1,rscur1|1;
22 if(color[cur]){
23 color[ls]color[rs]color[cur];
24 del[ls]del[cur],del[rs]del[cur];
25 sum[ls](mid-x1)*del[cur];
26 sum[rs](y-mid)*del[cur];
27 del[cur]color[cur]0;
28 }
29 }
30 void build(int cur,int x,int y)
31 {
32 int mid(xy)/2,lscur1,rscur1|1;
33 if(xy){
34 color[cur]x;
35 sum[cur]0;
36 return;
37 }
38 color[cur]del[cur]0;
39 build(L);
40 build(R);
41 push_up(cur);
42 }
43 void update(int cur,int x,int y,int s,int t,int v)
44 {
45 int mid(xy)/2,lscur1,rscur1|1;
46 if(xsytcolor[cur]){
47 sum[cur]abs(color[cur]-v)*(y-x1);
48 //printf(%I64d\n,abs(color[cur]-v));
49 del[cur]abs(color[cur]-v);
50 color[cur]v;
51 return;
52 }
53 push_down(cur,x,y);
54 if(mids) update(L,s,t,v);
55 if(midt) update(R,s,t,v);
56 push_up(cur);
57 }
58 void query(int cur,int x,int y,int s,int t,LL ans)
59 {
60 int mid(xy)/2,lscur1,rscur1|1;
61 if(xsyt){
62 anssum[cur];
63 return;
64 }
65 push_down(cur,x,y);
66 if(mids) query(L,s,t,ans);
67 if(midt) query(R,s,t,ans);
68 }
69 int main()
70 {
71 int n,m,type,l,r,x;
72 scanf(%d%d,n,m);
73 build(1,1,n);
74 for(int i0;im;i)
75 {
76 scanf(%d,type);
77 if(type1){
78 scanf(%d%d%d,l,r,x);
79 update(1,1,n,l,r,x);
80 }else{
81 scanf(%d%d,l,r);
82 LL ans0;
83 query(1,1,n,l,r,ans);
84 printf(%I64d\n,ans);
85 }
86 }
87 return 0;
88 } 转载于:https://www.cnblogs.com/CSU3901130321/p/3898384.html