A.Phillip and Trains

CodeForces 586D

题意:过隧道,每次人可以先向前一格,然后向上或向下或不动,然后车都向左2格。问能否到达隧道终点。

题解:dp,一开始s所在列如果前方为'.'则dp[i]=1。r[i]代表上一次的dp[i]值。

如果该行当前可行,那么它就可以更新它上下两行(如果有),必须用r[i]去更新。

再判断每行在当前时间是否会发生撞车:看看位置 i+t*2,i+t*2+1,i+t*2+2 是否有车。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
int t,n,k,dp[],r[];
char s[][];
bool ck(int i,int j){//j行i列不可行
return i<n&&s[j][i]!='.';
}
int main() {
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(int i=;i<=;i++){
scanf("%s",s[i]);
r[i]=dp[i]=s[i][]=='.'&&s[i][]=='s';
}
for(int t=,i=;i<n;i++,t++){
for(int j=;j<=;j++)if(!ck(i+t*,j)){
dp[j+]=max(r[j],dp[j+]);
dp[j-]=max(r[j],dp[j-]);
}
for(int j=;j<=;r[j]=dp[j],j++)
if(ck(i+t*,j)||ck(i+t*+,j)||ck(i+t*+,j))
dp[j]=;
}
if(dp[]||dp[]||dp[])puts("YES");
else puts("NO");
}
return ;
}

B - Mr. Kitayuta's Gift

CodeForces 505A 

题意:插入一个字符是否能使字符串变成回文串。

题解:长度10,可以暴力枚举所有位置所有字母。我是用O(n)的算法。代码写得比较奇怪。

#include<cstdio>
#include<cstring>
char s[];
int main(){
scanf("%s",s);
int len=strlen(s),i=,j;
for(;i<len/&&s[i]==s[len-i-];i++);
if(s[i]!=s[len-i-]){//如果有不同的
for(j=i;j<len/&&s[j]==s[len-j-];j++);
//尝试在i前面插入一个s[len-i-1]后是否变成回文
if(j==len/) printf("%.*s%c%s",i,s,s[len-i-],s+i);
else{
//尝试在len-i-1后面插入一个s[i]是否变成回文
for(j=i+;j<=len/&&s[j]==s[len-j];j++);
if(j>len/)
printf("%.*s%c%s",len-i,s,s[i],s+len-i);
else printf("NA");
}
}else printf("%.*s%c%s",len/,s,s[len/],s+len/);
//本身是回文,只要中间插入一个s[len/s]
return ;
}

D - Vasya and Chess

CodeForces 493D

题意:n*n的棋盘,白棋先动,可以走没走过的位置或吃黑棋,八方向。如果最后谁先不能走就输了。求白棋能否胜利,若能输出她的第一步。

题解:如果n是奇数,白棋走了,黑棋对称着走就可以了。所以黑棋必胜。n是偶数,白棋右走一步后,相当于奇数棋盘的后手了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int main(){
scanf("%d",&n);
if(n%){
printf("black");
}else
printf("white\n1 2");
return ;
}

E - Bishops Alliance

Gym 101147F

题意:n*n的棋盘上有m个主教,告诉你每个主教的x,y坐标,和p值。你可以选取一些主教,使得选择的任意两个主教i和主教j之间满足:在同一对角线上,且$dis(i,j)≥p_i^2+p_j^2+C$,C是告诉你的一个常数,$dis(i,j)=|x_i-x_j|+1$。问最多可以选取多少个主教。

题解:

dp。对于一条对角线上的点按x排序后,dp[i]表示第i个点为最后一个选的点,最多可以取多少个点。

$dis(i,j)=x_i-x_j+1\geq p_i^2+p_j^2+C\ (j<i) $

移项后得

$x_i-p_i^2-C+1\geq x_j+p_j^2 \tag1\ (j<i)$

将该对角线上每个点的$x-p^2-C+1$,$x+p^2$离散化一下。那么dp[i]=dp[j]+1,dp[j]是j 满足(1)的最大的dp值。

所以用树状数组维护一下。

pos(v)表示v是离散后第几大的,qry(x)为最大的dp[j],其中j满足$x_j+p_j^2$在前x个离散后的值中,且j<i。

所以$dp[i]=qry(pos(x_i-p_i^2-c+1))+1$。

每次求完dp[i],再update(pos(x+p2),dp[i]),就可以保证qry(x)的j一定<i。

update函数即更新 前x个的最大dp值(x大于等于pos(x+p2))。

#include<bits/stdc++.h>
#define N 270005
#define ll long long
using namespace std;
vector<pair<int,ll> >dia[N],rdia[N];
int n,m,c,len;
int s[N];
ll z[N];
int lowbit(int x){return x&(-x);}
int qry(int x){
int ans=;
for(;x;x-=lowbit(x))ans=max(ans,s[x]);
return ans;
}
void update(int x,int v){
for(;x<N;x+=lowbit(x))s[x]=max(s[x],v);
}
int pos(ll v){
return lower_bound(z,z+len,v)-z;
}
int solve(vector<pair<int,ll> > &v){
if(!v.size())return ;
len=;
for(int i=;i<v.size();i++){
ll x=v[i].first,p2=v[i].second;
z[len++]=x-p2-c+;
z[len++]=x+p2;
}
z[len++]=-1e18;
sort(z,z+len);
len=unique(z,z+len)-z;
sort(v.begin(),v.end());
for(int i=;i<=len;i++)s[i]=;
int ans=,dp;
for(int i=;i<v.size();i++){
ll x=v[i].first,p2=v[i].second;
dp=qry(pos(x-p2-c+))+;
ans=max(ans,dp);
update(pos(x+p2),dp);
}
return ans;
}
int main(){
freopen("bishops.in","r",stdin);
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&c);
for(int i=;i<=*n;i++)
dia[i].clear(),rdia[i].clear();
for(int i=;i<m;i++){
int x,y;ll p;
scanf("%d %d %I64d",&x,&y,&p);
dia[x+y].push_back(make_pair(x,p*p));
rdia[x-y+n].push_back(make_pair(x,p*p));
}
int ans=;
for(int i=;i<=*n;i++){
ans=max(ans,solve(dia[i]));
ans=max(ans,solve(rdia[i]));
}
printf("%d\n",ans);
}
return ;
}

