A. Crazy Town

  这一题只需要考虑是否经过所给的线,如果起点和终点都在其中一条线的一侧,那么很明显从起点走点终点是不需要穿过这条线的,否则则一定要经过这条线,并且步数+1。用叉积判断即可。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#define N 100010
#define M 1010
using namespace std;
int x1,y1,x2,y2,a,b,c,i,ans,n;
double x,y,xx,yy;
double cross(double x1,double y1,double x2,double y2,double x3,double y3)
{
return (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
}
int main()
{
scanf("%d%d",&x1,&y1);
scanf("%d%d",&x2,&y2);
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
if (b)
{
x=;
y=(-c-a)*1.0/b;
xx=;
yy=(-c-*a)*1.0/b;
}
else
{
y=;
x=(-c-b)*1.0/a;
yy=;
xx=(-c-*b)*1.0/a;
}
if (cross(x,y,xx,yy,x1,y1)*cross(x,y,xx,yy,x2,y2)<)
ans++;
}
printf("%d",ans);
}

C. Array and Operations

  要使操作数目最多首先每个操作肯定是要除以一个质数的,因为一个合数可以拆成多个质数,那么操作数目明显会增加。对于每个质数可以独立考虑,对于一个质数x,假设a[i]中有sum[i]个x,一次操作会使一个数对同时减少一个x,现在要考虑的就是如何操作使得操作次数最多,由于题目保证数对的和是奇数,也就是一个数对分别有一个奇数和一个偶数,那么就可以建二分图跑网络流,对于一个数对,假设L[i]是奇数,R[i]是偶数,那么从源点s连一条流量为sum[L[i]]的边到L[i],L[i]连一条流量无穷大的边到R[i],R[i]连一条流量为sum[R[i]]的边到汇点t。跑出来的最大流就是对于质数x的最大操作数,对于每个质数的操作数累加起来就是答案。

代码

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#define N 100010
#define M 810
#define INF 0x37373737
using namespace std;
int dp,pre[M],p[M],tt[M],g[M],vis[M],dis[M],z[N],now[M],s,t,a[N],sum[N];
int n,m,i,L[N],R[N],flag,j,ans;
void link(int x,int y,int z)
{
dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;g[dp]=z;
dp++;pre[dp]=p[y];p[y]=dp;tt[dp]=x;g[dp]=;
}
int min(int a,int b)
{
if (a<b) return a;return b;
}
int bfs()
{
int i,head,tail;
memcpy(now,p,sizeof(p));
memset(vis,,sizeof(vis));
head=;tail=;
vis[s]=;
dis[s]=;
z[tail]=s;
do
{
head++;
i=p[z[head]];
while (i)
{
if ((vis[tt[i]]==)&&(g[i]>))
{
vis[tt[i]]=;
dis[tt[i]]=dis[z[head]]+;
tail++;z[tail]=tt[i];
}
i=pre[i];
}
}
while (head!=tail);
return vis[t];
}
int dfs(int u,int flow)
{
int ans,tmp,i;
if (u==t) return flow;
i=now[u];
ans=;
while (i)
{
if ((dis[u]+==dis[tt[i]])&&(g[i]>))
{
tmp=dfs(tt[i],min(flow-ans,g[i]));
ans+=tmp;g[i]-=tmp;
if (i%==) g[i+]+=tmp;else g[i-]+=tmp;
if (flow==ans) return flow;
}
i=pre[i];
now[u]=i;
}
if (flow>ans) dis[u]=;
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=;i<=n;i++)
scanf("%d",&a[i]);
for (i=;i<=m;i++)
scanf("%d%d",&L[i],&R[i]);
for (i=;i<=;i++)
{
flag=;
for (j=;j<=n;j++)
if (a[j]%i==)
{
flag=;
while (a[j]%i==)
{
sum[j]++;a[j]=a[j]/i;
}
}
//----------------------------
if (flag)
{
dp=;
memset(p,,sizeof(p));
s=;t=n+;
for (j=;j<=n;j++)
if (j%==)
link(j,t,sum[j]);
else
link(s,j,sum[j]);
for (j=;j<=m;j++)
if (L[j]%==)
link(R[j],L[j],INF);
else
link(L[j],R[j],INF);
while (bfs()) ans=ans+dfs(s,INF);
for (j=;j<=n;j++)
sum[j]=;
}
flag=;
}
for (i=;i<=n;i++)
if (a[i]>)
{
flag=a[i];
for (j=;j<=n;j++)
while (a[j]%flag==)
{
sum[j]++;a[j]=a[j]/flag;
}
dp=;
memset(p,,sizeof(p));
s=;t=n+;
for (j=;j<=n;j++)
if (j%==)
link(j,t,sum[j]);
else
link(s,j,sum[j]);
for (j=;j<=m;j++)
if (L[j]%==)
link(R[j],L[j],INF);
else
link(L[j],R[j],INF);
while (bfs()) ans=ans+dfs(s,INF);
for (j=;j<=n;j++)
sum[j]=;
}
printf("%d",ans);
}

D. Traffic Jams in the Land

  正解是线段树,由于a[i]的值只可能是2到6,假设当前到了节点i,用了时间time,那么对于当前是要花费1s时间经过还是2s时间经过,用time和time%lcm(2,3,4,5,6)判断是没有差别的,那么对于线段树的每个节点都开60个数组,分别表示在(time&60)的时间进入该节点所表示的线段,并用了多少时间走出去,这样就可以对线段树进行修改和查询了。下面贴出的代码是用分块做的,块内元素固定为40,思想是和线段树一样的,只是每次修改都对所在的块暴力维护,也能卡过所有的数据。。。。

