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!

Input

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.

Output

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的更多相关文章

  1. codeforces 817 D. Imbalanced Array(单调栈+思维)

    题目链接:http://codeforces.com/contest/817/problem/D 题意:给你n个数a[1..n]定义连续子段imbalance值为最大值和最小值的差,要你求这个数组的i ...

  2. Codeforces 817+818(A~C)

    (点击题目即可查看原题) 817A Treasure Hunt 题意:给出起点和终点,每次移动只能从 (a,b)移动至(a+x,b+y) , (a+x,b-y) , (a-x,b+y) , (a-x, ...

  3. Codeforces Round #817 (Div. 4)

    CF传送门 因为洛谷题库未更新,所以给出的题面都是CF的. 现场打真是太卡了(梯子挂了,codeforc.es也崩了),所以五六分钟才打开题目 \(qwq\) A. Spell Check 萌萌题,把 ...

  4. Educational Codeforces Round 23F

    http://codeforces.com/contest/817/problem/F 无限长的数组,刚开始每一位是0,三种操作,1,把(l,r)之间不是1的变成1,2,把(l,r)之间不是0的变成0 ...

  5. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  6. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  7. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  8. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  9. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

随机推荐

  1. javascript删除Cookie的正确方法(转载)

    原来一直以为只要设置javascript的document.cookie对象就能简单的在浏览器端设置和删除cookie值,网上很多文章也是这么教的,但是最近发现简单的设置javascript的docu ...

  2. 2017-2018 Exp8 Web基础 20155214

    目录 Exp8 Web基础 实验内容 建站过程 SQL注入 知识点 Exp8 Web基础 实验内容 实验环境 主机 Kali 靶机 Kali 实验工具 后台语言 'PHP' 服务器 'Apache' ...

  3. PowerBI开发 第一篇:设计PowerBI报表

    PowerBI是微软新一代的交互式报表工具,把相关的静态数据转换为酷炫的可视化的,能够根据filter条件,对数据执行动态筛选,从不同的角度和粒度上分析数据.PowerBI主要由两部分组成:Power ...

  4. 并发编程(Concurrent programming)

    并发编程(Concurrent programming) 1.并发编程概述 2.委托(delegate) 3.事件(event) 4.线程(thread) 5.线程池(threadPool) 6.任务 ...

  5. vuex实践之路——笔记本应用(二)

    上一篇我们简单介绍了vuex在此项目中的作用. 这次来理一下项目的整体思路. main.js上次看过了,首先看App.vue文件 我们引入了Toolbar.vue,NodeList.vue,Edito ...

  6. Salesforce随笔: 将Visualforce Page渲染为PDF文件(Render a Visualforce Page as a PDF File)

    参照 : Visualforce Developer Guide 第60页 <Render a Visualforce Page as a PDF File> 你可以用PDF渲染服务生成一 ...

  7. [Hanani]JAVA大数相关学习记录

    1.Basic remains 题目链接 涉及内容: |大数读入|大数模|大数进制读入时转化为十进制|大数输出时转化为其他进制输出| import java.io.*; import java.mat ...

  8. 小学生都能写智能语音助手了,我这颗转战AI的心要何去何从?

    前言——我是不是老了 前天看了一个关于AI类的综艺节目我感觉整个人都不好了.这个综艺的名字叫<智造将来>上面那个小屁孩自己写了一个智能语音助手,这个小屁孩叫袁翊闳是2018年百度AI开发者 ...

  9. 《Linux内核分析》第四周笔记 扒开系统调用的三层皮(上)

    扒开系统调用的三层皮(上) 一.用户态.内核态和中断 库函数将系统调用封装起来. 1.什么是用户态和内核态 一般现代CPU都有几种不同的指令执行级别. 在高执行级别下,代码可以执行特权指令,访问任意的 ...

  10. linux 内核 第四周 扒开系统调用的三层皮 上

    姬梦馨 原创作品 http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核态和中断处理过程 用户通过库函数与系统调用联系起来:库函数帮我们把系 ...