2017萧山第5场(2016 Pacific Northwest - Division 1)
B:Buggy Robot
【题意】
一个n*m的地图(1≤n, m≤50),有一个入口和一个出口。给定一个命令序列(上,下,左,右),如果碰到障碍或者边际就忽略。问至少加入或删除多少个的命令,使得能从入口走到出口。
【题解】
f[i][j][k]表示在位置(i,j),匹配到命令序列的第k项,至少加入或删除多少个的命令。
D:Contest Strategy
【题意】
一场ACM有n题,做第i题要$t_i$的时间。
有n!种读题顺序,做题策略是这样的:
1.先随机读k道题;
2.在读过的题中做用时最少的题(有多个就随便选一个)
3.从没读过的题中随机选一题(如果有的话)
4.如果还有题没有做,跳到步骤2
求n!种情况的罚时之和。
【题解】
这道题可以做到O(n)(不算排序)
容易知道第i个做出来的题系数为n-i+1
容易知道最后做出来的k-1道题一定是用时前k-1大的。
我们从后往前考虑。
先把时间从大到小排序。
改一下规则,如果在读过的题中有多个用时最少,选下标最大的。
记f[i]表示只考虑前i道题时的答案。
f[1]=t[1]
当1<i<=k时,
$f[i]=f[i-1]*i+i!*t[i]*i$
当k<i<=n时,
这道题如果一旦被读过,就一定会立刻做。
我们要算这道题的贡献和它造成其他题罚时的增量。
分两种情况考虑,
1)这道题是第1道做出来的题
2)这道题是第2...i-k+1道做出来的题目
看程序注释
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime> using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(fabs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=;
const int MOD=; int n,k;
LL t[maxn],s[maxn],fact[maxn],f[maxn]; bool cmp(LL a,LL b){return a>b;} int main()
{
freopen("D.in","r",stdin);
int i;
n=gint();k=gint();
re(i,,n)t[i]=gint();
sort(t+,t+n+,cmp);
re(i,,n)s[i]=(s[i-]+t[i])%MOD;
fact[]=;re(i,,n)fact[i]=fact[i-]*i%MOD;
LL temp=;
re(i,,k-)(temp+=t[i]*i)%=MOD;
f[]=t[];
re(i,,k)f[i]=(f[i-]*i%MOD+fact[i]*t[i]%MOD*i%MOD)%MOD;
re(i,k+,n)
{
f[i]=f[i-]*i%MOD;
(f[i]+=fact[i-]*k%MOD*t[i]%MOD*i%MOD)%=MOD;//这道题是第1道做出来的题
//这道题是第2...i-k+1道做出来的题目
(f[i]+=fact[i-]*(i-+k)*(i-k)/%MOD*t[i]%MOD)%=MOD;//这道题的贡献
(f[i]+=f[i-]-(temp+(s[i-]-s[k-])*(k-))*fact[i-]%MOD)%=MOD;//它造成其他题罚时的增量
}
cout<<(f[n]%MOD+MOD)%MOD<<endl;
return ;
}
E:Enclosure
【题意】
给定n个点,问用前k个点与剩下的n-k个点建一个凸包,最大面积是多少。
【题解】
建大小两个凸包。大凸包用n个点建,小凸包用前k个点建。
然后在大凸包上跑就行了。
输出时不能强行转成double。
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime> using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(fabs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=; int n,k;
struct Tp
{
LL x,y;
friend LL operator *(Tp p1,Tp p2){return p1.x*p2.y-p2.x*p1.y;}
}p[maxn]; bool cmp(Tp a,Tp b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
LL det(Tp p0,Tp p1,Tp p2){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);} Tp sta[maxn];int top;
void graham(Tp *p,int n)
{
int i;
top=;
sort(p+,p+n+,cmp);
re(i,,n)
{
while(top> && det(sta[top-],sta[top],p[i])<=)top--;
sta[++top]=p[i];
}
int d=top;
red(i,n,)
{
while(top>d && det(sta[top-],sta[top],p[i])<=)top--;
sta[++top]=p[i];
}
top--;
} Tp q[maxn];int m;
#define L(x) (x==1?m:x-1)
#define R(x) (x==m?1:x+1)
LL solve()
{
int i;
LL S=;
q[m+]=q[];
re(i,,m)S+=q[i]*q[i+];
LL res=S,tmp=;
int l=,r=;
while(det(sta[],q[l],q[L(l)])>=)tmp+=det(q[L(l)],q[l],q[r]),l=L(l);
re(i,,top)
{
while(det(q[r],q[R(r)],sta[i])<=)tmp+=det(q[l],q[r],q[R(r)]),r=R(r);
while(det(q[l],q[R(l)],sta[i])>)tmp-=det(q[l],q[R(l)],q[r]),l=R(l);
upmax(res,S-tmp+det(sta[i],q[r],q[l]));
}
return res;
} int main()
{
freopen("E.in","r",stdin);
freopen("E.out","w",stdout);
int i;
n=gint();k=gint();
re(i,,n)p[i].x=gint(),p[i].y=gint();
graham(p,k);
m=top;
re(i,,m)q[i]=sta[i];
graham(p,n);
LL ans=solve();
cout<<(ans>>);
if(ans&)puts(".5");else puts(".0");
return ;
}
H:Paint
【题意】
一个n*n的棋盘上,有l盏灯。每盏灯可以选择在横向或者纵向的方向照,延伸范围为r。
如果一个空格在横向上被超过1盏灯照,或者在纵向上被超过1盏灯照,那么鬼就会被吓跑。
问是否存在一种方案使得鬼不会被吓跑。
【题解】
2-SAT。
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime> using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(fabs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=; int n,r,l;
int x[maxn],y[maxn]; int now,info[*maxn];
struct Tedge{int v,next;}edge[*maxn*maxn]; void add(int u,int v)
{
edge[++now]=(Tedge){v,info[u]};info[u]=now;
u^=;v^=;
edge[++now]=(Tedge){u,info[v]};info[v]=now;
} int cnt,dfn[*maxn],low[*maxn];
int top,sta[*maxn],vis[*maxn];
int tot,id[*maxn];
void dfs(int u)
{
dfn[u]=low[u]=++cnt;
vis[sta[++top]=u]=;
int i,v;
for(i=info[u],v=edge[i].v;i!=-;i=edge[i].next,v=edge[i].v)
if(!dfn[v])
dfs(v),upmin(low[u],low[v]);
else
if(vis[v])upmin(low[u],dfn[v]);
if(dfn[u]==low[u])
{
tot++;
while(){vis[sta[top]]=;id[sta[top--]]=tot;if(sta[top+]==u)break;}
}
} int main()
{
freopen("H.in","r",stdin);
int i,j;
n=gint();r=gint();l=gint();
re(i,,l)x[i]=gint(),y[i]=gint();
mmst(info,-);now=-;
re(i,,l)re(j,,i-)
{
if(x[i]==x[j] && abs(y[i]-y[j])<=*r)add(i<<,j<<|);
if(y[i]==y[j] && abs(x[i]-x[j])<=*r)add(i<<|,j<<);
}
re(i,,*l)if(!dfn[i])dfs(i);
re(i,,l)if(id[i<<]==id[i<<|]){printf("NO\n");return ;}
printf("YES\n");
return ;
}
G:Maximum Islands
【题意】
一块n*m的地图(1≤n, m≤40),有一些点是陆地“L”,有一些点是海洋“W”,还有一些未确定“C”。求出一种方案,使得把所有“C”变成“L”或者“W”后,陆地连通块的个数最大。
【题解】
首先,确定两点:
与“L”的“C”一定不会变成陆地“L”;
新生成的陆地面积一定是1*1
由相邻格子之间相互排斥可以奇偶二分图和最大独立集。
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
#include<bits/stdc++.h>
#include<ctime>
#include<ext/rope> using namespace __gnu_cxx;
using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef pair<DB,DB> PDD;
typedef complex<DB> CP;
typedef vector<int> VI; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define two(k) (1<<(k))
#define SZ(x) (int(x.size()))
#define all(x) (x).begin(),(x).end()
#define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i])
#define ls (rt<<1)
#define rs (rt<<1|1)
#define MID ((l+r)>>1) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); //void enlargestack(){int size=256<<10;char *p=(char*)malloc(size)+size;__asm__("movl %0, %%esp\n"::"r"(p));} int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=(res<<)+(res<<)+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=;
const int dx[]={,,,-};
const int dy[]={,-,,}; int n,m;
char s[maxn][maxn]; int vis[maxn][maxn];
void dfs(int x,int y)
{
vis[x][y]=;
int i;
re(i,,)
{
int tx=x+dx[i],ty=y+dy[i];
if(s[tx][ty]=='L' && !vis[tx][ty])dfs(tx,ty);
}
} int ok[maxn][maxn];
int check(int x,int y)
{
if(s[x][y]!='C')return ;
int i;
re(i,,)
{
int tx=x+dx[i],ty=y+dy[i];
if(s[tx][ty]=='L')return ;
}
return ;
} int a,b,id[maxn][maxn];
int info[maxn*maxn],now;
struct Tedge{int v,next;}edge[maxn*maxn*];
int link[maxn*maxn];
int flag[maxn*maxn]; void add(int u,int v){edge[++now]=(Tedge){v,info[u]};info[u]=now;} int dfs2(int u)
{
int i,v;
for(i=info[u],v=edge[i].v;i!=-;i=edge[i].next,v=edge[i].v)if(!flag[v])
{
flag[v]=;
if(!link[v] || dfs2(link[v])){link[v]=u;return ;}
}
return ;
}
int main()
{
freopen("G.in","r",stdin);
freopen("G.out","w",stdout);
int i,j,k;
n=gint();m=gint();
re(i,,n)scanf("%s\n",s[i]+);
int ans=;
re(i,,n)re(j,,m)if(s[i][j]=='L' && !vis[i][j])ans++,dfs(i,j);
re(i,,n)re(j,,m)ok[i][j]=check(i,j);
re(i,,n)re(j,,m)if(ok[i][j])
if (((i+j)&)==)id[i][j]=++a; else id[i][j]=++b;
mmst(info,-);now=-;
re(i,,n)re(j,,m)if(ok[i][j])
if(((i+j)&)==)
re(k,,)
{
int tx=i+dx[k],ty=j+dy[k];
if(ok[tx][ty])add(id[i][j],id[tx][ty]);
}
int res=;
re(i,,a)
{
re(j,,b)flag[j]=;
res+=dfs2(i);
}
ans+=a+b-res;
cout<<ans<<endl;
return ;
}
2017萧山第5场(2016 Pacific Northwest - Division 1)的更多相关文章
- 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits ...
- 2018 ICPC Pacific Northwest Regional Contest I-Inversions 题解
题目链接: 2018 ICPC Pacific Northwest Regional Contest - I-Inversions 题意 给出一个长度为\(n\)的序列,其中的数字介于0-k之间,为0 ...
- 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) S Surf
SurfNow that you've come to Florida and taken up surng, you love it! Of course, you've realized that ...
- 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) K Tournament Wins
题目链接:http://codeforces.com/gym/101201 /* * @Author: lyucheng * @Date: 2017-10-22 14:38:52 * @Last Mo ...
- 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution
A:Alphabet Solved. 签. #include<bits/stdc++.h> using namespace std; ]; ]; int main(){ scanf(); ...
- 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Problem K Tournament Wins
Problem K — limit 1 second Tournament Wins 这个题就是有2^n队伍,他现在的实力水平是第k位,采用的是淘汰制 问一下你他的胜场数的期望 这人能 win> ...
- 【进阶——最小费用最大流】hdu 1533 Going Home (费用流)Pacific Northwest 2004
题意: 给一个n*m的矩阵,其中由k个人和k个房子,给每个人匹配一个不同的房子,要求所有人走过的曼哈顿距离之和最短. 输入: 多组输入数据. 每组输入数据第一行是两个整型n, m,表示矩阵的长和宽. ...
- [CFgym]2015-2016 ACM-ICPC Pacific Northwest Regional Contest小结
*感谢两位浙江大佬带我飞 贴下成绩 div2 div1 *div2不是我打的上个厕所就5/11了 比赛小结 A [题目大意] 有n(n<=500)个机场,两两之间距离是g[i][j],每经停一个 ...
- 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
A. Odd Palindrome 所有回文子串长度都是奇数等价于不存在长度为$2$的偶回文子串,即相邻两个字符都不同. #include<cstdio> #include<cstr ...
随机推荐
- phantomjsDriver的初始化
public static void main(String[] args) { File file=new File("src/main/resources/drivers"); ...
- js仿QQ拖拽删除
原生js实现仿QQ拖拽删除交互,无需任何依赖. 项目演示请看这里, gitHub请移步这里. 由于源码很长,所以贴到最下面了. 效果截图如下: 核心思想呢,就是点击圆点的时候全屏覆盖个canvas,在 ...
- 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...
- 使用URLConnection发送http请求实现简单爬虫(可以配置代理)
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...
- PE文件解析 基础篇
PE文件解析 基础篇 来源 https://bbs.pediy.com/thread-247114.htm 前言 之前学习了PE格式,为了更好的理解,决定写一个类似LoadPE的小工具. 编译器是VS ...
- ORA-01410: 无效的 ROWID
视图查询单表是有这个东西的,但是视图的SQL涉及多表关联,就没这个rowid了,要么自己写个,要么不用这个ROWID做啥动作
- Vue里边接口访问Post、Get
原文地址: http://www.cnblogs.com/JimmyBright/p/7356502.html 通常js里面都用ajax来和服务器交换数据,Vue里边当然也可以用ajax,ajax是基 ...
- 点击--》java9 新特性 详解
引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...
- kindeditor<=4.1.5上传漏洞复现
0x00 漏洞描述 漏洞存在于kindeditor编辑器里,你能上传.txt和.html文件,支持php/asp/jsp/asp.net,漏洞存在于小于等于kindeditor4.1.5编辑器中 这里 ...
- java随机数的有趣用法
直接用代码说明,比较容易理解 package com.wz.other; import java.util.Random;import java.util.concurrent.ThreadLocal ...