[bzoj5025]单调上升路径
由于题目的证明可以发现$ans\ge 2m/n \ge n-1$,于是大胆猜测答案就是n-1
若n是奇数,则将边分为n组,每组(n-1)/2,如果同组内边没有交点,那么只需要每一组边一个权值区间,从每一组边一定不可能走回那组边(因为会经过其他组的边),所以答案至多n-1
若n是偶数,先对n-1的图边分类,最后可以发现每一组边都还剩下一个点,和n相连即可
具体分组方法:如果将n个点排成一条线,初始2-n,3-(n-1)……然后不断平移+循环即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k,t,a[505][505]; 4 int main(){ 5 scanf("%d",&n); 6 k=n+(n&1)-1; 7 for(int i=0;i<k;i++){ 8 if (n%2==0)a[i][n-1]=a[n-1][i]=++t; 9 for(int j=1,x=i,y=i;j<(n+1)/2;j++){ 10 x=(x+1)%k; 11 y=(y-1+k)%k; 12 a[x][y]=a[y][x]=++t; 13 } 14 } 15 for(int i=0;i<n;i++){ 16 for(int j=i+1;j<n;j++)printf("%d ",a[i][j]); 17 printf("\n"); 18 } 19 return 0; 20 }