题目链接:https://vjudge.net/contest/147102#overview

  A题:给出一堆的点,要找出两条垂直的直线,一条与x轴呈45度。-->使得所有的点到任意一条直线的最短曼哈顿距离(具体见题意描述)的最大值最小。做法是先把坐标轴逆时针旋转45度,x'=(x-y)/sqrt2, y'=(x+y)/sqrt2。然后我们把最短曼哈顿距离和最短点到直线距离做个转化,求后者,然后乘sqrt2可以得到前者。因此最后的x'=x-y,y'=x+y。之后,二分答案mid,用一条竖着的线,管辖左右不超过mid距离的点,其他的点归横着的线管辖即可。具体做法见代码,用两条竖着的线去O(n)扫描即可。代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <set>
using namespace std;
const int N = + ;
const int inf = 2e9;
typedef pair<int,int> pii; int n;
pii p[N];
int pre_min[N], aft_min[N], pre_max[N], aft_max[N]; void init()
{
pre_min[] = pre_max[] = p[].second;
for(int i=;i<=n;i++)
{
pre_min[i] = min(pre_min[i-], p[i].second);
pre_max[i] = max(pre_max[i-], p[i].second);
}
aft_min[n] = aft_max[n] = p[n].second;
for(int i=n-;i>=;i--)
{
aft_min[i] = min(aft_min[i+], p[i].second);
aft_max[i] = max(aft_max[i+], p[i].second);
}
} bool solve(double mid)
{
//if((double)(p[n].first-p[1].first) <= 2.0*mid) return 1;
int j = ;
for(int i=;i<=n;i++)
{
//int j = i + 1;
while(j <= n && 1.0*(p[j].first-p[i].first) <= 2.0*mid) j++;
if(i == && j == n+) return ;
int maxx = -inf, minn = inf;
if(i > )
{
maxx = max(maxx, pre_max[i-]);
minn = min(minn, pre_min[i-]);
}
if(j <= n)
{
maxx = max(maxx, aft_max[j]);
minn = min(minn, aft_min[j]);
}
if(1.0*(maxx - minn) <= 2.0*mid) return ;
//i = j;
}
return ;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x,y;
scanf("%d%d",&x, &y);
p[i].first = x - y;
p[i].second = x + y;
}
sort(p+,p++n);
init();
double L = 0.0, R = inf;
int cnt = ;
while(cnt--)
{
double mid = (L + R) / 2.0;
if(solve(mid)) R = mid;
else L = mid;
}
printf("%.15f\n",R);
return ;
}

  B题,只要找出最高的不同的一位,从这一位到最低位全部变成1的对应的那个数字就是答案。

  C题,矩阵快速幂,矩阵的(i,j)位置表示余数从i变成i变成j的方案数,然后对这个矩阵进行b的幂次即可。代码如下(下面的代码,因为我的矩阵模板不是从0开始的,然而余数有0的可能,因此全部位移加1):

 #include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <map>
#include <set>
#include <iostream>
#include <string.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod = 1e9+; //int mod;
int n,b,k,x; void add(int &a,int b)
{
a += b;
if(a < ) a += mod;
//if(a >= mod) a -= mod;
a %= mod;
} struct matrix
{
int e[+][+],n,m;
matrix() {}
matrix(int _n,int _m): n(_n),m(_m) {memset(e,,sizeof(e));}
matrix operator * (const matrix &temp)const
{
matrix ret = matrix(n,temp.m);
for(int i=;i<=ret.n;i++)
{
for(int j=;j<=ret.m;j++)
{
for(int k=;k<=m;k++)
{
add(ret.e[i][j],1LL*e[i][k]*temp.e[k][j]%mod);
}
}
}
return ret;
}
matrix operator + (const matrix &temp)const
{
matrix ret = matrix(n,m);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
add(ret.e[i][j],(e[i][j]+temp.e[i][j])%mod);
}
}
return ret;
}
void getE()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
e[i][j] = i==j?:;
}
}
}
}; matrix qpow(matrix temp,int x)
{
int sz = temp.n;
matrix base = matrix(sz,sz);
base.getE();
while(x)
{
if(x & ) base = base * temp;
x >>= ;
temp = temp * temp;
}
return base;
} void print(matrix p)
{
int n = p.n;
int m = p.m;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
printf("%d ",p.e[i][j]);
}
cout << endl;
}
} int cnt[]; int main()
{
cin >> n >> b >> k >> x;
for(int i=;i<=n;i++) {int t;scanf("%d",&t);cnt[t]++;}
matrix ans = matrix(x,x);
for(int i=;i<=x;i++)
{
for(int j=;j<=;j++)
{
add(ans.e[i][((i-)*+j)%x+], cnt[j]);
}
}
ans = qpow(ans,b);
cout << ans.e[][k+] << endl;
return ;
}

  D题,考虑到m<n/2,那么总会有一个点,不在不能建的边内,那么找出这个点,其他点全部连接它即可(即假边建图,找出度为0的点即可)。

  E题,q次询问,每次找出[L, R]内,回文串的总个数。做法是区间dp。代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = + ; char s[N];
