2020ICPC上海 D - Walker M - Gitignore

server/2024/9/24 13:20:07/

D:

首先显然要二分,判断当前二分的mid时间下是否能满足走满0~n

枚举所有情况,这里按照左,右起点p1,p2分别讨论

p1向左 p2向左(以下向左和向右都代表向左或者向右到墙,而不代表初速度方向),只需要计算p1或者p2反弹之后还能走距离n就是合法

p1向左 p2向右,这里有四种情况

四种只需要判断上半部分相加是否大于等于n即可

p1向右 p2向左

只需要判断上下一个分支拐弯之后只要有一个可以多走>=n 或者上下两个分支都能走到墙,也就是拐弯之后可以多走的距离>=0即可

p1向右 p2向右:同第一种情况

代码实现

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define u1 (u<<1)
#define u2 (u<<1|1)
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
double n,p1,p2,v1,v2;
double eps=1e-10;
bool deal(double a)
{double t1l=p1/v1;double t1r=(n-p1)/v1;double t2l=p2/v2;double t2r=(n-p2)/v2;//左左		double s1=-1,s2=-1;if(t1l<=a){double t1=a-t1l;s1=t1*v1;}if(t2l<=a){double t2=a-t2l;s2=t2*v2;}if(s1>=n||s2>=n)return true;//左右s1=-1,s2=-1;if(t1l<=a){double t1=a-t1l;s1=max(t1*v1,t1*v1/2+p1);}if(t2r<=a){double t2=a-t2r;s2=max(t2*v2,t2*v2/2+(n-p2));}if(s1+s2>=n)return true;//右左s1=-1,s2=-1;if(t1r<=a){double t1=a-t1r;s1=t1*v1;}if(t2l<=a){double t2=a-t2l;s2=t2*v2;}if(s1>=n||s2>=n||(s1>0&&s2>0))return true;//右右s1=-1,s2=-1;if(t1r<=a){double t1=a-t1r;s1=t1*v1;}if(t2r<=a){double t2=a-t2r;s2=t2*v2;}if(s1>=n||s2>=n)return true;return false;
}
bool check(double a)
{return deal(a);
}
void solve()
{
//    cin>>n;scanf("%Lf",&n);scanf("%Lf",&p1);scanf("%Lf",&v1);scanf("%Lf",&p2);scanf("%Lf",&v2);double l=0,r=1e9;if(p1>p2){swap(p1,p2);swap(v1,v2);}while(r-l>eps){double mid=(r+l)/2;check(mid)?r=mid:l=mid;}printf("%.10Lf\n",l);return ;
}
signed main()
{int T=1;sf(T);while(T--)solve();return 0;
}

M:

一个类似树形的思想,把所有的可删/不可删的文件映射为下标,然后按照文件路径建树,注意,不同文件夹下的子文件夹名字可能相同,例如

a/b/c和b/b/d并不冲突

所以不是a->b->c这么建树而是a->a/b->a/b/c这样建树

把所有的可以删除的文件,在建树之后就是对应的叶子结点赋权值为0,不可删除的文件对应的叶子节点赋权值为1(这里注意要建立一个虚拟源点并且权值为1,这样假如所有的文件都可以删除的话递归到虚拟源点的时候就会删除,后面会提到)

样例如下

假设某个点的子树(包括自己)权值为0,则向上递归

否则再次找到这个点u的所有儿子,如果儿子的权值为0则res++

此时就能体会出虚拟源点权值为1的好处,假设输入样例为

3 0

a

b

c

那么递归到虚拟源点的时候碰到子树a,b,c就res++三次,答案就为3

