A. Artwork

倒过来并查集维护即可。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1111;
int n,m,q,i,j,ce;
bool black[N][N];
bool v[N*N];
int f[N*N];
int res;
int ans[N*N],id[N][N],cnt;
struct P{
int x,y;
P(){}
P(int _x,int _y){x=_x,y=_y;}
}e[2222222];
void gao(){
int A,B,C,D;
scanf("%d%d%d%d",&A,&B,&C,&D);
if(A==C){
if(B>D)swap(B,D);
for(int i=B;i<=D;i++)if(!black[A][i])e[++ce]=P(A,i),black[A][i]=1;
}else{
if(A>C)swap(A,C);
for(int i=A;i<=C;i++)if(!black[i][B])e[++ce]=P(i,B),black[i][B]=1;
}
}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
inline void merge(int x,int y){
if(!x||!y)return;
if(!v[x]||!v[y])return;
if(F(x)!=F(y))res--,f[f[x]]=f[y];
}
inline void wake(int x,int y){
v[id[x][y]]=1;
res++;
merge(id[x][y],id[x-1][y]);
merge(id[x][y],id[x+1][y]);
merge(id[x][y],id[x][y-1]);
merge(id[x][y],id[x][y+1]);
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<=q;i++){
gao();
e[++ce]=P(0,i);
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++){
id[i][j]=++cnt;
f[cnt]=cnt;
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(!black[i][j])wake(i,j);
for(i=ce;i;i--){
if(e[i].x)wake(e[i].x,e[i].y);
else ans[e[i].y]=res;
}
for(i=1;i<=q;i++)printf("%d\n",ans[i]);
}

  

B. Bless You Autocorrect!

将字典和询问串都插入Trie中,建好图然后BFS即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1100010;
int n,m,i,j,x,pos[111111],ask[111111];
int tot=1,f[N],id[N],son[N][26];
int d[N],q[N],h,t;
char s[N];
inline int ins0(int p){
scanf("%s",s);
int len=strlen(s);
int x=1,i=0,w;
for(i=0;i<len;i++){
w=s[i]-'a';
if(!son[x][w]){
son[x][w]=++tot;
f[tot]=x;
id[tot]=p;
}
x=son[x][w];
}
return x;
}
inline int ins1(){
scanf("%s",s);
int len=strlen(s);
int x=1,i=0,w;
for(i=0;i<len;i++){
w=s[i]-'a';
if(!son[x][w]){
son[x][w]=++tot;
f[tot]=x;
}
x=son[x][w];
}
return x;
}
inline void ext(int x,int y){
if(!x||d[x])return;
d[x]=y;
q[++t]=x;
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
pos[i]=ins0(i);
}
for(i=1;i<=m;i++){
ask[i]=ins1();
}
for(i=1;i<=tot;i++)id[i]=pos[id[i]];
h=1,t=0;
ext(1,1);
while(h<=t){
x=q[h++];
ext(f[x],d[x]+1);
ext(id[x],d[x]+1);
for(i=0;i<26;i++)ext(son[x][i],d[x]+1);
}
for(i=1;i<=m;i++)printf("%d\n",d[ask[i]]-1);
}

  

C. Card Hand Sorting

枚举花色的顺序以及升降序,那么此时最小移动次数$=n-LIS$。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pi;
int n;
string hs="shdc";
pi a[77],b[77];
int rev[333];
int idx[66];
int p[10];
int done[66];
int cmp(int x,int y){
return b[x]<b[y];
}
int dp[555];
int solve(int mask){
for(int i=0;i<n;i++){
b[i]=a[i];
if(mask>>b[i].first&1){
b[i].second=16-b[i].second;
}
b[i].first=p[b[i].first];
}
for(int i=0;i<n;i++)idx[i]=i;
sort(idx,idx+n,cmp);
int ret=0; for(int i=0;i<n;i++){
dp[i]=0;
for(int j=0;j<i;j++)if(idx[j]<idx[i])dp[i]=max(dp[i],dp[j]);
dp[i]++;
ret=max(ret,dp[i]);
} /*for(int i=0;i<n;i++)done[i]=0;
for(int i=0,cur=0;i<n;i++){
while(cur<n&&done[cur])cur++;
if(cur==idx[i]){
cur++;
}
else{
ret++;
}
done[idx[i]]=1;
}*/
return n-ret;
}
int getnum(char c){
if(c>='2'&&c<='9')return c-'0';
if(c=='T')return 10;
if(c=='J')return 11;
if(c=='Q')return 12;
if(c=='K')return 13;
return 14;
}
int main(){
for(int i=0;i<4;i++)rev[hs[i]]=i;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
char ss[10];
scanf("%s",ss);
a[i]=pi(rev[ss[1]],getnum(ss[0]));
}
int ans=1e9;
for(int mask=0;mask<1<<4;mask++){
for(int i=0;i<4;i++)p[i]=i;
do{
ans=min(ans,solve(mask));
}while(next_permutation(p,p+4));
}
printf("%d\n",ans);
}
}

  

