式の整理
方針は直感的にわかりやすいが、条件整理が難しい
おはじきを使うと考えやすかった
- #include<iostream>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #define lol(i,n) for(int i=0;i<n;i++)
- #define mod 1000000007
- typedef long long ll;
- using namespace std;
- ll u[100010];
- ll v[100010];
- int d[100010];
- int main(){
- int n,m;
- cin>>n>>m;
- lol(i,m)u[i]=v[i]=0;
- lol(i,n)cin>>d[i];
- ll sum=0;
- int within=0;
- lol(i,n-1){
- int a=d[i]-1,b=d[i+1]-1;
- u[a+1]++;
- u[b]--;
- int tmp=(b-a+m)%m;
- v[b]+=tmp-1;
- sum+=min(tmp,b+1);
- if(b<a)within++;
- }
- ll ans=sum;
- lol(x,m){
- ans=min(ans,sum);
- within+=u[x];
- sum+=v[x]-within;
- }
- cout<<ans<<endl;
- return 0;
- }
難しい問題はこれ(式を正しくする力)がベースになければいけないと思うので、鍛える