[日常训练]常州集训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\). 也可以把边压进堆里,然后变成一个二维清点问题(???),然后就线段树+并查集 ...
随机推荐
- SQL Server数据库代码指令简介
这些是比较常用的命令操作,事先声明,这些命令是不区分大小写的,我按照我的课本来总结用法和知识点,无用的章节自动省略. 没有一点数据库知识基础的可以等我录制视频,不然可能看不懂,视频链接:http:// ...
- node基础05:路由基础
1.基础实例 //server.js var http = require("http"); var url = require("url"); var rou ...
- Oracle Coherence应用部署到Jboss EAP 6.x 时 NoClassDefFoundError: sun/rmi/server/MarshalOutputStream 的解决办法
今天将一个web应用从weblogic 10.3迁移到jboss EAP 6.3上,该应用使用oracle coherence做为缓存,部署上去后,启动时一直报如下错误: at java.ut ...
- Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析
前言 本文将分析mybatis与spring整合的MapperScannerConfigurer的底层原理,之前已经分析过java中实现动态,可以使用jdk自带api和cglib第三方库生成动态代理. ...
- 常用 redis 命令(for php)
Redis 主要能存储 5 种数据结构,分别是 strings,hashes,lists,sets 以及 sorted sets. 新建一个 redis 数据库 $redis = new Redis( ...
- 前端人员一定要掌握的PS技巧
一.PS与前端知多少 一般我们会认为PS是用来修改图片的,这些工作是美工人员做的事不是前端人员做的,其实这样想你就错了,因为在前端人员也是要学会一些简单的关于PS的技巧的,这样就不会应为一点点小小的需 ...
- JVM内存管理------杂谈(借此也论一论obj=null)
各位园友好,LZ是从某网站转战过来的博主,看到这里很多博主都称看友们为园友,LZ斗胆模仿一下,不过以前,LZ其实都是称看友们为猿友的.之前LZ在某网站已经写了一系列文章,已经全部复制到了园内的新博客, ...
- 关于Task的线程窃取
示例代码: static void Main(string[] args) { ThreadPool.SetMaxThreads(, ); object locker = new object(); ...
- VS代码管理插件AnkhSvn
下载AnKHSvn软件,启动VS,源代码管理工具选择AnKHSvn 在视图-〉其它窗口-〉Pending Change->提交变化的更改
- JavaScript学习笔记-循环输出菱形,并可菱形自定义大小
var Cen = 6;//定义菱形中部为第几行(起始值为0) //for循环输出菱形 document.write("<button onclick='xh()'>点我for循 ...