Title Description
Mo Mo has purchased a set of N color brushes (some of them may be the same color), which are arranged in a row. You need to answer Mo Mo's questions. Mo Mo will issue the following instructions to you:
1. The Q L R representative asks you how many different colors there are from the L brush to the R brush.
2. R P Col replaces the p-th brush with the color Col.
Do you know what you need to do to meet the requirements of ink?
I / O format
Input format:
The first line contains two integers, N and M, representing the number of initial brushes and the number of things that ink will do.
N integers in the second row represent the color of the i-th brush in the initial brush row.
From line 3 to line 2+M, each line represents one thing that ink will do. For the format, see the title stem.
Output format:
For each Query query, you need to give a number in the corresponding line, representing that there are several different colors of brushes from the L-th brush to the R-th brush.
Example of input and output
Input sample × 1:copy 6 5 1 2 3 4 5 5 Q 1 4 Q 2 6 R 1 2 Q 1 4 Q 2 6 Output samplecopy 4 4 3 4A more troublesome simulation problem:
Greedy principle:
If there is a gas station with a lower oil price within the scope of the current service station, maintain the current oil volume to exactly that smaller service station
If not, top up
//#include<bits/stdc++.h> #include<iostream> #include<cstring> #include<cstdio> #include<map> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define CLR(A,v) memset(A,v,sizeof A) #define inf 0x3f3f3f3f #define lson l,m,pos<<1 #define rson m+1,r,pos<<1|1 ////////////////////////////////////// const int N=3e6+5; struct node { double p,d; }s[N]; double D,C,money,D2,p1,nowoil; int nowpos,n; int main() { cin>>D>>C>>D2>>p1>>n; s[0].d=0;s[0].p=p1;s[n+1].d=D; rep(i,1,n) scanf("%lf%lf",&s[i].d,&s[i].p); double maxx=0; rep(i,1,n+1)maxx=max(maxx,s[i].d-s[i-1].d); if(C*D2<maxx) while(1) { int flag=-1; rep(i,nowpos+1,n) { if(s[i].d-s[nowpos].d>C*D2)break; if(s[nowpos].p>s[i].p) } if(flag!=-1){ double dis=s[flag].d-s[nowpos].d;double x=dis/D2-nowoil;if(x<0) money+=x*s[nowpos].p; nowoil=0;nowpos=flag;continue;} if(s[n+1].d-s[nowpos].d<=C*D2){ double dis=s[n+1].d-s[nowpos].d; double x=dis/D2-nowoil; money+=x*s[nowpos].p;break; }//If you can jump to the end double x=C-nowoil; money+=s[nowpos].p*x; nowoil=C-(s[nowpos+1].d-s[nowpos].d)/D2; nowpos++;//If the current position of the oil price is the smallest } printf("%.2lf",money); return 0; }