代码实现

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define u1 (u<<1)
#define u2 (u<<1|1)
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
int n,m;
map<string,int>mp;
int idxx;
int e[N],ne[N],h[N],w[N],idx;
int sz[N];
map<PII,bool>pan;
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
string s;
void deal(string s,int c)
{string now="";int pre=1;_rep(i,0,(int)s.size()-1){if(s[i]=='/'){if(!mp.count(now))mp[now]=++idxx;int t=mp[now];if(!pan.count({pre,t}))add(pre,t);pan[{pre,t}]=true;pre=t;
//			now="";}now+=s[i];}if(!mp.count(now))mp[now]=++idxx;int t=mp[now];w[t]=c;add(pre,t);pre=t;
//	now="";return;
}
int res;
int dfs(int u,int fa)
{sz[u]=w[u];for(int i=h[u];~i;i=ne[i]){int j=e[i];if(j==fa)continue;sz[u]+=dfs(j,u);}if(sz[u]){for(int i=h[u];~i;i=ne[i]){int j=e[i];if(j==fa)continue;if(!sz[j])res++;
//			cout<<"j="<<j<<endl;}}return sz[u];
}
void solve()
{res=0;idxx=1;idx=0;cin>>n>>m;_rep(i,1,n){cin>>s;deal(s,0);}_rep(i,1,m){cin>>s;deal(s,1);}w[1]=1;dfs(1,0);_rep(i,0,idxx)h[i]=-1,w[i]=0;mp.clear();pan.clear();cout<<res<<'\n';return ;
}
signed main()
{IOS;memset(h,-1,sizeof(h));int T=1;cin>>T;while(T--)solve();return 0;
}


http://www.ppmy.cn/server/119115.html

相关文章

深度学习常见面试题及答案(1~5)

文章目录 1. 请简述深度学习中的反向传播算法的基本原理和作用。一、基本原理二、作用 2. 解释一下循环神经网络&#xff08;RNN&#xff09;的工作原理&#xff0c;以及它在处理序列数据时的优势和局限性是什么&#xff1f;一、循环神经网络&#xff08;RNN&#xff09;的工作…

【Linux下的cpp】编译调试(gcc、g++、gdb)

【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09; 文章目录 【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09;简述gcc、g、gdb编译过程g 编译参数命令行编译演练1、直接编译2、生成库文件并编译链接静态库并生成可执行文件链接动态库生成可执行文件 …

【sgCreateCallAPIFunction】自定义小工具:敏捷开发→调用接口方法代码生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">调用接口方法定义列表</div…

基于深度学习的零售柜商品识别系统实战思路

1. 了解我们要构建的系统 在开始编码之前&#xff0c;我们先了解一下我们要构建的系统&#xff1a; 目标&#xff1a;创建一个能够识别零售商品的计算机视觉系统核心技术&#xff1a;深度学习&#xff0c;特别是YOLOv5物体检测算法功能&#xff1a; 上传图片并识别其中的商品…

vue的路由

v2用3版本&#xff0c;v3用4版本 import Vue from vue import VueRouter from vue-router Vue.use(VueRouter) const routes [] const router new VueRouter({ routes }) export default router import Vue from vue import App from ./App.vue import router from /router V…

Qt之QFuture理解

结构 #mermaid-svg-HX27W6CUkm4W8BZn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HX27W6CUkm4W8BZn .error-icon{fill:#552222;}#mermaid-svg-HX27W6CUkm4W8BZn .error-text{fill:#552222;stroke:#552222;}#merm…

数据结构与算法-18算法专向(hash)

话题引入&#xff1a; 给你N&#xff08;1<N<10&#xff09;个自然数,每个数的范围为&#xff08;1~10000000000&#xff09;。现在让你以最快的速度判断某一个数是否在这N个数内&#xff0c;不得使用已经封装好的类&#xff0c;该如何实现。 A[] new int[N1]&#xff…

linux-Shell 编程-常用 Shell 脚本技巧

Linux Shell 编程&#xff1a;常用 Shell 脚本技巧 一、概述 Shell 脚本是 Linux 系统管理员和开发人员日常自动化任务的重要工具。通过编写 Shell 脚本&#xff0c;用户可以自动化重复性工作、简化系统维护、管理服务器资源等。Shell 脚本的强大之处在于其简洁和灵活性&…