Educational Codeforces Round 23 A-F 补题

Treasure Hunt

注意负数和0的特殊处理。。 水题。。 然而又被Hack了 吗的智障

#include<bits/stdc++.h>
using namespace std;

int main()
{
 int sa,sb,da,db,x,y;
 scanf("%d%d%d%d%d%d",&sa,&sb,&da,&db,&x,&y);
 sa=da-sa;sb=db-sb;
 if(sa<0)sa*=-1;
 if(sb<0)sb*=-1;
 if(x<0)x*=-1;
 if(y<0)y*=-1;
 if((sa!=0&&x==0)||(sb!=0&&y==0)){printf("NO\n");return 0;}
 if((sa==0)&&(sb==0)){printf("YES\n");return 0;}
 if(((sa%x)!=0)||((sb%y)!=0)){printf("NO\n");return 0;}
 if((((max(sa/x,sb/y))-(min(sa/x,sb/y)))%2)!=0){printf("NO\n");return 0;}
 printf("YES\n");
 return 0;
}

Makes And The Product

排序后求一下组合数就好了。。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=2e5;
LL num[N];
map<LL,LL>ma;

LL C(LL n,LL m)
{
 LL ans=1;
 for(int i=0;i<m;i++)
 	ans*=n-i;
 for(int i=m;i>=2;i--)
 	ans/=i;
 return ans;
}
int main()
{
 int n;
 scanf("%d",&n);
 for(int i=0;i<n;i++)scanf("%I64d",num+i);
 sort(num,num+n);
 LL ans=1;
 for(int i=0;i<3;i++)
 	ma[num[i]]++;
 LL l=ma[num[2]];
 for(int i=3;i<n&&num[i]==num[2];i++)
 	{
 	 l++;
	}
 ans=ans*C(l,ma[num[2]]);
 printf("%I64d\n",ans);
 return 0;
}

Really Big Numbers

肯定存在某个数k 大于k的数都是big number... 二分找最小的k就好了

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;

LL sum(LL x)
{
 LL dex=1;
 LL ans=0;
 while(x>0)
 	{
 	 ans+=((x%10)*(dex-1));
 	 x/=10;dex*=10;
	}
 return ans;
}

int main()
{
 LL n,s;
 scanf("%I64d%I64d",&n,&s);
 LL l=1,r=n;
 LL i;
 bool flag=false;
 LL ri;
 while(l<=r&&r<=n)
 	{
 	  i=(l+r)>>1;
 	 if(sum(i)>=s){flag=true;ri=i;r=i-1;}
 	 	else {l=i+1;}
	}
if(flag) {printf("%I64d\n",(n-ri+1));return 0;}
 	else printf("0\n");
 return 0;
}

Imbalanced Array

暴力枚举每个区间 复杂度O(n^2)起步 显然是不可以的。

那么只能考虑每个位置对答案做的贡献。即它是多少个区间的最值?

用栈维护,从前往后一个一个堆栈,并且保证栈中的所有元素构成不上升序列即可。

复杂度O(n)技巧性还是很强的。。

#include <bits/stdc++.h>
using namespace std;
long long n,pos[1000005],neg[1000005];
long long solve(long long a[]){
	stack<pair<int,long long>> s;
	a[n]=1e8;
	s.push({-1,1e9});
	long long sum=0;
	for(int i=0;i<=n;s.push({i,a[i]}),++i)
		while(a[i]>s.top().second){
			auto p=s.top();
			s.pop();
			auto p2=s.top();
			sum+=p.second*(i-p.first)*(p.first-p2.first);
		}
	return sum;
}
int main(){
	ios_base::sync_with_stdio(0);
	cin>>n;
	for(int i=0;i<n;neg[i]=(-1)*pos[i],++i)
		cin>>pos[i];
	cout<<solve(pos)+solve(neg);
}

Choosing The Commander

MEX Queries

时间: 2024-12-11 18:03:27

Educational Codeforces Round 23 A-F 补题的相关文章

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

Educational Codeforces Round 23 E. Choosing The Commander (trie)

题目链接: Educational Codeforces Round 23 E. Choosing The Commander 题意: 一共有n个操作. 1.  插入一个数p 2.  删除一个数p 3.  询问有多少个数 使得 x^p<l 题解: 对于前两种操作用01trie就能解决. 对于对三个操作,我们考虑在trie上搜索. 1.  当l的bit位是1时,那边bit位是p的字数全部的数都会小于l,(因为p^p=0) 2.  当l的bit为是0时,那边只能向bit位是p的子树中搜. 这样算下来

Codeforces Round #634 (Div. 3) 补题

A. Candies and Two Sisters 签到题,直接输出即可 代码 #include<bits/stdc++.h> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; inline void read(int &p) { p=0;int flag=1;char c=getchar(); while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();} w

Educational Codeforces Round 23 补题小结

昨晚听说有教做人场,去补了下玩. 大概我的水平能做个5/6的样子? (不会二进制Trie啊,我真菜) A. 傻逼题.大概可以看成向量加法,判断下就好了. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int x1,x2,yy1,y2,x,y; int main(){ scanf("%d%d%d%d%d%d&qu

Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案

Digital collectible card games have become very popular recently. So Vova decided to try one of these. Vova has n cards in his collection. Each of these cards is characterised by its power pi, magic number ci and level li. Vova wants to build a deck

Educational Codeforces Round 11、A B题

A. Co-prime Array 题意:给你一个数列,要求构造两两相邻之间的数互质的数列,可以插入的数的小于10的9次方 思路:其实可以选择靠近10的9次方的最大的三个素数.然后按我下面的方法做就可以了,我这里选的三个素数不是最大的,数据有点水,就水过了 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 const int qq=1005; 5 int num[qq]; 6 int ar[qq<

Codeforces Round #590 (Div. 3)补题

要想上2000分,先刷几百道2000+的题再说 ---某神 题目 E F 赛时是否尝试 × × tag math bitmask 难度 2000 2400 状态 ? √ 解 E 待定 F 传送门 第一次接触状态压缩dp的题.这道题转换问题的思路非常巧妙. 原问题: 已知: 一个字符串,可进行不超过一次操作 操作限定: 选择某个子串,使其在原串中翻转 目的:使原串的特征值最大 串的特征值:串任意没有重复字符的子串,其包含字符的种类数 问题的转换: 首先选定一个子串a,之后再找到另一个子串b,使得a

Codeforces Round #419 (Div. 1) 补题 CF 815 A-E

A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. 首先我们根据一个维度(c维)对n个三元组排序,然后枚举答案在这个维度的取值. 此时序列被分成了两个部分,前半部分 满足所有c大于等于i 后半部分满足所有c严格小于i(即已有一个维度小于) 通过累计,我们知道此时前半部a维的最大值ma和b维的最大值mb. 显然可能存在的三元组答案,必然首先满足a维和