代码

 #include<cstdio>
#include<cstring>
#define N 100100
#define Q 40
int n,i,j,a[N],s[][],q,x,y,bx,by,tmp;
char ch;
int min(int a,int b)
{
if (a<b) return a;return b;
}
void change(int x)
{
int i,j,tmp;
for (j=;j<=;j++)
{
tmp=j;
for (i=(x-)*Q+;i<=min(x*Q,n);i++)
{
if (tmp%a[i]==) tmp++;
tmp++;
}
s[x][j]=tmp-j;
}
}
int query(int x,int y,int bx,int by)
{
int i,tmp;
tmp=;
for (i=x;i<=bx*Q;i++)
{
if (tmp%a[i]==) tmp++;
tmp++;
}
for (i=bx+;i<=by-;i++)
tmp=tmp+s[i][tmp%];
for (i=(by-)*Q+;i<=y;i++)
{
if (tmp%a[i]==) tmp++;
tmp++;
}
return tmp;
}
int main()
{
scanf("%d",&n);
for (i=;i<=n;i++)
scanf("%d",&a[i]);
for (i=;i<=(n-)/Q+;i++)
change(i);
scanf("%d",&q);
for (i=;i<=q;i++)
{
getchar();
scanf("%c%d%d",&ch,&x,&y);
if (ch=='C')
{
a[x]=y;
change((x-)/Q+);
}
else
{
y--;
bx=(x-)/Q+;
by=(y-)/Q+;
if (bx==by)
{
tmp=;
for (j=x;j<=y;j++)
{
if (tmp%a[j]==) tmp++;
tmp++;
}
printf("%d\n",tmp);
}
else
{
printf("%d\n",query(x,y,bx,by));
}
}
}
}

Codeforces Round #284 (Div. 1)的更多相关文章

  1. Codeforces Round #284 (Div. 2)A B C 模拟 数学

    A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. Codeforces Round #284 (Div. 2)

    题目链接:http://codeforces.com/contest/499 A. Watching a movie You have decided to watch the best moment ...

  3. Codeforces Round #284 (Div. 1) A. Crazy Town 计算几何

    A. Crazy Town 题目连接: http://codeforces.com/contest/498/problem/A Description Crazy Town is a plane on ...

  4. Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配

    题目链接: http://codeforces.com/problemset/problem/498/C C. Array and Operations time limit per test1 se ...

  5. Codeforces Round #284 (Div. 2) C题(计算几何)解题报告

    题目地址 简要题意: 给出两个点的坐标,以及一些一般直线方程Ax+B+C=0的A.B.C,这些直线作为街道,求从一点走到另一点需要跨越的街道数.(两点都不在街道上) 思路分析: 从一点到另一点必须要跨 ...

  6. Codeforces Round #284 (Div. 1) C. Array and Operations 二分图匹配

    因为只有奇偶之间有操作, 可以看出是二分图, 然后拆质因子, 二分图最大匹配求答案就好啦. #include<bits/stdc++.h> #define LL long long #de ...

  7. Codeforces Round #284 (Div. 2) D. Name That Tune [概率dp]

    D. Name That Tune time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. Codeforces Round #284 (Div. 1) B. Name That Tune(概率DP)(难)

    B. Name That Tune time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. Codeforces Round #284 (Div. 2) A

    解题思路:给出 n个电影的精彩时段(a[i],b[i]),和每次可以跳过的时间x,问要看完所有的精彩时刻,至少需要看多长时间的电影. 因为要时间最少,所有除了精彩时刻的电影则能跳过就跳过(用取余来算) ...

随机推荐

  1. nRF51822之WDT浅析

    看门狗定时器 NRF51822 的看门狗定时器是倒计数器, 当计数值减少到 0 时产生 TIMEOUT 事件. 通过 START task 来启动看门狗定时器. 看门狗定时器启动时,如没有其他 32. ...

  2. SQL查询一周内过生日的用户

    SELECT birthday, )) + '-' + )) + '-' + )) AS datetime) AS Nbirthday FROM CRM_Customer WHERE birthday ...

  3. php--数据库三范式

    关系数据库的几种设计范式介绍1.第一范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据 ...

  4. EF6 CodeFirst 启用Migration,常用命令

    Enable-Migrations –EnableAutomaticMigrationsAdd-Migration [MigrationName] [-Force]Update-Database –T ...

  5. readonly=“readonly”与readonly=“true”

    <input id="u" readonly /> <input id="u" readonly="readonly" / ...

  6. 设计模式:迭代器模式(Iterator)

    定  义:提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部元素. C#中实现,foreach 遍历

  7. SVN命令详解

    在开发中,除了在本机文件夹上进行svn更新外,在命令行中进行svn操作也非常关键,下面列举下网站摘抄的一些文档:1.将文件checkout到本地目录 svn checkout path(path是服务 ...

  8. java调用Http请求 -HttpURLConnection学习

    最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放 ...

  9. 从输入url到页面加载完成都发生了什么?

    原文地址: http://segmentfault.com/a/1190000003925803 根据 URL 请求页面过程 过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 IP 地址与服务 ...

  10. Android开发-修改AVD路径

    最近清理系统的时候发现C盘下有个.android文件夹占了大概10G的空间,这可怎么办,后来证实是AVD的缘故,只能修改AVD路径了. 以下是修改AVD路径的方法: 1.创建新的环境变量,ANDROI ...