题目链接
C. Eugene and an array
题意:给你n长度的序列,问你有多少个子序列(下标是连续的)是 好 的子序列
一个好的子序列定位:该序列中的子序列(下标不连续)没有和为0的。
做法:总的减去不合法的。
不合法的求法:l表示左边的边界。用前缀和得到当前左坐标 L 和 右坐标 R 区间内和为零。 左坐标的左边和右做坐标的右边都是可以组合一下 都是不合法的。
此时我们把边界l移到L+1 的位置 。因为如果下次 你又找到一个新的L1 R1 L<=L1的话 就会有重复计算的。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=2e5+10;
ll n;
ll a[N],pre[N];
map<ll,ll>mp;
int main()
{
scanf("%lld",&n);
rep(i,1,n) scanf("%lld",&a[i]);
ll ans=n*(n+1)/2;
ll sum=0;
mp[0]=1;
int l=1;
rep(i,1,n)
{
pre[i]=pre[i-1]+a[i];
if(mp[pre[i]]>=l){
sum+=(n-i+1)*(mp[pre[i]]-l+1);
l=mp[pre[i]]+1;
}
mp[pre[i]]=i+1;
}
printf("%lld\n",ans-sum);
}
D. Challenges in school №41
读了半天发现还是读错了。
参考题意和题解链接:此
题解:
代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=3e3+10;
char s[N];
vector<int>v[3000100];
int n,k,mink,maxk;
void print()
{
int p1=0,p2=0;
int kk=mink;
while(kk<k){
//kk++;
printf("1 %d\n",v[p1][p2]);
p2++;
if(p2==v[p1].size()) p2=0,p1++;
else kk++;
}
printf("%d ",v[p1].size()-p2);
for(int i=p2;i<v[p1].size();++i) printf("%d ",v[p1][i]);puts("");
for(int i=p1+1;i<mink;++i){
printf("%d ",v[i].size());
for(int val:v[i]) printf("%d ",val);
puts("");
}
}
void run(int id)
{
for(int i=1;i<n;++i){
if(s[i]=='R'&&s[i+1]=='L')
{
swap(s[i],s[i+1]);
v[id].push_back(i);
++i;
}
}
}
int main()
{
cin>>n>>k>>s+1;
run(0);
while(v[mink].size()&&mink<=k)
{
maxk+=v[mink].size();
mink++;
run(mink);
}
//printf("mink:%d maxk:%d k:%d\n",mink,maxk,k);
if(mink<=k&&k<=maxk) print();
else puts("-1");
}
F. Kate and imperfection
题意:给你一个n 要你构造k长度的序列,序列从 1 到 n中取k个 。定义 这个序列中任意两个数的gcd的最大值为这个序列的等级。
现在要你求k 从2取到n 且每个序列的等级最小。
我的做法比较迷:2到n 每个数除以它的最小素因子排个序,输出这几个数就好了,推了几个样例得到的
有一个不错的解法:此