#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
#define M 100005
int n;
int a[M];
int main()
{
int i;
scanf("%d",&n);
int minv=0x7fffffff;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
minv=min(a[i],minv);
}
int ans=0x7fffffff;
int it=-1;
for(i=1;i<=n;i++)
{
if(a[i]==minv)
{
it=i;
break;
}
}
for(i=it+1;i<=n;i++)
{
if(a[i]==minv)
{
ans=min(i-it,ans);
it=i;
}
}
printf("%d\n",ans);
return 0;
}
1.a+b块蛋糕,每块都放入某个盘子中
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
#define M 100005
int n,a,b;
int main()
{
scanf("%d%d%d",&n,&a,&b);
if(n==a+b)
{
printf("1\n");
}else{
int t1,t2;
int ans=-1;
int temp;
for(t1=1;t1<n;t1++)
{
t2=n-t1;
temp=666666;
temp=min(a/t1,temp);
temp=min(b/t2,temp);
ans=max(ans,temp);
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
#define M 100005
int a[3];
int main()
{
scanf("%d%d%d",&a[0],&a[1],&a[2]);
sort(a,a+3);
bool flag=false;
if(a[0]==1)
{
flag=true;
}else if(a[0]==2)
{
if(a[1]==2)
flag=true;
else if(a[1]==4&&a[2]==4)
flag=true;
}else if(a[0]==3)
{
if(a[2]==3)
flag=true;
}else if(a[0]>3){
flag=false;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
return 0;
}
A permutation of size n is an array of size n such that each integer from 1 to n occurs exactly once in this array. An inversion in a permutation p is a pair of indices (i, j) such that i > j and ai < aj. For example, a permutation [4, 1, 3, 2] contains 4 inversions: (2, 1), (3, 1), (4, 1), (4, 3).
You are given a permutation a of size n and m queries to it. Each query is represented by two indices l and r denoting that you have to reverse the segment [l, r] of the permutation. For example, if a = [1, 2, 3, 4] and a query l = 2, r = 4 is applied, then the resulting permutation is [1, 4, 3, 2].
After each query you have to determine whether the number of inversions is odd or even.
The first line contains one integer n (1 ≤ n ≤ 1500) — the size of the permutation.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n) — the elements of the permutation. These integers are pairwise distinct.
The third line contains one integer m (1 ≤ m ≤ 2·105) — the number of queries to process.
Then m lines follow, i-th line containing two integers li, ri (1 ≤ li ≤ ri ≤ n) denoting that i-th query is to reverse a segment [li, ri] of the permutation. All queries are performed one after another.
Print m lines. i-th of them must be equal to odd if the number of inversions in the permutation after i-th query is odd, and even otherwise.
3 1 2 3 2 1 2 2 3
odd even
4 1 2 4 3 4 1 1 1 4 1 4 2 3
odd odd odd even
The first example:
- after the first query a = [2, 1, 3], inversion: (2, 1);
- after the second query a = [2, 3, 1], inversions: (3, 1), (3, 2).
The second example:
- a = [1, 2, 4, 3], inversion: (4, 3);
- a = [3, 4, 2, 1], inversions: (3, 1), (4, 1), (3, 2), (4, 2), (4, 3);
- a = [1, 2, 4, 3], inversion: (4, 3);
- a = [1, 4, 2, 3], inversions: (3, 2), (4, 2).
题意:给出一个长度为n的排列,m次操作,每次操作给出区间[l,r]意思是让使原排列中a[l]~a[r]的元素反转,让求每次操作反转之后新排列的逆序数
先求出所有的逆序数ans,对于一次操作[L,R]之间这t=(R-L+1)个数,在反转区间之后,任意两个数之间都相当于交换了位置,又因为任意两个数是不相等的,所以每有一次交换(共有组合数C(t,2)个交换),ans的奇偶改变一次,因为只要判断奇偶所以不用管数之间的大小
if(t&1)
代码:
//ori^=1 运算一次奇偶变一次
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
#define pi acos(-1.0)
#define inf 0x3f3f3f
#define M 1505
int n,m,ans;
int a[M];
int main()
{
int i,j,l,r;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
ans=0;
for(i=1;i<=n;i++) //先求出所有逆序数,并判断奇偶
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
ans^=1; //ans=1 -> odd, ans=0 -> even
}
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&l,&r);
int t=r-l+1;
t=t*(t-1)/2; //[L,R]之间这t个数,在反转排列之后,任意两个数之间都相当于交换了位置,有因为任意两个数是不相等的,所以有一次交换ans的奇偶改变一次,又因为只要判断奇偶所以不用管数之间的大小
if(t&1)
ans^=1;
if(ans)
printf("odd\n");
else
printf("even\n");
}
return 0;
}