AGC007题解
发现自己思维能力又跟不上了...做题有点吃力...所以回归AGC刷题计划...
AGC040506都写了一部分题然后懒得补全了,所以从07开始做吧。大概是从C开始。
C
这也太人类智慧了吧...
我先是自己画了个柿子 咱也不知道对不对 先丢着
$\frac{1}{i-j+1} * \frac{1}{2^{j-n+1}} * ((2i-2j+1)d_1 + \frac{2i+2j-3}{2i-2j+1} x)$
就是根据每一个球到哪一个洞推的,发现是小数显然用不了 鸽了。
然后就发现了这人类智慧的题解
发现有个性质没用上 就是等差数列 我们接着转换问题
变成数轴上有2n个点 每次可以取走相邻两颗 贡献是它俩之间的距离
惊喜一刻到了:可以发现每次距离期望的变化是等差数列!
等差数列+等差数列依然是等差数列= =
所以我们直接维护首项末项和公差就可以计算了
好像...很人类智慧...
//Love and Freedom.
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define inf 20021225
#define db double
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int n,x,k;
int main()
{
n=read(); x=read(); k=read();
db bg=x,ed=x+(2.0*n-)*k,ans=0.0;
for(int i=(n<<);i;i-=)
{
ans+=(bg+ed)/2.0;
bg+=(bg*+k*)/(1.0*i);
ed+=(ed*-k*)/(1.0*i);
if(i>) k=(ed-bg)/((i-)*1.0-1.0);
}
printf("%.10lf\n",ans);
return ;
}
C
D
这个题...比C简单多了啊...AGC的题目顺序真是个迷...
写个柿子$f[i]=min(f[i],f[j]+max { T,2*p[i]-p[j+1] } )$
显然有单调性...分类讨论一波max的取值维护一下就行了...
//Love and Freedom.
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define inf 20021225
#define N 100100
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
ll f[N],mn; int t,e,n,p[N];
int main()
{
n=read(),e=read(),t=read();
int l=; mn=1e18;
for(int i=;i<=n;i++) p[i]=read();
for(int i=;i<=n;i++)
{
while(l<=i && *(p[i]-p[l+])>t)
mn=min(mn,f[l]-*p[l+]), l++;
if(l<i) f[i]=f[l]+t;
f[i]=min(f[i],mn+*p[i]);
}
printf("%lld\n",f[n]+e);
return ;
}
D
E
神仙题.jpg
发现答案具有二分性 然后考虑怎么验证
我们用f[x][i][j]表示进x子树为i,出来是j是否可行。发现进去的方式至多只有leaf种,所以这玩意很多都没用,我们考虑把它们单拎出来。
继续考虑如果存在(i,j)(i',j')且满足(i<=i'&&j<=j')的时候,只需要保留(i,j)这样的话我们把一个f[x]的数量级降到了O(n)
考虑如何合并 我们需要对应的枚举(ls,i,j)(rs,k,l)使得(j+k+val[ls]+val[rs]<=mid)得到(x,i+val[ls],l+val[rs]) 由于上面的性质,当i单调增时,j单调降。所以我们直接双指针搞就可以了。
考虑复杂度问题 用Sx表示f[x]的个数 我们发现 Sx=2*min(Sls,Srs)(翻转对应两种)使用启发式合并,我们的复杂度就可以降到O(nlgnlgw)了。
//Love and Freedom.
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define ll long long
#define inf 20021225
#define pa pair<ll,ll>
#define mp make_pair
#define fs first
#define se second
#define N 131072
#define pb push_back
#define ls(x) son[x][0]
#define rs(x) son[x][1]
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
vector<int> son[N+]; int val[N+];
vector<pa> f[N+],tmp[]; ll mid;
void dfs(int x)
{
f[x].clear();
if(!son[x].size()){f[x].pb(mp(,)); return;}
dfs(ls(x)); dfs(rs(x));
for(int p=;p<;p++)
{
tmp[p].clear(); int a=son[x][p],b=son[x][p^]; int r=;
for(int i=;i<f[a].size();i++)
{
while(r+<f[b].size()&&f[b][r+].fs+f[a][i].se+val[a]+val[b]<=mid) r++;
if(r<f[b].size() && f[b][r].fs+f[a][i].se+val[a]+val[b]<=mid) tmp[p].pb(mp(f[a][i].fs+val[a],f[b][r].se+val[b]));
}
}
int i=,j=; ll cur=1e18;
while(i<tmp[].size()&&j<tmp[].size())
{
if(tmp[][i]<tmp[][j])
{
if(tmp[][i].se<cur)
f[x].pb(tmp[][i]),cur=tmp[][i].se;
i++;
}
else
{
if(tmp[][j].se<cur)
f[x].pb(tmp[][j]),cur=tmp[][j].se;
j++;
}
}
while(i<tmp[].size())
{
if(tmp[][i].se<cur)
f[x].pb(tmp[][i]),cur=tmp[][i].se;
i++;
}
while(j<tmp[].size())
{
if(tmp[][j].se<cur)
f[x].pb(tmp[][j]),cur=tmp[][j].se;
j++;
}
}
bool check()
{
dfs();
if(f[].size()) return ;
return ;
}
int main()
{
int n=read(); ll l=,r=;
for(int i=;i<=n;i++)
{
int fa=read(); val[i]=read();
son[fa].pb(i); r+=val[i];
}
ll ans=r;
while(l<=r)
{
mid=l+r>>;
if(check()) ans=mid,r=mid-;
else l=mid+;
}
printf("%lld\n",ans);
return ;
}
E
F
为什么他们什么都能想到啊QAQ
建议去看editorial...
大概就是维护拐点信息,感性理解还是可以的...大概自己做是没戏了...
//Love and Freedom.
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define ll long long
#define inf 20021225
#define N 1001000
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
char s[N],t[N]; queue<int> q;
int main()
{
int n=read(),ans=;
scanf("%s",s+);
scanf("%s",t+);
if(strcmp(s+,t+)==) return printf("0\n"),;
int pt=n,ps=n;
while(pt)
{
while(pt && t[pt]==t[pt-]) pt--;
while(ps && (ps>pt||s[ps]!=t[pt])) ps--;
if(!ps) return printf("-1\n"),;
while(!q.empty() && q.front()-q.size()>=pt) q.pop();
if(ps!=pt) q.push(ps);
ans=max(ans,(int)q.size()+);
pt--;
}
printf("%d\n",ans);
return ;
}
F
AGC007题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- P1364 医院设置 (补锅,memset初始化较大值不可用0x7fffffff )
P1364 医院设置 题解 弗洛伊德水过 注意初始化一个大数 0x3f 可以,0x5f 好像也可以,但是0x7fffffff 我是真的炸了,初始化为-1 (后面补锅有详细解释) 代码 #include ...
- fiddler之数据分析和查看(inspectors)-抓包
在instpectors中主要是对请求和响应进行查看和分享,监听请求的响应内容.他有多个分页标签.界面分上下两部分,上面部分显示请求的相关信息:下面部分显示响应相关信息.简单说明常用的几个分页标签 一 ...
- GitHub入门(一)GIT配置与Hexo博客搭建
首先安装配置Git环境,由于本人使用Windows操作系统所以从msysgit.github.io下载msysGit Windows版本,安装.(Mac一般自带Git) 安装的时候一般使用默认选项,其 ...
- 查看dll中的函数(方法)
https://jingyan.baidu.com/article/5553fa82b953b365a23934b7.html 查看dll中的函数(方法) 听语音 | 浏览:2004 | 更新:201 ...
- 【不错】MySQL 事务隔离级别
一.事务描述 1.事务的四个特性 ACID 1. A:原子性 = 一个事务或者都成功.或者都失败: 2. C:一致性 = 在整个事务的生命周期里面,查询到的数据是一致的: MVCC多版本并发控制:利用 ...
- 笨办法学python 13题:pycharm 运行
笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...
- Java第四周总结+实验报告
实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...
- Python中classmethod和staticmethod的区别
学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用. staticmethod:静态方法 classmethod:类方法 在python中,静态方法和类方法都 ...
- [转帖]JVM内存结构 VS Java内存模型 VS Java对象模型
JVM内存结构 VS Java内存模型 VS Java对象模型 https://www.hollischuang.com/archives/2509 Java作为一种面向对象的,跨平台语言,其对象.内 ...
- Python实现批量执行华为交换机脚本
#!/usr/bin/python3 # -*- coding:utf-8 -*- import paramiko import time ssh = paramiko.SSHClient() key ...