婚恋网站制作要多少钱,中卫网架配件哪家好,贷款网站模板,seo关键词搜索和优化很巧妙的构造 题目链接
题目大意
要求构造长度为 n n n的数组满足以下条件
任意 i i i#xff0c; − 1000 a [ i ] 1000 -1000a[i]1000 −1000a[i]1000有 k k k个和为正数的子串其余子串和为负数
思路
我们发现与子数组内元素的和有关…很巧妙的构造 题目链接
题目大意
要求构造长度为 n n n的数组满足以下条件
任意 i i i − 1000 a [ i ] 1000 -1000a[i]1000 −1000a[i]1000有 k k k个和为正数的子串其余子串和为负数
思路
我们发现与子数组内元素的和有关所以想到前缀和。 要求和是正的所以我们想在左右端点为 i , j i,j i,j的前缀和串中怎么表示和是正数 i j , p r e [ j ] − p r e [ i ] 0 ij,pre[j]-pre[i]0 ij,pre[j]−pre[i]0 而现在我们需要 k k k个正子串即找到 k k k对合法的正序对 i , j i,j i,j 我们想到冒泡排序每次是将一个逆序对反转成正序对那就先构造一个长为 n 1 n1 n1的逆序数组再用冒泡处理就行了
ACcode
#includebits/stdc.husing namespace std;#define int long longvoid solve()
{int n,k;cinnk;vectorinta(n3);for(int i0;in;i)a[i]n-i1;for(int i0;in;i){for(int ji1;jn;j){if(k0){k--;swap(a[i],a[j]);}}}for(int i1;in;i)couta[i]-a[i-1] ;cout\n;
}signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cint;while(t--){solve();}return 0;
}