首页 > 其他分享 >AtCoder Beginner Contest 353

AtCoder Beginner Contest 353

时间:2024-05-12 11:41:53浏览次数:11  
标签:AtCoder limits Beginner 10 int sum long 353 mod

AtCoder Beginner Contest 353

A - Buildings

求第一个 \(h_i\) 大于 \(h_1\) 的位置。

模拟。

点击查看代码
#include<bits/stdc++.h>
#define int long long

using namespace std;
int n,h[103];
signed main(){
	cin>>n;cin>>h[1];
	for(int i=2;i<=n;i++){
		cin>>h[i];
		if(h[i]>h[1]) cout<<i,exit(0);
	}
	cout<<"-1";
	return 0;
}

B - AtCoder Amusement Park

有若干容量为 \(k\) 的车,每个组只能坐一辆车,求按顺序坐车需要的车辆数。

模拟。

点击查看代码
#include<bits/stdc++.h>
#define int long long

using namespace std;
int n,k,a[103],cnt,v;
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(v+a[i]<=k) v+=a[i];
		else v=a[i],cnt++;
	}
	cout<<cnt+1;
	return 0;
}

C - Sigma Problem

令 \(f(x,y)=(x+y)\bmod 10^8\)。

\[\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^nf(a_i,a_j) \]

\(1\le a_i<10^8\)。

这个数据范围是关键。

先考虑排序,然后对于每个 \(i\) 找到第一个 \(j\) 使得 \(a_i+a_j>10^8\),贡献就为后缀和减去 \(n-j+1\) 个 \(10^8\),时间复杂度 \(O(n\log n)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int mod=1e8;
using namespace std;
int n,a[300003],ans,pre[300003];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	a[n+1]=mod;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
	int pos=n;
	for(int i=1;i<n;i++){
		while(pos>i&&a[i]+a[pos]>=mod) pos--;
		if(pos<i) pos=i;
		ans+=a[i]*(n-i)+pre[n]-pre[i]-(n-pos)*mod;
	}
	cout<<ans;
	return 0;
}

D - Another Sigma Problem

令 \(f(x,y)=\overline{xy}\)。

\[\left(\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^nf(a_i,a_j)\right)\bmod 998244353 \]

考虑一个数的贡献,就是后面的数的 \(10^{位数}\) 和加上后缀和,然后就没了,时间复杂度 \(O(n\log_{10} n)\)

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int mod=998244353;
using namespace std;
int n,a[300003],ans,ton[300004],pre[300004];
int qpow(int a,int b){
	int res=1;
	for(;b;b>>=1,a=a*a%mod) if(b&1) res=res*a%mod;
	return res;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		pre[i]=(pre[i-1]+a[i])%mod;
		ton[i]=(ton[i-1]+qpow(10,(int)(log10l(a[i])+1))%mod)%mod;
	}
	for(int i=1;i<=n;i++){
		ans=(ans+(pre[n]-pre[i]+(ton[n]-ton[i])*a[i]%mod+mod)%mod)%mod;
	}
	cout<<ans;
	return 0;
}

E - Yet Another Sigma Problem

令 \(f(x,y)=\text{LCP}(x,y)\)。

\[\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^nf(a_i,a_j) \]

把字符串放到 trie 树上,插入时记末端节点 \(x\),记 \(g_x\) 为 \(x\) 被几个字符串覆盖,则 \(g_x\to g_x+1\),然后对于每个节点 \(u\) 算 \(g_u=\sum\limits_{v\in \text{son}_u}g_v\)。
计算答案时可以分开计算,对于每个字符位置 \(x\),其贡献为 \(\frac{g_x(g_x-1)}{2}\)。计算即可。

