首页 > 其他分享 >AT_abc347_e

AT_abc347_e

时间:2024-05-18 17:31:35浏览次数:19  
标签:right abc347 int 1000001 pd include left

题意

给定你一个长度为 \(n\) 且初始全部为 \(0\) 的序列 \(A\),以及一个空集 \(S\)。接下来有 \(T\) 次操作,每次给定一个 \(x\),若 \(x \in S\) 则将 \(x\) 删除,否则将 \(x\) 加入 \(S\)。在每次操作之后,对于 \(j=1,2,\cdots,n\),若 \(j \in S\),则给 \(a_j\) 加上 \(\left| S \right|\),其中 \(\left| S \right|\) 定义为 \(S\) 的元素个数。所有操作完成后,求 \(A\) 的每一个元素的值。

思路

显然,对于 \(x \notin S\) 等价于它后面的每一个位置长度都加 \(1\),\(x \in S\) 等价于后面的每一个位置长度都减 \(1\)。不难想到用差分来修改,再做一遍前缀和即可得到每一次操作做完后的 \(\left| S \right|\)。

接下来如何计算答案呢?读题可以发现,对于一个相同的 \(x\),其一定在第奇数次出现时加入,第偶数次出现时删除。也就是说,在奇数次出现和偶数次出现这段时间内的 $ \sum \left| S \right|$ 是有效的,应计入答案。其余则无效,因为此时 \(x \notin S\)。

注意到要求的 \(\sum \left| S \right|\) 总是连续的,因此可以在前文的基础上再做一次前缀和,即可快速求得答案。

当然了,最后边界记得要处理。时间复杂度是 \(O(n)\) 的。

放上代码方便大家调试:

#include <iostream>
#include <cstdio>
#include <cstring>
#define int long long

using namespace std;


int n,m,x[1000001],a[1000001],s[1000001],pd[1000001],lst[1000001];

signed main()
{
	cin >> n >> m;
	for( int i = 1 ; i <= m ; i ++ )
	{
		cin >> x[i];
		if( pd[x[i]] ) s[i] --,pd[x[i]] = 0;
		else s[i] ++,pd[x[i]] = 1;
	}
	for( int i = 1 ; i <= m ; i ++ )
		s[i] += s[i - 1];
	for( int i = 1 ; i <= m ; i ++ )
		s[i] += s[i - 1];
	memset( pd , 0 , sizeof( pd ) );
	for( int i = 1 ; i <= m ; i ++ )
	{
		if( pd[x[i]] && lst[x[i]] ) a[x[i]] += s[i - 1] - s[lst[x[i]] - 1],pd[x[i]] = 0;
		else lst[x[i]] = i,pd[x[i]] = 1;
	}
	for( int i = 1 ; i <= m ; i ++ )
		if( pd[x[i]] )
			a[x[i]] += s[m] - s[lst[x[i]] - 1],pd[x[i]] = 0;
	for( int i = 1 ; i <= n ; i ++ )
		cout << a[i] << ' ';
	return 0;
}

标签:right,abc347,int,1000001,pd,include,left
From: https://www.cnblogs.com/-lilong-/p/18199537

相关文章

  • ABC347B Substring
    题目描述给你一个由小写英文字母组成的字符串S,S有多少个不同的非空子串?子串是连续的子序列。例如,xxx是yxxxy的子串,但不是xxyxx的子串。数据范围:S是长度在1和100之间(含)的字符串,由小写英文字母组成。题解我认为这道题放在普及组的话,非常适合放在第一题和第二题之间,......
  • atcoder beginer 347 (abc347) D E 题解
     D就是二进制下,哪些位置有重合(两个1),哪些位置没有重合(1个1,1个0),剩下的都是0。xor的结果<2^60,就是小于60位(二进制下)。注意要有要求两个数需要是2^60,于是要有大小的判断,因为有的a,b会2^60,但是按照题目要求,这个情况不行。比如xor的结果,60位都是1,然后a、b各有60个1,那么需要有30个1......
  • AT-abc347(C,D)
    AtCoderBeginnerContest347C-IdealHolidays这场做得最头疼的题分析容易想到先用$(d_i+a+b-1)%(a+b)+1$把$d_i$映射到$[1,a+b]$的区间再排序,但由于未知星期一是哪天,我们也无法确定映射后的$d_i$是星期几关于这个映射可以自己推一下我们取a+b=7看几个例子对于32......
  • ABC347
    Alink很简单遍历,判断模\(k\)是否为\(0\),如果为\(0\),输出\(a_i/k\)。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,k;inta[105];signedmain(){ cin>>n>>k; for(inti=1;i<=n;++i){ cin>>a[i]; if(a[i]%......
  • ABC347G 题题解
    还算是比较经典了。首先我们注意到一个性质:\(1+3+\cdots+n=n^2\)。所以我们可以把平方拆开。然后容易证明\(a_{i,j}\)填\(1\)一定比填\(0\)不劣。我们可以把\(a_{i,j}\)拆成\(4\)个点,然后我们想到了最小割。构造网络:\(a_{i,j,x}\leftarrowa_{i,......
  • ABC347 C~D~?(更新中)
    Portal:https://atcoder.jp/contests/abc347/tasksABC347只过了\(A,B\),再创新低,。。。遂来补题C-IdealHolidays题意简述输入\(n,a,b,d_1,d_2,…,d_n\),表示在Atcoder国每周分为\(a\)天休息日和\(b\)天工作日,现在有\(n\)个事件,第\(i\)个事件落在第\(d_i\)日。我忘了今天是这......
  • ABC347F 题解
    我们考虑这三个正方形的相对位置有多少种情况。我们把正方形的顶点设为\((x_i,y_i)\)。容易发现,放置合法当且仅当\(\foralli\neqj,|\x_i-x_j\|\geqd\\text{or}|\y_i-y_j\|\geqd\)。发现这只有可能是以下两种情况。于是便可以开始写了。/***********......
  • [ABC347] AtCoder Beginner Contest 347 题解
    [ABC347]AtCoderBeginnerContest347题解A模拟。BSA模板,把所有子串丢进哈希表里即可。C逆天题,这个分讨并不显然。考虑计算所有天数到今天的偏移量,然后如果最远的和最近的天数的距离\(\leA\)肯定可以,否则可以把所有天向右平移一段距离,然后使得最远的天到达第二周的......
  • [ABC347C] Ideal Holidays题解
    [ABC347C]IdealHolidays题解原题传送门原题传送门(洛谷)​ 题意翻译:​ 在\(AtCoder\)王国中,一个周有\(A+B\)天。其中在一周中,\([1,A]\)天是假日,\([A+1,B]\)天是工作日。​ 高桥有\(N\)个计划,第\(i\)个计划安排在\(i\)天后。他不知道今天是周几,但他想知道是否......
  • AT_abc347_d 的题解
    (一)数学题。根据\(C\)的值,可以得出\(x\)和\(y\)有\(s1+s\)个相同的数位和\(s2\)个不同的数位。\(s1\)是\(C\)的二进制中\(0\)的数量,\(s2\)是\(C\)的二进制中\(1\)的数量。\(x\)和\(y\)可以通过在开头放\(s\)个\(1\)的方式既不改变异或大小,又能凑到......