[日常训练]常州集训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\). 也可以把边压进堆里,然后变成一个二维清点问题(???),然后就线段树+并查集 ...
随机推荐
- ie6-ie8中不支持opacity透明度的解决方法
ie6-ie8中是不支持的,需要加上下面这句话:filter: alpha(opacity=70);此外这种效果不能用ietester中的ie6测试,因为ietester的ie6这样写也是不透明的,但 ...
- java的string常用操作
import java.util.*; public class Demo3 { public static void main(String args[]){ String str = " ...
- 開博客了, 因為搞Delphi 開發的關於Delphi學習
開博客了, 因為搞Delphi 開發的關於Delphi學習,之前都是用本地TXT文件保存,發現在本地電腦保存非常不方面,而且只能在一台電腦上保存,不容易查看和修改內容.便於以後的記錄只用,以及經驗交流 ...
- Android的媒体管理框架:Glide
Glide是一个高效.开源. Android设备上的媒体管理框架,它遵循BSD.MIT以及Apache 2.0协议发布.Glide具有获取.解码和展示视频剧照.图片.动画等功能,它还有灵活的API,这 ...
- LeetCode:Minimum Depth of Binary Tree,Maximum Depth of Binary Tree
LeetCode:Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth ...
- unix环境高级编程基础知识之第四章
1.从当前用户转到root用户:直接输入su命令,然后输入root密码,如果之前没有设置root命令密码会登陆不成功,这里需要命令sudo passwd命令设置密码,然后按照上面输入就成:从root命 ...
- C8051逆向电阻屏:头儿拍脑袋说电阻屏IC好赚钱3块钱成本能卖20几块。,一个月不分昼夜逆向成功后头儿说电阻屏已经被市场淘汰请放弃治疗。
参考: 书籍,<圈圈教你玩USB> C8051F单片机快速入门:http://www.waveshare.net/Left_Column/C8051F_Application_Notes ...
- 两道关于JS的小考题(闭包与中间件)
题目一:写一个javascript函数 calculate,该函数有如下性质 calculate() = 0; calculate(2)() = 2; calculate(3)(4)(1)(5)() ...
- 理解JavaScript的作用域链
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- DSOFramer 之一:在 64 位系统注册 DSOFramer
DSOFramer是微软提供的一款用于在线编辑.调用Word.Excel等Office程序的ActiveX组件.很多第三方的Office组件都是基于DSOFramer组件开发的.今天我们不讲如何使用D ...