F - Guess a number!

题意:四种猜数字方式和两种回答:>=/<=/>/< d Y/N ,给出多个这样的问答,求任意一个符合条件的数字。

题解:二分,改变l的条件是有'>',回答是Y,或者有<回答是N,可以异或一下。然后是开区间还是闭区间,就看是否有'=',回答是Y,或者没有'=',回答是N,也可以异或一下。注意l和r的初始值。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 2000000000
char s[];
int n,ans,d,l=-inf,r=inf;
void work(int i,int j){
if(i)l=max(l,d+j);
else r=min(r,d-j);
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%s %d %c",s,&d,&s[]);
work((s[]=='>')^(s[]=='N'),(s[]=='=')^(s[]=='Y'));
if(l>r)ans=-;
}
if(ans==-)printf("Impossible");
else printf("%d",l);
return ;
}

【Mutual Training for Wannafly Union #1 】的更多相关文章

  1. Mutual Training for Wannafly Union #2

    codeforces 298A. Snow Footprints 分类讨论三种情况: ①..RRRRRR…  ②..LLLLLLL… ③..RRRLLLL.. //AC by lwq: #includ ...

  2. Mutual Training for Wannafly Union #1解题报告

    ---恢复内容开始--- q神等人组织的vjudge上的多校训练,题目基本上都来自于CF,#1是上周进行的,参加后感觉收获很多,因为上周准备期中比较忙,解题报告现在补上. 比赛地址(兼题目地址) A题 ...

  3. Mutual Training for Wannafly Union #6 E - Summer Trip(并查集)

    题目链接:http://www.spoj.com/problems/IAPCR2F/en/ 题目大意: 给m个数字代表的大小,之后n组数据,两两关联,关联后的所有数字为一组,从小到大输出组数以及对应的 ...

  4. Mutual Training for Wannafly Union #8 D - Mr.BG Hates Palindrome 取余

    Mr.BG is very busy person. So you have been given enough time (1000 milliseconds) to help him. Mr. B ...

  5. Mutual Training for Wannafly Union #9

    A(SPOJ NPC2016A) 题意:给一个正方形和内部一个点,要求从这个点向四边反射形成的路线的长度 分析:不断做对称,最后等价于求两个点之间的距离 B(CF480E) 题意:求01矩阵内由0组成 ...

  6. Mutual Training for Wannafly Union #6

    A =w= B QvQ C 题意:有长度为n的序列(n<=5e5),求满足条件的a,b,c,d的组数,要求满足条件:min([a,b])<=min([c,d]),a<=b<c& ...

  7. Mutual Training for Wannafly Union #5

    A(UVA12336) 题意:给一个n*m(n,m<=1e5)的棋盘,棋盘上有一些障碍点不能放棋子,现在要在棋盘上放4个棋子,满足A->B->C->D->A,其中走的规则 ...

  8. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

  9. 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)

    [Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...

随机推荐

  1. python学习笔记(基础三:if else流程判断、while循环、for循环)

    if else流程判断 getpass在pycharm中无法使用,在命令行窗口中进入python环境可以使用. import getpassusername = input("usernam ...

  2. 多线程中的volatile和伪共享

      伪共享 false sharing,顾名思义,“伪共享”就是“其实不是共享”.那什么是“共享”?多CPU同时访问同一块内存区域就是“共享”,就会产生冲突,需要控制协议来协调访问.会引起“共享”的最 ...

  3. GJM : 常用网站收集 【不断更新中... ... ... 】

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  4. 利用模板将HTML从JavaScript中抽离

    利用模板将HTML从JavaScript中抽离 一.当需要注入大段的HTML标签到页面中时,应该使用服务器渲染(从服务器加载HTML标签) 该方法将模板放置于服务器中使用XMLHttpRequest对 ...

  5. 我的屌丝giser成长记-研二篇

    之前有提到过的,本来按照计划中,研一结束就该去深圳中科院研究所实习的,之前跟里面师兄说好了的,奈何导师又接到一个新的科研研究项目,跟学院的几个其他老师一起合作的,主要是关于土地流转系统,而且是一个挺大 ...

  6. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...

  7. Struts2初始(一)

    1.过滤器:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter位置:在struts2的核心包struts2-co ...

  8. HDFS的架构

    主从结构 主节点,只有一个: namenode 从节点,有很多个: datanodes 在版本1中,主节点只有一个,在 版本2中主节点有两个. namenode 负责(管理): 接收用户操作请求 维护 ...

  9. Linq表达式和Lambda表达式用法对比

    什么是Linq表达式?什么是Lambda表达式?前一段时间用到这个只是,在网上也没找到比较简单明了的方法,今天就整理了一下相关知识,有空了再仔细研究研究 public Program() { List ...

  10. 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...