[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)……然后不断平移+循环即可

 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 }
View Code

 

posted @ 2019-08-07 19:52  PYWBKTDA  阅读(258)  评论(0编辑  收藏  举报