D. Daydreaming Stockbroker

设$f[i][j]$表示第$i$天结束时有$j$个商品,手上最多有多少钱,要么什么也不做,要么全部卖掉,要么全部买入。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
const ll inf=1LL<<60;
int n,m,i,j,x;ll f[N],g[N];
inline void up(ll&a,ll b){if(a<b)a=b;}
int main(){
scanf("%d",&n);
m=100000;
for(i=1;i<=m;i++)f[i]=-inf;
f[0]=100;
while(n--){
scanf("%d",&x);
for(i=0;i<=m;i++)g[i]=f[i];
for(i=0;i<=m;i++)if(f[i]>=0){
//all sell
up(g[0],f[i]+x*i);
//all buy
ll t=min(f[i]/x,100000LL-i);
up(g[i+t],f[i]-x*t);
}
for(i=0;i<=m;i++)f[i]=g[i];
}
printf("%lld",f[0]);
}

  

E. Exponial

根据欧拉定理迭代计算即可。

#include<cstdio>
#include<vector>
using namespace std;
const int Maxn=1000020; int powmod(int x,int y,int mod){
int ret=1%mod;
while(y){
if(y&1){
ret=1LL*ret*x%mod;
}
y>>=1;
x=1LL*x*x%mod;
}
return ret;
}
int rel(int x){
if(x==4)return powmod(4,9,10000000);
if(x==3)return 9;
if(x==2)return 2;
return 1;
}
bool isp[Maxn];
vector<int>pri;
void pre(){
for(int i=2;i<Maxn;i++){
if(!isp[i])pri.push_back(i);
for(int j=0;j<pri.size();j++){
if(1LL*pri[j]*i>=Maxn)break;
isp[pri[j]*i]=1;
if(i%pri[j]==0)break;
}
}
}
int phi(int x){
if(x==1)return 1;
int cur=x;
for(int i=0;i<pri.size()&&1LL*pri[i]*pri[i]<=cur;i++){
if(cur%pri[i]==0){
// printf("p=%d\n",pri[i]);
x=x/pri[i]*(pri[i]-1);
while(cur%pri[i]==0)cur/=pri[i];
}
}
if(cur>1)x=x/cur*(cur-1);
return x;
}
int solve(int n,int m){
if(n==1)return 1%m;
if(m==1)return 0;
if(n<=5){
return powmod(n,rel(n-1),m);
}
int tmp=phi(m); // printf("m=%d phi=%d\n",m,tmp);
return powmod(n,solve(n-1,tmp)+tmp,m);
}
int main(){
pre();
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
printf("%d\n",solve(n,m));
}
}

  

F. Fleecing the Raffle

从小到大枚举作弊的票数,一旦发现解变劣则退出。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pi; int n , p ; int main () {
scanf ( "%d%d" , &n , &p ) ;
double ans = 1.0 * p / ( n + 1 ) ;
for ( int i = 2 ; ; ++ i ) {
double tmp = ans * i / ( i - 1 ) * ( n - p + i ) / ( n + i ) ;
if ( tmp < ans ) break ;
ans = tmp ;
}
printf ( "%.10f\n" , ans ) ;
return 0 ;
}

  

G. Game Rank

按题意模拟即可。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pi;
char s[20000];
int tot[111];
int main(){
for(int i=1;i<=10;i++){
tot[i]=5;
}
for(int i=11;i<=15;i++){
tot[i]=4;
} for(int i=16;i<=20;i++){
tot[i]=3;
} for(int i=21;i<=25;i++){
tot[i]=2;
}
while(scanf("%s",s)!=EOF){
int level=25;
int star=0;
int lx=0;
for(int i=0;s[i];i++){
if(level==0)continue;
if(s[i]=='W'){
lx++;
int bonus=0;
if(level>=6&&level<=25&&lx>=3)bonus=1; star++;
if(star>tot[level]){
star=1;
level--;
}
if(bonus&&level>0){
star++;
if(star>tot[level]){
star=1;
level--;
}
}
}
else{
lx=0;
if(((level!=20)||(star!=0))&&level<=20){
star--;
if(star<0){
level++;
star=tot[level]-1;
}
}
}
}
if(level==0)puts("Legend");
else
printf("%d\n",level);
}
}

  

