C题:
思路很简单。
由题意可知,奇数的集合有k-p个,偶数的几何有p个。
那么我们先选择k-p-1个奇数,每一个奇数是一个集合。
然后我们再选择p个偶数,每一个偶数是一个集合,如果偶数的个数不足,那么就用两个奇数去补。
然后我们再把剩下的所有的数放在一个集合里。
By rowanhao, contest: Codeforces Round #251 (Div. 2), problem: (C) Devu and Partitioning of the Array, Accepted, # #include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<vector>#include<queue>using namespace std;#define LL __int64#define maxn 330000vector<int>vec;int a[maxn];int vis[maxn];int main(){ int n,k,p; while(~scanf("%d%d%d",&n,&k,&p)) { int sum=0; int q=k-p; int l,r; l=r=0; for(int i=1;i=p*2&&l%2==0) { l=p; cout1) { vis[i]=1; l--; printf("1 %d\n",a[i]); } } vec.clear(); for(int i=1;i1&&vec.size()==2) { printf("2 %d %d\n",vec[0],vec[1]); vec.clear(); l--; } } if(vec.size()==0)continue; printf("%d",vec.size()); for(int i=0;i<vec.size puts else cout return>D题: <p></p> <p>思路也挺简单的。</p> <p>由题意可知,我们需要把a数组的所有的数都变的大于等于x。b数组里的所有的数都小于等于x。</p> <p>x是a数组和b数组中的某一个数。</p> <p>那么我们枚举x,然后二分查找。</p> <p></p> <pre name="code" class="sycode">#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<vector>using namespace std;#define LL __int64#define maxn 220100double num[maxn];vector<ll>vec;LL a[maxn];LL b[maxn];LL sa[maxn];LL sb[maxn];LL n,m;LL dos(LL x){ LL sum=0; LL l,r,mid; l=1;r=n+1;mid=(l+r)/2; while(l<r if>=x)r=mid; else l=mid+1; mid=(l+r)/2; } sum+=(mid-1)*x-sa[mid-1]; l=1;r=m+1;mid=(l+r)/2; while(l<r if>=x)r=mid; else l=mid+1; mid=(l+r)/2; } sum+=sb[mid]-(m-mid+1)*x; return sum;}int main(){ while(~scanf("%I64d%I64d",&n,&m)) { for(LL i=1;i=1;i--)sb[i]=sb[i+1]+b[i]; LL minn=-1; for(LL i=0;i<vec.size ll x="vec[i];" if else minn="min(minn,dos(x));" cout return> <br> <br> <p></p> <p><br> </p> </vec.size></r></r></ll></vector></iostream></algorithm></string.h></stdio.h>