int dp[N][N];
int is[N][N]; int main()
{
scanf("%s",s+);
int n = strlen(s+);
for(int i=;i<=n;i++) {is[i][i] = dp[i][i] = ;}
for(int len=;len<=n;len++)
{
for(int i=;i+len-<=n;i++)
{
int j = i + len - ;
is[i][j] = s[i] == s[j] && (i+ <= j- ? is[i+][j-] : );
dp[i][j] = dp[i][j-] + dp[i+][j] - dp[i+][j-] + is[i][j];
}
}
int q;
scanf("%d",&q);
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",dp[l][r]);
}
return ;
}

2017 ZSTU寒假排位赛 #1的更多相关文章

  1. 2017 ZSTU寒假排位赛 #7

    题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...

  2. 2017 ZSTU寒假排位赛 #2

    题目链接:https://vjudge.net/contest/147632#overview. A题,状态压缩一下然后暴力即可. B题,水题,略过. C题,有负数,前缀和不是单调的,因此不能用尺取法 ...

  3. 2017 ZSTU寒假排位赛 #8

    题目链接:https://vjudge.net/contest/149845#overview. A题,水题. B题,给出 p个 第一个人的区间 和 q个第二个人的区间,问[l,r]中有多少个整数满足 ...

  4. 2017 ZSTU寒假排位赛 #6

    题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...

  5. 2017 ZSTU寒假排位赛 #5

    题目链接:https://vjudge.net/contest/148901#overview. A题,排序以后xjbg即可. B题,弄个数组记录当前列是不是删除以及当前行是不是已经大于下一行然后乱搞 ...

  6. 2017 ZSTU寒假排位赛 #4

    题目链接:https://vjudge.net/contest/148543#overview. A题:n个罪犯,每个人有一个犯罪值,现在要从里面选出连续的c个人,每个人的犯罪值都不能超过t,问选法的 ...

  7. 2017 ZSTU寒假排位赛 #3

    题目链接:https://vjudge.net/contest/147974#overview. A题,费用流,不会..跳过了. B题,给一个图,问至少添加几条边能成为强连通图.显然缩点,要使得成为一 ...

  8. Codeforces Round #341 (Div. 2)

    在家都变的懒惰了,好久没写题解了,补补CF 模拟 A - Wet Shark and Odd and Even #include <bits/stdc++.h> typedef long ...

  9. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

随机推荐

  1. log4j.properties文件的配置

    Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...

  2. linux服务器的操作禁忌

    1.linux系统是否支持开启SELINUX服务 我方linux系统的服务器不支持开启Selinux服务,如果开启了selinux服务,会导致系统异常并无法启动. 2.linux系统下能否开启NetW ...

  3. 2015 Multi-University Training Contest 6

    1001 Average 忍不住又补了一题. 只要枚举1与2之间1给2,2给1,什么都不做三种状态. 后面的情况都已经决定了. (估计只有我比赛的时候把a candy当成a个糖果了吧QAQ) # in ...

  4. Spring框架--AOP编程

    2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...

  5. linux yum安装mongodb

    1.yum -y install mongodb-server  mongodb 2.service mongod start                     #启动mongodb 服务 3. ...

  6. 十六、oracle 索引

    一.管理索引-原理介绍索引是用于加速数据存取的数据对象.合理的使用索引可以大大降低i/o次数,从而提高数据访问性能.索引有很多种我们主要介绍常用的几种:为什么添加了索引后,会加快查询速度呢? 二.创建 ...

  7. 快速破解ps方法

    1.首先现在ps安装包和破解包. 2.运行Block Adobe Activation,防止ADOBE激活程序启动,按操作提示即可. 3.运行Adobe CS6安装程序. 4.选择“试用”. 5.输入 ...

  8. ZOJ 649 Rescue(优先队列+bfs)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. 文本注释系统 + MarkDown

    标记系统: 笔记的要点 题材 缘起 目标 等级: 细节性 事实性 规律 法则 适用范围: 时间.地点.人物.起因.经过.结果,who what where when why how whom 6W1H ...

  10. 转:jmeter之线程组

    虽然有三个添加线程组的选项,名字不一样, 创建之后,其界面是完全一样的.之前的版本只有一个线程组的名字.现在多一个setUp theread Group 与terDown Thread Group 1 ...