不要弄错下标!时间复杂度 \(O(\sum |s|)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long

using namespace std;
int n,ans;
char s[300003];
int trie[300004][30],node,g[300004];
void insert(){
	int u=0;
	
	for(int i=0;s[i];i++){
		if(!trie[u][s[i]-'a'])
			trie[u][s[i]-'a']=++node;
		u=trie[u][s[i]-'a'];
	}
	g[u]++;
}
void dfs(int u){
	int cnt=0,f=0;
	for(int i=0;i<26;i++){
		if(trie[u][i]){
			dfs(trie[u][i]);
			g[u]+=g[trie[u][i]];
		}
	}
}
void ds(int u){
	ans+=g[u]*(g[u]-1)/2;
	for(int i=0;i<26;i++){
		int v=trie[u][i];
		if(v){
			ds(v);
		}
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s;
		insert();
	}
	for(int i=0;i<26;i++){
		if(trie[0][i]) dfs(trie[0][i]);
	}
	for(int i=0;i<26;i++){
		if(trie[0][i]) ds(trie[0][i]);
	}
	cout<<ans;
	return 0;
}

标签:AtCoder,limits,Beginner,10,int,sum,long,353,mod
From: https://www.cnblogs.com/DEV3937/p/18187628/abc353

相关文章

  • AtCoder Beginner Contest 353
    A-Buildings(abc353A)题目大意给定\(n\)个数字,输出第一个大于第一个数的下标。解题思路依次与第一个数比较,大于则输出。神奇的代码n=input()a=list(map(int,input().split()))b=[i>a[0]foriina]ifTruenotinb:print(-1)else:print(b.ind......
  • ABC353E字典树处理最长公共前缀
    https://atcoder.jp/contests/abc353/tasks/abc353_e其实就是字典树板子题。似乎遇到最长公共前缀,就该想到字典树。依次加入每个字符串:维护一个数组siz来统计在当前串之前的串在对应点的出现次数。手模一下字典树的建树过程,显然如果当前串\(S_i\)能跑到一个曾经串\(S_......
  • ABC353
    不知道为啥有断更了一周...Ewoc,怎么跟我出的题目这么像先把字符串扔到一个Trie里面,然后对于每一个点我们考虑这一个点到根节点组成的字符串能是多少对字符串的最长公共前缀。我们定义\(cnt_u\)表示共有多少个字符串的结尾在以\(u\)为根的子树内。对于\(u\)节点,其贡献......
  • AtCoder Beginner Contest 318 Ex Count Strong Test Cases
    洛谷传送门AtCoder传送门首先做一些初步的观察:A和B的解法是对称的,所以A对的方案数等于B对的方案数。同时若A和B同时对则每个置换环环长为\(1\),方案数为\(n!\)。所以,若设A对的方案数为\(x\),那么答案为\(n!^2-(x-n!)-(x-n!)-n!=n!^2+n!-x\)。......
  • ATcoder ABC 352 F - Estimate Order 搜索
    很恶心的一个搜索,当然好像不用搜索也能做。没啥好讲的,一个联通块大小>=2就要搜索找位置,联通块大小等于1的不用搜。能调出来也是真不容易。#include<bits/stdc++.h>#defineintlonglong#defineDBdoubleusingnamespacestd;intn,m,tsiz,yinum;constintN=23;intfa[......
  • AtCoder Beginner Contest 352
    AtCoderBeginnerContest352A-AtCoderLine给\(N,X,Y,Z\)判断是否\(\min(X,Y)\leZ\le\max(X,Y)\)。模拟。点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,x,y,z;signedmain(){ cin>>n>>x>>y>......
  • AtCoder Grand Contest 001
    D.ArraysandPalindrome如果两个字符要求相同就给它们连边,对于一个长度为\(x\)的回文串,\(x\)是偶数会连\(x/2\)条边,奇数会连\(x/2-0.5\)条边。\(a\)和\(b\)两个序列总和为\(2n\),要让\(n\)个字符相同至少连\(n-1\)条边,也就是奇数个数超过\(2\)时一定无解......
  • AtCoder Beginner Contest 352题解
    AtCoderBeginnerContest352Time:2024-05-04(Sat)20:00-2024-05-04(Sat)21:40AAtCoderLine问题陈述AtCoder铁路线有$N$个车站,编号为$1,2,\ldots,N$。在这条线路上,有趟进站列车从$1$站出发,依次停靠$2,3,\ldots,N$站,有趟出站列车从$N$站出发,依次停......
  • AtCoder Beginner Contest 352 考试总结
    前言正常发挥。属于是\(4\)个月没搞OI,复健成功了!得分明细:ABCDEFGTotal√√√√√××1475改题明细:ABCDEFG√√√√√××第一次正式rated打AT,行吧!A.AtCoderLineProblemAtCoder铁路线有\(N\)个车站,编号为\(1......
  • AtCoder abc352
    EProblemStatementYouaregivenaweightedundirectedgraph$G$with$N$vertices,numbered$1$to$N$.Initially,$G$hasnoedges.Youwillperform$M$operationstoaddedgesto$G$.The$i$-thoperation$$(1\leqi\leqM)$$isasfollows:Youar......