首页 > 其他分享 >Codeforces Round 861 (Div. 2)

Codeforces Round 861 (Div. 2)

时间:2024-01-17 09:15:26浏览次数:31  
标签:861 ll Codeforces define int fo Div include lld

Codeforces Round 861 (Div. 2)
C题直接数位dp即可

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<bitset>
#include<cmath>
#include<set>
#include<unordered_map>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
#define A puts("Yes")
#define B puts("No")
using namespace std;
typedef double db;
typedef long long ll;
//typedef __int128 i128;
const int N=1e6+5;
const int S=1e5+5;
const ll inf=1ll<<60;
const ll mo=1e9+7;
ll l,r,d1[N],d2[N],t,l1,l2,u,d,ans;
ll f[20][2][2][2],flag,c[100];
void check(){
	memset(f,-1,sizeof(f));
	
	f[l1][1][1][1]=0;
	
	int aa,bb,ne;
	fd(i,l1-1,0) {
		fo(le,0,1) fo(a,0,1) fo(b,0,1) fo(dig,d,u) {
			if (a && dig<d1[i]) continue;
			if (b && dig>d2[i]) continue;
			if (f[i+1][le][a][b]<0) continue;
			
			aa=a&(dig==d1[i]);
			bb=b&(dig==d2[i]);
			ne=le&(dig==0);
		
			
			f[i][ne][aa][bb]=f[i+1][le][a][b]+dig*c[i];
		}
	}
	
	fo(a,0,1) fo(b,0,1) {
		if (f[0][0][a][b]>0) {
			flag=1;
			ans=f[0][0][a][b];
			return;
		}
	}
}
void solve(){
	flag=0;
	fo(i,0,9) {
		fo(j,0,9) {
			d=j;
			u=j+i;
			
			if (u>9) break;
			
			check();
			if (flag) return;
		}
	}
}
int main()
{
//	freopen("data.in","r",stdin);
	
	c[0]=1;
	fo(i,1,18) c[i]=c[i-1]*10ll;
	
	int T;
	scanf("%d",&T);
	while (T--) {
		scanf("%lld %lld",&l,&r);
		
		l1=l2=0;
		t=l; 
		while (t) {
			d1[l1++]=t%10;
			t/=10;
		}
		
		t=r;
		while (t) {
			d2[l2++]=t%10;
			t/=10;
		}
		
		if (l1<l2) {
			ll z=0;
			while (z<l) z=z*10ll+9ll;
			printf("%lld\n",z);
			continue;
		}
		
		solve();
		printf("%lld\n",ans);
	}

	return 0;
}

	
 

D
题意:一个长度为k的序列的价值定义为将其修改为回文的最少步数。求一个串所有长度为k的字串的价值和。

首先注意到一个pair(i,j)产生了贡献,i,j的奇偶性一定相同。
然后问题转化为询问一段区间[l,r](只考虑与i奇偶性相同的)中有多少个数和a[i]相同
那么我们可以离线处理,从左往右扫,利用前缀相减就能得到。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<bitset>
#include<cmath>
#include<set>
#include<unordered_map>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (ll (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
#define A puts("Yes")
#define B puts("No")
using namespace std;
typedef double db;
typedef long long ll;
//typedef __int128 i128;
const int N=1e6+5;
const int S=1e5+5;
const ll inf=1ll<<60;
const ll mo=1e9+7;
struct node{
	ll x,op;
};
vector<node> v[N];
ll n,a[N],k,ans,l,r;
ll f[N],g[N];

int main()
{
//	freopen("data.in","r",stdin);
	
	scanf("%lld %lld",&n,&k);
	if (k==1) {
		printf("%d\n",0);
		return 0;
	}
	fo(i,1,n) scanf("%lld",&a[i]);
	
	fo(i,k/2+2, n)  {
		l=max(2*(1+k/2)-i, i+1-k);
		r=min(i-2, 2*(n-k/2)-i);
		if ((i-l)&1) l++;
		if ((r-i)&1) r--;
		
		ans+=(r-l)/2+1ll;
//		printf("%lld %lld %lld\n",i,l,r);
		if (l-2>0) v[l-2].push_back((node){a[i], +1}); 
		v[r].push_back((node){a[i], -1});
	}
	
	fo(i,1,n) {
		if (i&1) {
			f[a[i]]++;
			for (int j=0;j<(int)v[i].size();j++) {
				ans+=v[i][j].op*f[v[i][j].x];
			}
		}
		else {
			g[a[i]]++;
			for (int j=0;j<(int)v[i].size();j++) {
				ans+=v[i][j].op*g[v[i][j].x];
			}
		}
	}

	printf("%lld",ans);
	return 0;
}

	
 