H. Highest Tower

等价于给每个矩形确定一个独一无二的底边长,最大化高的和。

对于每个矩形$(a,b)$,在$a-b$之间建一条边,若方向是$a->b$则代表底边是$a$,高是$b$。

那么一组可行解中每个点最多只有一条出边。

考虑每个连通块,首先每个点会贡献$(deg[i]-1)\times val[i]$,其次若这个连通块是棵树,那么选取$val$最大的点作为根可以额外得到$val$的收益。

时间复杂度$O(n\log n)$。

#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=500010,inf=~0U>>1;
int n,m,i,x,y;
int val[N],d[N],g[N],v[N],nxt[N],ed,ma,sum;bool vis[N];
long long ans;
map<int,int>idx;
inline void add(int x,int y){d[x]++;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void dfs(int x){
if(vis[x])return;
vis[x]=1;
ma=max(ma,val[x]);
ans+=1LL*val[x]*(d[x]-1);
sum+=d[x]-2;
for(int i=g[x];i;i=nxt[i])dfs(v[i]);
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&x,&y);
if(!idx[x]){
idx[x]=++m;
val[m]=x;
}
if(!idx[y]){
idx[y]=++m;
val[m]=y;
}
x=idx[x];
y=idx[y];
add(x,y);
add(y,x);
}
for(i=1;i<=m;i++)if(!vis[i]){
ma=sum=0;
dfs(i);
if(sum<0)ans+=ma;
}
printf("%lld",ans);
}

  

I. Interception

留坑。

J. Jumbled Compass

按题意模拟即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
int t1=b-a;
if(t1<0)t1+=360; int t2=a-b;
if(t2<0)t2+=360;
if(t1<=t2){
printf("%d\n",t1);
}
else{
printf("%d\n",-t2);
}
}
}

K. Keeping the Dogs Apart

按照到达转折点的时刻将时间分为$O(n+m)$段区间,在每段中用$B$的速度减去$A$的速度,然后求$A$到线段$B$的最短距离即可。

时间复杂度$O(n)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m,i;
double ans;
const double eps=1e-9;
struct P{
double x,y;
P(){}
P(double _x,double _y){x=_x,y=_y;}
P operator+(const P&b){return P(x+b.x,y+b.y);}
P operator-(const P&b){return P(x-b.x,y-b.y);}
double len(){return sqrt(x*x+y*y);}
void read(){
scanf("%lf%lf",&x,&y);
}
P operator*(double b){return P(x*b,y*b);}
P operator/(double b){return P(x/b,y/b);}
double operator*(const P&b){return x*b.x+y*b.y;}
}a[N],b[N];
inline int sgn(double x){
if(x>eps)return 1;
if(x<-eps)return -1;
return 0;
}
inline double dis(P a,P b){return (a-b).len();}
inline double cross(P a,P b){return a.x*b.y-a.y*b.x;}
inline double ask(P p,P a,P b){
if((b-a).len()>eps&&sgn((p-a)*(b-a))>=0&&sgn((p-b)*(a-b))>=0)
return fabs(cross(p-a,b-a)/(b-a).len());
return min((p-a).len(),(p-b).len());
}
inline void cal(P A,P B,P C,P D,double z){//z is distance
if(z<eps)return;
P va=B-A;
va=va/va.len();
P vb=D-C;
vb=vb/vb.len();
vb=vb-va;
ans=min(ans,ask(A,C,C+(vb*z)));
}
P lerp(P a,P b,double t){return a*(1.0-t)+b*t;}
void work(){
int i=2,j=2;//nxt
P A=a[1],B=b[1];
while(i<=n&&j<=m){
ans=min(ans,dis(A,B));
double x=dis(A,a[i]),y=dis(B,b[j]);
cal(A,a[i],B,b[j],min(x,y));
if(sgn(x-y)==0){
A=a[i++];
B=b[j++];
continue;
}
if(x<y){
A=a[i++];
B=lerp(B,b[j],x/y);
}else{
B=b[j++];
A=lerp(A,a[i],y/x);
}
}
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)a[i].read();
scanf("%d",&m);
for(i=1;i<=m;i++)b[i].read();
ans=dis(a[1],b[1]);
work();
printf("%.13f",ans);
}

  

