2017 ZSTU寒假排位赛 #1
题目链接: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的更多相关文章
- 2017 ZSTU寒假排位赛 #7
题目链接:https://vjudge.net/contest/149498#overview. A题,水题,直接按照题意模拟一下即可. B题,我用的是线段树.大力用的差分标记(上次听zy说过,下次再 ...
- 2017 ZSTU寒假排位赛 #2
题目链接:https://vjudge.net/contest/147632#overview. A题,状态压缩一下然后暴力即可. B题,水题,略过. C题,有负数,前缀和不是单调的,因此不能用尺取法 ...
- 2017 ZSTU寒假排位赛 #8
题目链接:https://vjudge.net/contest/149845#overview. A题,水题. B题,给出 p个 第一个人的区间 和 q个第二个人的区间,问[l,r]中有多少个整数满足 ...
- 2017 ZSTU寒假排位赛 #6
题目链接:https://vjudge.net/contest/149212#overview. A题,水题,略过. B题,水题,读清题意即可. C题,数学题,如果把x表示成x=nb+m,则k=n/m ...
- 2017 ZSTU寒假排位赛 #5
题目链接:https://vjudge.net/contest/148901#overview. A题,排序以后xjbg即可. B题,弄个数组记录当前列是不是删除以及当前行是不是已经大于下一行然后乱搞 ...
- 2017 ZSTU寒假排位赛 #4
题目链接:https://vjudge.net/contest/148543#overview. A题:n个罪犯,每个人有一个犯罪值,现在要从里面选出连续的c个人,每个人的犯罪值都不能超过t,问选法的 ...
- 2017 ZSTU寒假排位赛 #3
题目链接:https://vjudge.net/contest/147974#overview. A题,费用流,不会..跳过了. B题,给一个图,问至少添加几条边能成为强连通图.显然缩点,要使得成为一 ...
- Codeforces Round #341 (Div. 2)
在家都变的懒惰了,好久没写题解了,补补CF 模拟 A - Wet Shark and Odd and Even #include <bits/stdc++.h> typedef long ...
- 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 ...
随机推荐
- ios系统下的QQ浏览器jquert的BUG
$(document).bind("click", function(e){ var $t = $(e.target); alert(333); if($t.is("p& ...
- C++设计模式-Iterator迭代器模式
ref: http://www.cnblogs.com/onlycxue/archive/2013/12/25/3490738.html
- Oracle数据库插入数据出错:ORA-06550
wpf应用调用oracle的存储过程,出错“ORA-06550:参数个数或参数类型出错”,如下图: 反复检查,存储过程的参数个数和参数类型都没错,觉得非常蹊跷.最后终于解决, 原因是当参数的值为nul ...
- PHP socket模拟POST请求
<?php if (! function_exists ( 'socket_post' )) { function socket_post($url, $data, $referer = '') ...
- USB LPT 端口映射
如何设置端口映射(以将LPT1端口映射到共享名为CutePDFW的虚拟打印机上为例),命令如下: NET USE LPT1: \\wcjxixi-d022704\CutePDFW /Persisten ...
- Flask -- 路由
route()装饰器把一个函数绑定到对应的URL(可以是多个)上 @app.route('/') def index(): return 'Index Page' @app.route('/hello ...
- Linux下的两个聊天命令的使用方法
一. write用法:write 用户名:敲回车后,自己和对方将会同时处于聊天的状态,但是被发起连接的人只能收到发起聊天请求的人的聊天内容,但是不能回复,如果想要回复的话必须先向对方发起连接,这样以来 ...
- ECSTORE1.2系统更改后台密码
<?php set_time_limit(0); error_reporting(E_ALL^E_NOTICE); ?> <META HTTP-EQUIV="content ...
- 常用 SQL语句
Oracle 查看所有表的名字: select table_name from user_tables; 查询特定表的名字:select * from (select table_name t fro ...
- 1.1 mysql安装
直接百度mysql 即可下载.. 下载完毕之后是压缩包,解压缩即可 解压之后可以将该文件夹改名,放到合适的位置,个人建议把文件夹改名为MySQL Server 5.6,放到D:\MySQL Serve ...