2019 Multi-University Training Contest 4.Divide the Stones(贪心)

题意:给你n和k (k|n) 有n个数 第i个数权值为i 要你求权值相同且分成k组 且每组的个数为n/k

思路:恶心构造题,首先对于总权值不能分为k份的 显然不能分成 然后 我们把n/k 分奇偶 我们可以发现 偶数我们可以每k个当成一组

对于奇数 我们可以先处理前3*k 然后同样处理剩下的数

#include <bits/stdc++.h>
#define ls(x) T[x].ch[0]
#define rs(x) T[x].ch[1]
#define fa(x) T[x].fa
#define root  T[0].ch[1]
using namespace std;
const int N = 1e5+7;
const int inf = 0x3f3f3f3f;
typedef long long ll;
const ll mod = 1e9+7;
int vis[N];
vector<ll> v[N];
ll te[N];
int main(){
    //ios::sync_with_stdio(false);
    //cin.tie(0); cout.tie(0);
    int t; scanf("%d",&t);
    while(t--){
        ll n,k; scanf("%lld%lld",&n,&k);
        for(int i=0;i<k;i++) v[i].clear();
        memset(te,0,sizeof(te));
        ll x=(n*(n+1))/2; bool f=1;
        if(n==1&&k==1){
            printf("yes\n");
            printf("1\n");
            continue;
        }
        if(x%k!=0) f=0;
        if(f&&n>(x/k)) f=0;
        if(f){
            if((n/k)%2==0){
                for(ll i=1;i<=n/2;i++){
                    v[i%k].push_back(i);
                    v[i%k].push_back(n-i+1);
                }
                printf("yes\n");
                for(int i=0;i<=k-1;i++){
                    for(int j=0;j<v[i].size();j++)
                        if(j==0) printf("%lld",v[i][j]);
                        else printf(" %lld",v[i][j]);
                    printf("\n");
                }
            }else{
                if(k&1){
                    for(ll i=1;i<=k;i++){
                        v[i%k].push_back(i);
                        te[i%k]+=i;
                    }
                    for(ll i=1;i<=k;i++){
                        v[(i-k/2+k)%k].push_back(i+k);
                        te[(i-k/2+k)%k]+=(i+k);
                    }
                    for(ll i=1;i<=k;i++){
                        v[i%k].push_back((1+3*k)*3/2-te[i%k]);
                    }
                    for(ll i=1;i<=(n-3*k)/2;i++){
                        v[i%k].push_back(i+3*k);
                        v[i%k].push_back(n-i+1);
                    }
                    printf("yes\n");
                    for(int i=0;i<=k-1;i++){
                        for(int j=0;j<v[i].size();j++)
                            if(j==0) printf("%lld",v[i][j]);
                            else printf(" %lld",v[i][j]);
                        printf("\n");
                    }
                }else{
                    printf("no\n");
                }
            }
        }else{
            printf("no\n");
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wmj6/p/11279006.html

时间: 2024-08-30 04:56:43

2019 Multi-University Training Contest 4.Divide the Stones(贪心)的相关文章

2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5312    Accepted Submission(s): 1823 Problem Description Chiaki has an array of

2019 HDOJ Multi-University Training Contest Stage 8(杭电多校)

中规中矩的一场. 题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=855 C: 定义函数f(d,k)为数字d在数字k中出现的次数.给定d和x,找到尽量大的k使得k<=x且f(d,k)==k. 很诡异的一题,最好的做法仍然是打表找规律.题解给了一个很神奇的结论:满足条件的k<1011且k的分布非常稀疏. 1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* defin

2019 HDOJ Multi-University Training Contest Stage 10(杭电多校)

最后一场多校打得一般般. 题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=857 C: E: I: BFS水题. 1 /* Codeforces Contest 2019_mutc_10 2 * Problem I 3 * Au: SJoshua 4 */ 5 #include <queue> 6 #include <cstdio> 7 #include <vector> 8 #include <s

2019 HDOJ Multi-University Training Contest Stage 2(杭电多校)

服务器时不时爆炸,有点难受. 题目链接:http://acm.hdu.edu.cn/userloginex.php?cid=849 A: 神仙题.不可做题. B: dp. C: 推式子题. D: 边分治. E: 可以数学推理的题.但是显然打表更快找出规律.对打出来的结果做两次差分即可. 1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou doubl

2019 HDOJ Multi-University Training Contest Stage 4(杭电多校)

很抱歉过了这么多天才补这场,最近真的挺忙的…… 出题人是朝鲜的(目测是金策工业?),挺难. 题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 A: 签到题. 对于当前的点,若其编号为偶数,则可与1相连使得边权贡献为0.否则从低位向高位找当前点编号的二进制表示的第一个0,使这个0变为1,其他位置变为0并检查新的数字是否小于等于n.若小于等于n则贡献为0,反之贡献为1. 1 /* basic header */ 2 #inclu

2019 Nowcoder Multi-University Training Contest 1 H-XOR

由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那么任取一个不在$R$内的元素,$R$中肯定存在一种取法能和这个元素异或和为$0$.同理,取定一个不在$R$内的元素,再随便取另外任意个不在$R$内的元素,$R$内仍然存在一种取法使得这个异或和为$0$.那么每个不在$R$内的元素包含在$2^{n - r - 1}$个集合内(其他不在$R$内的元素可以

HDU校赛 | 2019 Multi-University Training Contest 3

2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 1004. Distribution of books 考虑二分答案,设当前二分出来的是\(x\). 设\(f_i\)表示前\(i\)个能分成最多的段数,使得每一段和都\(\leqslant x\). 转移显然,枚举一个\(j\),若\(s_i-s_j\leqslant x\)则转移,\(s_i\)表示前

[最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6582 Path Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 3747    Accepted Submission(s): 1075 Problem Description Years later, Jerry fell in love

HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description Alice and Bob are playing together. Alice is crazy about art and she has visited many museums around the world. She has