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 ...
 
随机推荐
- Python2中while 1比while True更快
			
1) bool类是从int类继承而来的 2) True/False 在python2中不是关键字,但是在python3是(True,False,None) PS > python2 Enthou ...
 - Android底部导航栏创建——ViewPager + RadioGroup
			
原创文章,引用请注明出处:http://www.cnblogs.com/baipengzhan/p/6270201.html Android底部导航栏有多种实现方式,本文详解其中的ViewPager ...
 - C# 网上收集的一些所谓的开源项目
			
C#开源 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7- ...
 - ERROR 1406 : Data too long for column 解决办法
			
解决办法: 在my.ini里找到 sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_Create_USER,NO_ENGINE_SUBSTITUTION” 把其中的STRIC ...
 - gerrit review 设置
			
$ git config remote.review.pushurl "ssh://someone@ip:29418/the_project" $ git config remot ...
 - CSS3秘笈:第十章
			
CSS的transform.transition和animation属性 1.transform(倾斜):利用transform属性可以使导航栏稍微倾斜,或者使图片在访问者的鼠标经过它时放大两倍,甚至 ...
 - hdu_5769_Substring(后缀数组)
			
题目链接:hdu_5769_Substring 题意: 给你一个字符a和一个串b,问你有多少个包括a的字串 题解: #include<bits/stdc++.h> #define F(i, ...
 - how to add a shared lib in C?
			
http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html Basically, 2 steps: 1) make the ...
 - nopcommerce插件相关
			
注意Description.txt中,以下字段必须配置当前可用.我抄人家代码的时候,人家是3.4 我也配成3.4,结果我的nop是3.7的,后台半天显示不出来插件,浪费了一下午.
 - 使用TcpTrace小工具截获Web Service的SOAP报文
			
Web Service客户端对服务端进行调用时,请求和响应都使用SOAP报文进行通讯.在开发和测试时,常常查看SOAP报文的内容,以便进行分析和调试.TcpTrace是一款比较小巧的工具,可以让我们截 ...