[日常训练]常州集训day3
T1
Description
有$K$个石子,石子只能放在$N$条水平线与$M$条竖直线构成的网格的交点上。
求用$K$个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
Input
第一行三个整数$N,M,K$。
Output
一个非负整数,即最多的满足条件的长方形数量。
Sample Input
3 3 8
Sample Output
5
HINT
$N\;\leq\;30000$,保证任意两点不重合,$K\;\leq\;N\;\times\;M$
Solution
很显然,最佳的方案长这样:
$xxx…xxx$ $xxx…xxx$
$xxx…xxx$ $xxx…xxx$
…… 或 ….
$xxx…xxx$ $xxx…xxx$
$xxx…x$ $xxx…xxx$
设上面两个图形的大多数行的个数为$l$,枚举$l$,$ans=max(c(k/l,2)\;\times\;c(l,2)+c(k$%$l,2)\;\times\;k/l)(1<l\;\leq\;max(n,m))$。
这题本弱有写过原题,但是考场上还是想错了QAQ
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m,k,sum,ans;
inline bool chk(ll x,ll y){
return max(x,y)<=n&&min(x,y)<=m;
}
inline ll c2(ll k){
return k*(k-)>>;
}
inline void init(){
scanf("%lld%lld%lld",&n,&m,&k);
if(n<m){
ll t=m;m=n;n=t;
}
for(ll i=n,x,y;i>;i--){
x=k/i;y=k%i;
if(!chk(i,x+(y>))||!x) continue;
sum=c2(x)*c2(i)+c2(y)*x;
ans=max(ans,sum);
}
printf("%lld\n",ans);
}
int main(){
freopen("rectangle.in","r",stdin);
freopen("rectangle.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}
T2
Description
求$Fibonacci$数列第$X-Y$项的和除以$10000$的余数。
Input
第一行一个整数$T$,表示数据组数。
接下来$T$行,每行两个数$X,Y$,意义如题所述。
Output
$T$行,每行是一个询问的答案。
Sample Input
2
1 5
127 255
Sample Output
12
5976
HINT
$T\;\leq\;1000,X\;\leq\;Y\;\leq\;2^{31}−1$
Solution
$X,Y$这么大,很容易会想到矩乘。
$s[i]=s[i-1]+f[i]=s[i-1]+f[i-1]+f[i-2]$。

人生第一道当场A的矩乘题,感动QAQ
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M 10000
using namespace std;
struct matrix{
int a[][],n,m;
}a,b,c;
int l,r,s1,s2,t;
inline matrix mul(matrix a,matrix b){
matrix c;c.n=a.n;c.m=b.m;
for(int i=;i<=c.n;i++)
for(int j=;j<=c.m;j++)
c.a[i][j]=;
for(int i=;i<=c.n;i++)
for(int j=;j<=c.m;j++)
for(int k=;k<=c.n;k++){
c.a[i][j]+=a.a[i][k]*b.a[k][j];
c.a[i][j]%=M;
}
return c;
}
inline matrix po(matrix a,int k){
matrix c;c.m=a.m;c.n=a.n;
for(int i=;i<=c.n;i++)
for(int j=;j<=c.m;j++)
if(i!=j) c.a[i][j]=;
else c.a[i][j]=;
while(k){
if(k&) c=mul(a,c);
a=mul(a,a);k>>=;
}
return c;
}
inline void init(){
scanf("%d",&t);
a.m=a.n=b.n=;b.m=;
a.a[][]=a.a[][]=a.a[][]=;
a.a[][]=a.a[][]=a.a[][]=;
b.a[][]=;b.a[][]=b.a[][]=;
while(t--){
scanf("%d%d",&l,&r);
if(l<=) s1=l-;
else{
c=mul(po(a,l-),b);
s1=c.a[][];
}
if(r<=) s2=r;
else{
c=mul(po(a,r-),b);
s2=c.a[][];
}
printf("%d\n",(s2-s1+M)%M);
}
}
int main(){
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}
T3
Description
给定一个$N$个顶点,$M$条边的无向连通图。
设$dist1[i]$表示在这个无向连通图中,顶点$i$到顶点$1$的最短距离。
求在这张图中,有多少棵大小为$N$的树满足对于任意的$i$,$dist1[i]=dist2[i]$($dist2[i]$表示在这棵树中,顶点$i$到顶点$1$的距离)。
Input
第一行,两个整数,$N,M$,表示有$N$个顶点和$M$条边。
接下来有$M$行,每行有$3$个整数$x,y,len(1\;\leq\;x,y\;\leq\;n,1\;\leq\;len\;\leq\;100)$,
表示顶点$x$和顶点$y$有一条长度为$len$的边。
数据保证不出现自环、重边。
Output
一行两个整数,表示满足条件的方案数$mod\;2147483647$的答案。
Sample Input
3 3
1 2 2
1 3 1
2 3 1
Sample Output
2
HINT
$2\;\leq\;N\;\leq\;1000,N−1\;\leq\;M\;\leq\;N\;\times\;(N−1)/2$
Solution
$tot[i]$表示到达点$i$满足$dis2[j]+g[j][i]=dis2[i]$的点数。
用$Dijkstra$实现即可。

考场上记录答案的方式写错了导致炸到只剩20QAQ
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1005ll
#define M 1000005ll
#define K 2147483647ll
using namespace std;
typedef long long ll;
struct graph{
ll nxt,to,w;
}e[M];
ll g[N],dis[N],tot[N],n,m,ans,cnt;
bool v[N];
inline ll read(){
ll ret=;char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c)){
ret=ret*+c-'';
c=getchar();
}
return ret;
}
inline void addedge(ll x,ll y,ll w){
e[++cnt].nxt=g[x];g[x]=cnt;
e[cnt].to=y;e[cnt].w=w;
}
inline void init(){
n=read();m=read();
for(ll i=,j,k,l;i<=m;i++){
j=read();k=read();l=read();
addedge(j,k,l);addedge(k,j,l);
}
for(ll i=;i<=n;i++){
dis[i]=M;tot[i]=;
}
for(ll l=,p=,nxt,mi;l<=n;l++,p=nxt){
for(ll i=g[p];i;i=e[i].nxt)
if(dis[p]+e[i].w<dis[e[i].to]){
tot[e[i].to]=;
dis[e[i].to]=dis[p]+e[i].w;
}
else if(dis[p]+e[i].w==dis[e[i].to])
tot[e[i].to]=(tot[e[i].to]+)%K;
mi=M;
for(ll i=;i<=n;i++)
if(dis[i]<mi&&!v[i]){
mi=dis[i];nxt=i;
}
v[nxt]=true;
}
ans=;
for(ll i=;i<=n;i++)
ans=ans*tot[i]%K;
printf("%I64d\n",ans);
}
int main(){
freopen("treecount.in","r",stdin);
freopen("treecount.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}
[日常训练]常州集训day3的更多相关文章
- [日常训练]常州集训day8
T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...
- [日常训练]常州集训day7
T1 Description 给定一个序列,初始为空.依次将$1-n$插入序列,其中$i$插到当前第$a_i$个数的右边($a_i=0$表示插到序列最左边).求最终序列. Input 第一行一个整数$ ...
- [日常训练]常州集训day5
T1 Description 小$W$和小$M$一起玩拼图游戏啦~ 小$M$给小$M$一张$N$个点的图,有$M$条可选无向边,每条边有一个甜蜜值,小$W$要选$K$条边,使得任意两点间最多有一条路径 ...
- [日常训练]常州集训day2
T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...
- 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT
[LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...
- 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)
[LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 2019暑期金华集训 Day3 字符串
自闭集训 Day3 字符串 SAM 考虑后缀树. SAM的parent树是反串的后缀树,所以后面加一个字符的时候相当于往串前面加一个字符,恰好多出了一个后缀. 于是可以以此来理解SAM. 每一条路径对 ...
- 2019暑期金华集训 Day3 图论
自闭集训 Day3 图论 NOI2019 D2T1 没有真正建出图来的必要,可以直接打取\(\min\)的\(tag\). 也可以把边压进堆里,然后变成一个二维清点问题(???),然后就线段树+并查集 ...
随机推荐
- wk_02
Python 序列 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推.序列都可以进行的操作包括索引,切片,加,乘,检 ...
- jquery.validate.min.js 用法方法示例
页面html 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- 使用华为U8860测试时出现“Unable to open log device '/dev/log/main': No such file or directory”
这是因为华为默认禁掉了log输出, 解决办法: 拨号: *#*#2846579#*#* 会显示工程菜单, Go to "ProjectMenu" -> "Backg ...
- ICC的sacn-wise和unit-wise
假设有16个被试,2个session,2个RUN,200个ROI,那么ICC需要对RUN1和RUN2分别算两次(相比而言,paired ttest则是对一个session中的RUN1和RUN2计算) ...
- ejb3: message drive bean(MDB)示例
上一篇已经知道了JMS的基本操作,今天来看一下ejb3中的一种重要bean:Message Drive Bean(mdb) 如果要不断监听一个队列中的消息,通常我们需要写一个监听程序,这需要一定的开发 ...
- c++返回值 注意事项
1.不要返回指向局部变量或临时对象的引用.函数执行完毕后,局部变量和临时对象会消失,引用将指向不存在的数据 2.返回指向const对象的引用 使用const引用的常见原因是旨在提高效率,但对于何时采用 ...
- Eclipse 反编译插件JadClipse安装
下载jadClipse地址: 链接: http://pan.baidu.com/s/1kTN4TPd 提取码: 3fvd 将net.sf.jadclipse_3.3.0.jar拷贝到eclipse的 ...
- C#微信开发小白成长教程二(新手接入指南,附视频)
距离第一讲又已经过去了一个多星期了,本打算一周更新一讲的,奈何实在太忙.最近也在群里发现有一部分人已经可以熟练调用微信的部分接口但却不是很清楚微信公众平台接收消息的一个处理机制.本讲就来介绍下怎么接入 ...
- HoloLens开发手记 - 应用程序模型 App model
HoloLens使用Universal Windows Platform (UWP)提供的应用模型.UWP应用模型定义了应用如何被安全和完全地安装.更新.版本控制和移除.它管理了应用生命周期 - 应用 ...
- Linux之我见
Linux哲学之美 linux就像是一个哲学的最佳实践.如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪的说着:“linux的美丽简直让人沉醉.” 我只能说是我处在linux学习的修炼之路上的一个 ...