Urozero Autumn 2016. NCPC 2016的更多相关文章

  1. 【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees

    发现由于角的度数和边的长度有限制,那俩圆如果放得下的话,必然是塞在两个角里. 于是预处理n个圆心的位置(注意要判断那个圆会不会和其他的边界相交),然后n^2枚举俩角即可. #include<cs ...

  2. 【枚举】【SPFA】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem I. Iron and Coal

    那个人派出的队伍的行走的路径一定前半程是重合的,后半程分叉开来. 于是预处理每个点离1号点的最短路,到最近的铁的最短路,到最近的煤的最短路.(三次BFS / SPFA)然后枚举分岔点,尝试更新答案即可 ...

  3. 【二分】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem C. Careful Ascent

    二分Vx即可. #include<cstdio> #include<algorithm> using namespace std; #define EPS 0.00000000 ...

  4. 【强连通分量缩点】【DFS】【动态规划】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem B. British Menu

    有向图,不经过重复点的最长链,强连通分量大小不超过5. 每个强连通分量内部暴力预处理任意两对点之间的最长路,外面DAG上dp. 不是很好写,但是预处理完了之后,可以重构每个强连通分量内部的结构,然后整 ...

  5. PHPStorm 2016.2 - 2016.3许可证服务器

    最快,最安全的选择,以激活您的PHPStorm 2016.2 - 2016.3,这是足够的激活服务器,软件将自动激活.该过程将不断更新,如果不工作评价写入,如果有,以激活没有列出的服务器也可以说. 通 ...

  6. Windows Server 2016 + SCO 2016 安装及配置介绍

    Windows Server 2016 + SCO 2016 安装及配置介绍 高文龙关注1人评论6332人阅读2017-02-26 23:23:02 Windows Server 2016 + SCO ...

  7. Urozero Autumn 2016. BAPC 2016

    A. Airport Logistics 根据光路最快原理以及斯涅尔定律,可以得到从定点$P$进入某条直线的最佳入射角. 求出每个端点到每条线段的最佳点,建图求最短路即可. 时间复杂度$O(n^2\l ...

  8. Urozero Autumn 2016. UKIEPC 2016

    B. Build a Boat 首先求出每块船舱的面积$S$,然后进行$m$次二分,得到每个切割线的位置. 为了计算某个切割线形成的区域的面积,需要将多边形整理成上边界和下边界,分别二分出断点位置,中 ...

  9. Game Rank(NCPC 2016 大模拟)

    题目: The gaming company Sandstorm is developing an online two player game. You have been asked to imp ...

随机推荐

  1. (二叉树 递归) leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  2. mysql快速生成批量测试数据

    mysql快速生成批量测试数据 参考资料: https://blog.csdn.net/oahz4699092zhao/article/details/53332148 -- 创建一个临时内存表 ; ...

  3. Redis扩展机制

    Redis扩展机制扫盲 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Redis的Avalibility解决方案有很多,比如Twemproxy,Codis, 一.Twempro ...

  4. module 'pip' has no attribute 'main'

    摘录自:http://www.cnblogs.com/Fordestiny/p/8901100.html 问题分析: 问题解决: 找到安装目录下 helpers/packaging_tool.py文件 ...

  5. VMware 设置网络

    在VMware上安装 系统完成后,设置虚拟网络 这里的VMware 版本为 14. 本文以window server 2016 为例. 在虚拟机上菜单栏中, 编辑  >> 虚拟网络编辑器 ...

  6. 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较

    一. 面向对象思想 1. 面向过程(OP)和面向对象(OO)的区别: (1):面向过程就是排着用最简单的代码一步一步写下去,没有封装,当业务复杂的时候,改动就很麻烦了 (2):面向对象将复杂的业务分离 ...

  7. 用juery的ajax方法调用aspx.cs页面中的webmethod方法

    首先在 aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性. 如: [WebMethod] public static string GetUserName() { //.... ...

  8. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  9. ES进阶--04

    第30节彻底掌握IK中文分词_上机动手实战IK中文分词器的安装和使用 之前大家会发现,我们全部是用英文在玩儿...好玩儿不好玩儿...不好玩儿 中国人,其实我们用来进行搜索的,绝大多数,都是中文应用, ...

  10. Python-Django 视图层

    1 request对象 method:请求方式 GET:get请求的参数(post请求,也可以携带参数) POST:post请求的参数(本质是从bdoy中取出来,放到里面了) COOKIES---&g ...