E题:
数的范围是在k进制下的n位数
一个数是lucky的当且仅当在k进制下,存在一个数位上的数,等于其他数位上的数在模k意义下的和。

利用减法原理
假设一个数的数位和为s,如果存在一个数,那么有
s-x%k=x%k -> s%k=2x%k
那么我们找到这样的x,就是说在计算和为s的方案数是不能使用这些x

easy直接dp即可
mid可以将其看作是一个卷积。

标签:861,ll,Codeforces,define,int,fo,Div,include,lld
From: https://www.cnblogs.com/ganking/p/17968999

相关文章

  • Codeforces Round 920 (Div. 3)
    CodeforcesRound920(Div.3)A-Square#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=5e5+10;voidsolve(){ map<int,int>x; map<int,int>y; ......
  • Codeforces Round 920 (Div. 3)
    目录写在前面ABCDEFG写在最后写在前面比赛地址:https://codeforces.com/contest/1921写完C题去泡了个面边吃边看D,吃着吃着不对劲味儿怎么这么冲一看过期两个月了我草以及div3都AK不了了呃呃博弈论把我鲨了还剩最后一门近代史,周四才考,开摆!感觉除了离散可能有点拉其他都......
  • Codeforces Round 920 (Div. 3)
    基本情况A、C秒的很快。B、D都错了一发才过。E博弈论属于是短板。E.EattheChipProblem-E-Codeforces首先考虑谁可能赢。因为\(Alice\)只能向下,\(Bob\)只能向上,而\(Alice\)先手。显然两者行差为奇数时\(Alice\)有可能赢,偶数时\(Bob\)有可能赢。再考虑平......
  • Codeforces Round 920 (Div. 3) D Very Different Array
    DVeryDifferentArray题意给出两个长度分别为\(n,m\)的数组\(a,c\),\(n<m\),从\(c\)中选择\(n\)个数并找到一个序列使得\(D=\sum_{i=1}^{n}|a_i-c_i|\)尽可能大,求D的值思路假设如果\(m\)和\(n\)一样大,那么找到这个序列的方法很简单:将两个序列分别排序后将其中一个转置,......
  • hey_left 3 Codeforces Round 918 (Div. 4) 再续
    题目链接F.找了些题解,但都看的不是很懂先去又梳理了一遍堆优化版的dij每次用当前可到达的最小的边去进行松弛操作标记数组,若该点已经加入确定点集,就跳过别忘了dist[]数组初始化为无穷大,这样才会全部都被更新#definelllonglongconstintinf=0x3f3f3f3f;constintN=1e......
  • CodeForces 1500C Matrix Sorting
    洛谷传送门CF传送门做了好久。怎么会是呢。题目的操作可以看成,求出一些关键字,使得\(B\)矩阵的行是由\(A\)按照这些第\(1\)关键字、第\(2\)关键字一直到第\(k\)关键字,最后还有一个原来所在行下标的关键字,从小到大排序。肯定是从排好序的\(B\)矩阵入手。首先任意找......
  • abc336 E - Digit Sum Divisible 题解 数位DP
    题目链接:https://atcoder.jp/contests/abc336/tasks/abc336_e题目大意:我们定义一个整数\(n\)的数位和为\(n\)的十进制表示中的各位上的数字之和。比如:整数\(2024\)的数位和为\(2+0+2+4=8\)。一个正整数\(n\)被称作一个好数如果\(n\)能被它的数位和整除......
  • CF1818B ndivisible 题解
    题意简述构造一个长度为\(n\)的排列\(A\),使得对于任意的\(l,r\)(\(1\lel<r\len\))都满足\(A_l+A_{l+1}+⋯+A_r\)不可以被\(r-l+1\)整除。输出其中一种合法排列即可。解题思路构造题。考虑对\(n\)进行分类讨论:当\(n=1\)时,由样例即可得合法排列为\(1\)......
  • CodeForces 1266F Almost Same Distance
    洛谷传送门CF传送门好厉害。特判\(k=1\)。首先经过观察,我们可以按照\(k\)的奇偶性讨论:\(k\)为偶数,有一个中心点挂了若干条长度为\(\frac{k}{2}\)的链。\(k\)为偶数,有两个中心点,两边挂了若干条长度为\(\frac{k}{2}\)的链;\(k\)为奇数,有一个中心点挂了若干条长度......
  • hey_left 2 Codeforces Round 918 (Div. 4) 续
    题目链接F.常规的树状数组求逆序对需要注意的是,因为是下标与值的映射,所以数值不能为负数,也不能太大然后传参数的时候,参数是最大数值切记切记#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;template<typenameT>structTreeArray{vector<T>t......