1 solutions

  • 0
    @ 2024-9-19 16:50:12

    暂时没有添加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