[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

 

转载于:https://www.cnblogs.com/PYWBKTDA/p/11312878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值