1 solutions
-
0
暂时没有添加spj功能,需要在atcoder官网提交
#include<bits/stdc++.h> using namespace std; struct Edge{ int u,v,w; }; vector<Edge> G; int main() { int L,t; cin>>L; for(int i=0;i<21;i++) //找到最高位 { if(L&(1<<i)) t=i; } for(int i=1;i<=t-1;i++) //从前往后连接 2^0...2^(t-2),也就是2^(t-1)-1都可以凑出来 { G.push_back({i,i+1,1<<i-1}); G.push_back({i,i+1,0}); } G.push_back({t,20,0}); //连接到终点 G.push_back({t,20,1<<t-1}); //2^(t-1)次方可以得到 int g=1<<t; //后面的一段 while(g<L) //L减去2^t 小于2^t { for(int i=0;i<21;++i) { if((1<<i)&(L-g)) t=i; //找到剩余的最高位 } G.push_back({t+1,20,g}); //从剩余的最高位的下一个点连接2^t次方 g|=1<<t; //累加当前和(这样才可以保证最后是L-1条边) } cout<<"20 "<<G.size()<<endl; for(auto x:G) { cout<<x.u<<" "<<x.v<<" "<<x.w<<endl; } return 0; }
- 1
Information
- ID
- 1384
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 2
- Accepted
- 0
- Uploaded By