首页 > 其他分享 >Codeforces 1857E:Power of Points 区间?

Codeforces 1857E:Power of Points 区间?

时间:2023-08-09 22:55:06浏览次数:43  
标签:Node 1857E 10 int Codeforces leq Points 区间 id

1857E.Power of Points


Description:

  • \(n\) 个数:\(x_1,···,x_n\),从左向右扫,当 \(s=x_i\) 时,可以将这 \(n\) 个数分为若干个闭区间 \([s,x_1],[s,x_2],···,[s,x_n]\)(当然如果\(x_i<s\),则区间形如 \([x_i,s]\))
  • 对于每一个 \(s\in (x_1,···,x_n),\)有一个整数 \(p\),记 \(f_p\) 为其在划分出的所有区间中被包含的次数,请计算出 \(\sum_{p=1}^{10^9} f_p\)
  • 例如, 对于 \([1,2,5,7,1]\),当 \(s=x_3=5\) 时,划分的区间为 \([1,5],[2,5],[5,5],[5,7],[1,5]\),其中 \(p=1\) 时在2个区间中出现,即 \(f_1=2\),同理,\(f_2=3\),\(f_3=3\),\(f_4=3\),\(f_5=5\),\(f_6=1\),\(f_7=1\),\(f_8=0\),\(f_9=0\),\(···\),\(f_{10^9}=0\).
    所以 \(\sum_{p=1}^{10^9} f_p=2+3+3+3+5+1+1=18\)

Constraints:

  • \(1\leq n \leq 2·10^5\)
  • \(1 \leq x_i \leq 10^9\)

Analysis:

  • 对于一个固定的 \(s=x_i\),考虑这 \(n\) 个区间中所含初始元素的贡献,不难发现:\(x_i\) 的贡献总和恰好等于 \(n\) 个区间的长度总和,即该定态下可以\(O(n)\)

image

  • 那如何更高效呢?\(\Rightarrow\) 排个序看看(升序),有序之后就可以利用数学知识对区间考虑。
  • 当处理到 \(s=x_i\) 时,对于所有的 \(j\leq i\),划分出区间 \([x_j,s]\),对于所有的 \(j>i\),划分出区间 \([s,x_j]\),求所有区间长度总和即可(需要前缀和维护)。

image

  • 总复杂度:\(O(n\log n)\)

Solution:

const int maxn = 2e5+5;
//或许用pair写会更简洁,但鄙人偏爱结构体..
struct Node {
	ll a; int id;
	Node(){}
	Node(ll _a, int _id) : a(_a), id(_id){}
};

bool cmp(Node x, Node y) {
	if(x.a == y.a) return x.id < y.id;
	return x.a < y.a;
}

ll pre[maxn]; // 前缀和

void solve() {
	int n; cin >> n;
	for(int i=0;i<=n;i++) pre[i] = 0;
	vector<Node> v;
	for(int i=1;i<=n;i++) {
		ll x; cin >> x;
		v.push_back(Node(x,i));
	}
	sort(v.begin(),v.end(),cmp);
	for(int i=1;i<=n;i++) pre[i] = pre[i-1] + v[i-1].a;
	// 注意下标细节
	vector<ll> ans(n+1);
	for(int i=1;i<=n;i++) {
		ll s = v[i-1].a;
		ans[v[i-1].id] = (s+1)*i+(n-i)*(1-s)+pre[n]-2*pre[i];	
	}
	// 闲来无事:基于条件控制输出(避免行末空格)的简洁写法(详解在文末)
	for(int i=1;i<=n;i++) cout << ans[i] << " \n"[i==n]; 
}

标签:Node,1857E,10,int,Codeforces,leq,Points,区间,id
From: https://www.cnblogs.com/Trilliverse/p/17617453.html

相关文章

  • Codeforces Round 881 (Div. 3)
    A.SashaandArrayColoring为了让贡献最大,每种颜色只能染两个数显然这两个数为最大值与最小值、次大值与次小值、第三大值与第三小值……以此类推即可B.LongLong为了让和最大,我们需要的就是把所有负数变成正数那么第一问的答案就是\(\sum_{i=1}^n|a_i|\)此外,因为每次变......
  • Codeforces Round 891 (Div. 3) A-G
    偷偷摆烂导致小号掉了16分,但是队友涨了16分,一定是米哈游的问题!A.ArrayColoring题意:给出一个长为\(n\)的数组,问能否把所有元素分别染成两种颜色中的一种,并且使得同种颜色的元素和它们最后的奇偶性相同。Solution算出奇数个数看是不是奇数个即可voidsolve(){ intn;cin>>n......
  • Codeforces Round 891 (Div. 3)
    A.ArrayColoring#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;intsum=0;for(inti=1,x;i<=n;i++)cin>>x,sum+=x;if(sum%2==0)cout<<&quo......
  • Codeforces Round 891 (Div. 3) 题解
    A.ArrayColoring因为:偶数+偶数=偶数奇数+奇数=偶数奇数+偶数=奇数所以设\(s1\)为奇数之和,\(s2\)为偶数之和\(s2\)必定是偶数如果奇数的个数为偶数,则\(s1\)为偶数;否则是奇数而在\(s1\)为奇数时,即使拿一个奇数加到\(s2\)里,那么也是不合法的所以直接判断奇数的......
  • Codeforces Round 891 (Div. 3)
    CodeforcesRound881(Div.3)A.ArrayColoring题目大意link思路简单判断数组和的奇偶性即可(小学数学)#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){intn;cin>>n;intsum=......
  • Codeforces Round 891 (Div. 3)
    CodeforcesRound891(Div.3)A-ArrayColoring思路:需要两部分的奇偶相同,判断奇数的个数是否为偶数即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong//#defineint__int128#definedoublelongdoubletypedefpair<int,int>PII;typedefpair......
  • CodeForces CF1846G 题解
    CodeForcesCF1846G题解CodeForces题目链接洛谷题目链接标准答案是状压之后,转化成Dijkstra算法跑最短路。我这里提供一个不一样的思路。题意简述主人公得了病,有部分类型的症状。所有类型症状共有\(n\)种,用长为\(n\)的01串表示是否有那种症状。共有\(m\)种药,吃......
  • Codeforces 890-891的一些题目的反思
    和atcoder一起出交互题是吧。D题回复逆序对个数,对于[L,R-1]和[L,R],如果R是最大值,那么对逆序对个数无影响。这样来确认某个数是不是最大的,然后递归扩展到整个区间这里看到逆序对,要想到归并排序、分治、递归、区间合并。。。。。查看代码//Problem:D.MoreWrong//Contest......
  • codeforces 891 (div3)857E - Power of Points
    E.点的力量每个测试限时2秒每个测试限制内存为256兆字节输入以标准格式输入输出以标准格式输出给定n个具有整数坐标x1,…xn的点,这些点位于数线上。对于某个整数s,我们构建段[s,x1],[s,x2],…,[s,xn]。注意,如果xi<s,则段将类似于[xi,s]。段[a,b]覆盖了所有整数点a,a+1,a+2,…,b。......
  • Codeforces 1857D:Strong Vertices 与图论无关的出度最大统计
    1857D.StrongVerticesDescription:给定两个长度均为\(n\)的数组\(a\)和\(b\)(编号\(1\)~\(n\)),如果\(a_u-a_v\geqb_u-b_v\)\((u\neqv)\),那么从\(u\)到\(v\)建立一条有向边。"Strong"定义为:一个点\(V\)可以经过有向图中合法的通路到达其他所有的点。请求解出"......