A.首先判断c==0?true的话判断a==b。否的话判断(b-a)与c是否同号,能否整除。
/*ID: onlyazh1LANG: C++TASK: test*/#includeusing namespace std;typedef long long ll;const int maxn=1e6+7;int main(){ ll a,b,c; cin>>a>>b>>c; if(c==0) cout<<(a==b?"YES":"NO")< =0) cout<<"YES"<
B.设mx为a+b,a+c,b+d,c+d中的最大值。mi为a+b,a+c,b+d,c+d中的最小值。则答案就是n*max(0,(n+mi-mx))。注意n+mi-mx可能为负。
/*ID: onlyazh1LANG: C++TASK: test*/#includeusing namespace std;typedef long long ll;const int maxn=1e6+7;int main(){ ll n,a,b,c,d; cin>>n>>a>>b>>c>>d; ll mi=min(a+b,a+c); mi=min(mi,min(b+d,c+d)); ll mx=max(a+b,a+c); mx=max(mx,max(b+d,c+d)); cout<
C.看了题解才会的。假设一个长度为l,连续和为0的段。那么我们的操作应该是l-1次。假设我们把现在的序列分成了k个连续和为0的段。那么我们的操作应该是n-k次。那么我们应该让k最大。那么前缀和中出现的最大次数就是我们的k。
/*ID: onlyazh1LANG: C++TASK: test*/#includeusing namespace std;typedef long long ll;const int maxn=1e6+7;int cnt[100100];int main(){ //ifstream cin("in.txt"); int n; cin >> n; map d; long long sum = 0; int ans = n - 1; for (int i = 0; i < n; i++) { int t; cin >> t; sum += t; d[sum]++; ans = min(ans, n - d[sum]); } cout << ans << endl; return 0;}
D.用一个set记录到第i个数字为止,已经插入了的数字。那么第i个数字必然插在set中与他相邻的两个数字的某一个下面。容易发现,新的数字应该插在深度较深的数字下面。证明暂时不会。
/*ID: onlyazh1LANG: C++TASK: test*/#includeusing namespace std;typedef long long ll;const int maxn=1e6+7;set S;map M;int val[maxn];int ans[maxn];int dep[maxn];int main(){ int n,t,idx; set ::iterator pre,nex,tmp; cin>>n; for(int i=0;i >t;M[t]=i;val[i]=t; if(i){ nex=S.lower_bound(t); if(nex==S.begin()) ans[i]=M[*nex]; else{ tmp=nex;pre=(--nex);nex=tmp; ans[i]= dep[M[*pre]]>dep[M[*nex]]?M[*pre]:M[*nex]; } } S.insert(t); dep[i]=dep[ans[i]]+1; } for(int i=1;i
E.
/*ID: onlyazh1LANG: C++TASK: test*/#includeusing namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long ll;const int maxn=1e6+7;pair mx[maxn<<2];int to[maxn];ll sum[maxn];int n;void PushUP(int rt){ if(mx[rt<<1].first>=mx[rt<<1|1].first) mx[rt]=mx[rt<<1]; else mx[rt]=mx[rt<<1|1];}void update(int p,int x,int l,int r,int rt){ if(l==r){ mx[rt].first=x; mx[rt].second=l; return ; } int m=(l+r)/2; if(p<=m) update(p,x,lson); else update(p,x,rson); PushUP(rt);}pair query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ return mx[rt]; } int m=(l+r)/2; pair ret1,ret2; ret1.first=ret2.first=-1; if(L<=m) ret1=query(L,R,lson); if(R>m) ret2=query(L,R,rson); return ret1.first>=ret2.first?ret1:ret2;}ll add(int x){ if(x==n) return sum[x]=0; pair px=query(x,to[x],1,n,1); if(px.second==x) return sum[x]=(n-x)+(sum[px.first]==-1?add(px.first):sum[px.first]); else return sum[x]=(n-x+px.second-to[x])+(sum[px.second]==-1?add(px.second):sum[px.second]);}int main(){ //ifstream cin("in.txt"); memset(sum,-1,sizeof(sum)); cin>>n; for(int i=1;i >to[i]; update(i,to[i],1,n,1); }// pair px=query(1,to[1]-1,1,n,1);// cout< <<" "< <