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的概 ...
随机推荐
- Xcode7如何真机调试
查阅网上Xcode7如何真机调试,教程我觉得都有点繁琐,然后我自己用3步实现真机测试: 1.左上角Xcode --> Perferences --> Accounts --> ...
- VBA 连接,提醒 rs AS new adodb.recordset 的变量未定义
解决方法: 菜单-工程-引用Microsoft ActiveX Data Objects 2.x Library 定位……msado15.dll
- 20155223 Exp6 信息收集与漏洞扫描
20155223 Exp6 信息收集与漏洞扫描 本次实验以熟悉信息收集手段与漏洞扫描手段为主. 实践步骤 whois域名查找 在虚拟机Kali的终端输入命令:whois baidu.com,查询百度的 ...
- 20155223 实验5 MSF基础应用
20155223 实验5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit:漏洞攻击.一个exploit程序肯定会触发系统的一个或多个漏 ...
- # 2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...
- [SDOI2010]地精部落[计数dp]
题意 求有多少长度为 \(n\) 的排列满足 \(a_1< a_2> a_3 < a_4 \cdots\) 或者 $a_1> a_2 < a_3 > a_4\cdo ...
- java Script复习总结
一:基础知识 1.JavaScript语言的历史 l 早期名称:livescript l 开发公司:网景公司(netscape) 2.JavaScript语言的基本特点 l 基于对象 l 事件 ...
- Frida----安装
介绍 它是本机应用程序的 Greasemonkey,或者更多技术术语,它是一个动态代码检测工具包.它允许您将JavaScript或您自己的库的片段注入Windows,macOS,GNU / Linux ...
- live555学习(一)通读Makefile编译live555
live555学习(一)通读Makefile编译live555 live555 编译live555 学习开源 live555学习(一)通读Makefile编译live555 前言 live555简介 ...
- DRF01
1.web应用模式 在web开发中有两种应用模式: 1)前后端不分离 2)前后端分离 2.api接口 为了在团队内部形成共识.防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范, ...