Codeforces 817

A
你可以按如下方式移动
问能不能从给定的一个坐标走到另一个。
【solution】
裸,奇偶性注意
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
int a1,b1,a2,b2,x,y,a,b;
int main(){
cin>>a1>>b1>>a2>>b2>>x>>y;
if((a1-a2)%x==&&(b1-b2)%y==){
a=(a1-a2)/x;
b=(b1-b2)/y;
if((a-b)%==){
cout<<"YES\n";
}
else cout<<"NO\n";
}
else cout<<"NO\n";
return ;
}
B
After returning from the army Makes received a gift — an array a consisting of n positive integer numbers. He hadn't been solving problems for a long time, so he became interested to answer a particular question: how many triples of indices (i, j, k) (i < j < k), such that ai·aj·ak is minimum possible, are there in the array? Help him with it!
The first line of input contains a positive integer number n (3 ≤ n ≤ 105) — the number of elements in array a. The second line contains n positive integer numbers ai (1 ≤ ai ≤ 109) — the elements of a given array.
Print one number — the quantity of triples (i, j, k) such that i, j and k are pairwise distinct and ai·aj·ak is minimum possible.
【solution】
就是问成绩最小的有序三元组有多少个,排序搞定
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
typedef long long ll;
const int N=;
int n,a[N],b[N],c[N],m;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);b[i]=a[i];
}
sort(b+,b+n+);
m=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b+m+,a[i])-b;
for(int i=;i<=n;i++) c[a[i]]++;
if(c[]>=){
cout<<((ll)c[]*(c[]-)*(c[]-)/)<<endl;
}
else{
if(c[]==){
cout<<c[]<<endl;
}
else if(c[]==){
if(c[]>=) cout<<((ll)c[]*(c[]-)/)<<endl;
else cout<<c[]<<endl;
}
}
return ;
}
C
f(i)表示i所有数位的和
问满足 i-f(i)>=s (i<=n) 的有多少个
n,s<=10^18
【solution】
显而易见,f(i)最大也就是18*9=162,所以[s,s+1000]这个范围直接枚举,更大的肯定是满足的。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
typedef long long ll;
ll n,m,ans;
il ll f(ll n){
ll res=;
for(;n;n/=)
res+=(n%);
return res;
}
int main(){
cin>>n>>m;
for(ll i=m;i<=n&&i<=m+;i++){
if(i-f(i)>=m) ans++;
}
ans+=n-min(n,m+);
cout<<ans;
return ;
}
D
给定一个长度为n的数组a (n<=100000)
求sigma(max(i,j)-min(i,j)) (1<=i<=j<=n)
【solution】
显然的把最大和最小拆开做
我们采用分治算法解决问题
我们去除一段中最大(小)统计贡献,然后左右递归
最多递归n次,采用st算法加速
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
#define cmin(x,y) (a[x]<a[y]?x:y)
#define cmax(x,y) (a[x]>a[y]?x:y)
using namespace std;
typedef long long ll;
const int N=;
int n,s[N][],t[N][],a[N],k[N];
ll ans=;
il int getmin(int l,int r){
int h=r-l+,p=r-(<<k[h])+;
return cmin(s[l][k[h]],s[p][k[h]]);
}
il int getmax(int l,int r){
int h=r-l+,p=r-(<<k[h])+;
return cmax(t[l][k[h]],t[p][k[h]]);
}
il void dfs1(int l,int r){
if(l>r) return;
int mid=getmin(l,r);
ans-=(ll)a[mid]*(mid-l+)*(r-mid+);
dfs1(l,mid-);dfs1(mid+,r);
}
il void dfs2(int l,int r){
if(l>r) return;
int mid=getmax(l,r);
ans+=(ll)a[mid]*(mid-l+)*(r-mid+);
dfs2(l,mid-);dfs2(mid+,r);
}
int main(){
scanf("%d",&n);
for(int i=,K=;i<=n;i++){
if((<<K+)<i) K++;
scanf("%d",&a[i]);k[i]=K;
t[i][]=s[i][]=i;
}
for(int j=;j<=k[n];j++){
for(int i=,k=(<<j-)+;k<=n;i++,k++){
s[i][j]=cmin(s[i][j-],s[k][j-]);
t[i][j]=cmax(t[i][j-],t[k][j-]);
}
}
dfs1(,n);dfs2(,n);
cout<<ans;
return ;
}
E
维护一个正整数构成的集合p
支持三个操作
1、添加一个元素
2、删除一个已经存在的元素
3、输入x,y,询问集合中满足pi^x<y的元素有多少个。
【solution】
解法十分的巧妙,把元素转化成二进制,建立trie树,问题迎刃而解。
希望这种做法能在难题里得到应用。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
const int N=;
int n=,Q,c[N*10][],s[N*10];
int main(){
scanf("%d",&Q);
for(int ii=,jj,x,y,h,ans;ii<=Q;ii++){
scanf("%d%d",&jj,&x);h=;
if(jj==){
for(int i=,j;i>=;i--){
j=(x&(<<i))>;
if(!c[h][j]) c[h][j]=(++n);
h=c[h][j];s[h]++;
}
}
if(jj==){
for(int i=,j;i>=;i--){
j=(x&(<<i))>;
h=c[h][j];s[h]--;
}
}
if(jj==){
scanf("%d",&y);ans=;
for(int i=;i>=;i--){
if(y&(<<i)){
if(x&(<<i)){
ans+=s[c[h][]];
h=c[h][];
}
else{
ans+=s[c[h][]];
h=c[h][];
}
}
else{
if(x&(<<i)) h=c[h][];
else h=c[h][];
}
}
printf("%d\n",ans);
}
}
return ;
}
F
维护区间裸题
1、染黑一个区间
2、染白一个区间
3、翻转一个区间
操作后要求输出最靠左的黑点的坐标
【solution】
线段树
细节:有的标记不能简单覆盖!【以前一直忽略的!】
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
typedef long long ll;
const int N=;
int t[N],Q,m=,L[N],R[N],s[N],p,c[N];
ll l[N],r[N],b[N];
il int d(int a,int b){
if(a==) return b;
if(b<) return b;
return -a;
}
il void pushdown(int i){
if(t[i]==) return;
if(t[i]==){
t[i+i]=t[i+i+]=;
s[i+i]=R[i+i]-L[i+i]+;
s[i+i+]=R[i+i+]-L[i+i+]+;
t[i]=;
}
else if(t[i]==){
t[i+i]=t[i+i+]=;
s[i+i]=s[i+i+]=;
t[i]=;
}
else if(t[i]==){
t[i+i]=d(t[i+i],t[i]);
t[i+i+]=d(t[i+i+],t[i]);
s[i+i]=R[i+i]-L[i+i]+-s[i+i];
s[i+i+]=R[i+i+]-L[i+i+]+-s[i+i+];
t[i]=;
}
}
il void work(int i,int p,int q,int v){
if(q<L[i]||p>R[i]) return;
if(i<m) pushdown(i);
if(p<=L[i]&&R[i]<=q){
if(v==) s[i]=R[i]-L[i]+;
if(v==) s[i]=;
if(v==) s[i]=R[i]-L[i]+-s[i];
t[i]=d(t[i],v);
return;
}
work(i+i,p,q,v);work(i+i+,p,q,v);
s[i]=s[i+i]+s[i+i+];
}
il int query(int i){
if(i<m) pushdown(i);
if(s[i]==) return L[i];
if(s[i+i]<R[i+i]-L[i+i]+) return query(i+i);
else return query(i+i+);
}
int main(){
scanf("%d",&Q);
for(int i=;i<=Q;i++){
scanf("%d%I64d%I64d",&c[i],&l[i],&r[i]);
b[++p]=l[i];b[++p]=l[i]+;
b[++p]=r[i];b[++p]=r[i]+;
}
b[++p]=;
sort(b+,b+p+);
p=unique(b+,b+p+)-b-;
for(int i=;i<=Q;i++){
l[i]=lower_bound(b+,b+p+,l[i])-b;
r[i]=lower_bound(b+,b+p+,r[i])-b;
}
while(m<p) m<<=;
for(int i=m;i<m+m;i++)
L[i]=R[i]=i-m+;
for(int i=m-;i;i--)
L[i]=L[i+i],R[i]=R[i+i+];
for(int i=;i<=Q;i++){
work(,l[i],r[i],c[i]);
printf("%I64d\n",b[query()]);
}
return ;
}
Codeforces 817的更多相关文章
- codeforces 817 D. Imbalanced Array(单调栈+思维)
题目链接:http://codeforces.com/contest/817/problem/D 题意:给你n个数a[1..n]定义连续子段imbalance值为最大值和最小值的差,要你求这个数组的i ...
- Codeforces 817+818(A~C)
(点击题目即可查看原题) 817A Treasure Hunt 题意:给出起点和终点,每次移动只能从 (a,b)移动至(a+x,b+y) , (a+x,b-y) , (a-x,b+y) , (a-x, ...
- Codeforces Round #817 (Div. 4)
CF传送门 因为洛谷题库未更新,所以给出的题面都是CF的. 现场打真是太卡了(梯子挂了,codeforc.es也崩了),所以五六分钟才打开题目 \(qwq\) A. Spell Check 萌萌题,把 ...
- Educational Codeforces Round 23F
http://codeforces.com/contest/817/problem/F 无限长的数组,刚开始每一位是0,三种操作,1,把(l,r)之间不是1的变成1,2,把(l,r)之间不是0的变成0 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
随机推荐
- Git与TortoiseGit基本操作
Git与TortoiseGit基本操作 1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(C ...
- 大数据入门第十四天——Hbase详解(三)hbase基本原理与MR操作Hbase
一.基本原理 1.hbase的位置 上图描述了Hadoop 2.0生态系统中的各层结构.其中HBase位于结构化存储层,HDFS为HBase提供了高可靠性的底层存储支持, MapReduce为HBas ...
- c# Login UI with background picture animation
准备4张图片 UI control: <Grid x:Class="Test1.MainBgAd" xmlns="http://schemas.microsoft. ...
- 20155318 《网络攻防》Exp2 后门原理与实践
20155318 <网络攻防>Exp2 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 下载软件前要勾选一些用户协议,其中部分就存在后门进入系统的安全隐患. ...
- CODE[VS] 1159 最大全0子矩阵
写一道CODEVS的题目 其实我还是很喜欢CODEVS的界面的 主要是系统地学习一下悬线法这个看似十分简单,实际就是十分简单的算法 对于一些详细的东西参考dalao's blog,不喜勿喷 对于悬线法 ...
- python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题
问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...
- Scala学习(二)练习
Scala控制结构和函数&练习 1. 一个数字如果为正数,则它的signum为1:如果是负数,则signum为-1:如果为0,则signum为0:编写一个函数来计算这个值 简单逻辑判断: 测试 ...
- 一些IT中的工具介绍
1. 史上最全github使用方法:github入门到精通 2. Git教程 3. GIT与GitHub使用简介 简单来说,git是一种版本控制系统.跟svn.cvs是同级的概念.github是一个网 ...
- [CF587F]Duff is Mad[AC自动机+根号分治+分块]
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...
- jvm系列(九):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...



