来了来了,垃圾二连。【指两次发博客】

看了一下题就匆匆回去上课,在课上一边听课一边水oi,大概用1h40min的时间想完三道题。最后回到机房只剩下40min的时间敲代码,于是T1骗了70分就走了…

这次蛮开心的,垃圾没有什么高要求,三道题我的想法都或多或少和正解沾边就非常愉快了。

T1:kill

(想这题的时候遭到了非人的噪音干扰……)

倒是想到题解里区间连续的性质了,但因为老毛病——思路太乱没有体系,并且容易把题想难——退而求次选择了稳妥的方法。

我的做法是列出怪物和人以及终点的关系式,O(n2)算出人打每个怪的最终代价,然后二分最晚时间,再跑一个二分图匹配。复杂度多一个log,最后只拿到70分。

正解是发现人们打的怪物是一段连续的区间。个人试着还原了一下之前想到这一点时的思路过程,大约是从s的两边考虑。先看s的一边,这边的人最优解一定是打个人到终点之间的怪。每个人的代价至少包括出发点到s的这一段。然后打完所有到终点的途中的怪物以后,剩下的人要考虑打比出发点离s更远的怪,或者越过s打另一边的怪。但是不论怎样打,一定是个连续的区间,这样更优。s的另一边同理。

既然是一段连续的区间,直接枚举左端点然后更新答案就好。复杂度O(n2)。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
const long long inf=1e18;
long long p[],q[],s,ans=inf;
int main()
{
scanf("%d%d%lld",&n,&m,&s);
for(int i=;i<=n;i++)scanf("%lld",&p[i]);
for(int i=;i<=m;i++)scanf("%lld",&q[i]);
sort(q+,q+m+);
sort(p+,p+n+);
for(int i=;i<=m-n+;i++){
int k=i;
long long num=;
for(int j=;j<=n;j++){
if((p[j]>=q[k]&&q[k]>=s)||(p[j]<=q[k]&&q[k]<=s)){
if(num<abs(p[j]-s))num=abs(p[j]-s);
}
else if(num<abs(*q[k]-(p[j]+s)))num=abs(*q[k]-(p[j]+s));
k++;
}
ans=min(num,ans);
}
printf("%lld",ans);
return ;
}

T2:beauty

自己的思路弯弯绕最后绕到了点分治去,中间倒是想到过对于每个节点,子树里能和外面连的就尽量向外连,其余自己匹配。一定是一条边被经过尽量多次更优。

然后我就傻掉了…

最后其实是个贪心。对于每个子树中的关键点,假设有x个,贡献就是min(2k-x,x),即最多能通过上面这条边连多少个匹配。这样是尽量让所有能贡献的关键点都贡献了1。

至于证明…非常玄学,感觉的确没错,但是我也不太肯定。

学长的话:考场上大胆猜想,不用求证

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,a,siz[];
long long ans;
int b[],ver[],Next[],head[],tot;
void add(int x,int y){
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int fa){
siz[x]=b[x];
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
dfs(y,x);
siz[x]+=siz[y];
}
ans+=min(siz[x],*k-siz[x]);
}
int main()
{
scanf("%d%d%d",&n,&k,&a);
for(int i=,x;i<=*k;i++){
scanf("%d",&x);
b[x]=;
}
for(int i=,x,y;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
dfs(,);
printf("%lld",ans);
return ;
}

T3:weight

上课的时候手造了几组样例。很直观地能看出,对于求出的最小生成树,非树边能达到的最大值就是两个端点走出去的路径上的最大值-1。

树边这块我是有点懵…一开始以为是走到的路径上用到的最大值-1。然后还想了要不要用tarjan跑所有scc出来然后分别处理balabala…

正解中非树边的处理没有太大区别,但是树边的思路完全不一样。对于树边,要考虑每一条两个端点走出去的路径会经过这条树边的非树边,在它们的值里取个min再-1。因为如果大于这个min-1就可以选那条非树边而不是这条树边。

接下来就可以用树剖解决这些路径上的min和max的问题,树剖的复杂度是O(nlog2n)。

然而最大的坑点出现了…就在两三个小时以前刚刚得知,在节点1所在连通块以外的所有边的答案都要输出0。

我:???

于是加了个判断,快乐地过了…这就是我调了一中午的原因吗

因为这个坑点,想了各种奇怪的做法。比如对于图中的桥边,最后的答案一定是-1,所以写了个tarjan求桥,也算复习了一下…

最后发现第一版代码就可以过orz

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a,cnt,ans[];
const int inf=;
int val[],lip[],ff[],dep[],rec[],rec1[];
int f[],v[],siz[],son[];
int ver[],Next[],head[],edge[],tot;
void add(int x,int y,int z){
ver[++tot]=y;
Next[tot]=head[x];
edge[tot]=z;
head[x]=tot;
}
struct node{
int x,y,z,id;
}edg[];
bool cmp(node a,node b){
if(a.z<b.z)return true;
else return false;
}
struct tree{
int l,r,maxx,minn,tag;
}b[];
int get(int x){
if(f[x]==x)return x;
else return f[x]=get(f[x]);
}
void dfs(int x,int fa){
siz[x]=;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==fa)continue;
dep[y]=dep[x]+;
ff[y]=x;
val[y]=edge[i];
dfs(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[son[x]])son[x]=y;
}
}
void dfs1(int x,int upp){
lip[x]=upp;
rec[x]=++cnt;
rec1[cnt]=x;
if(!son[x])return;
dfs1(son[x],upp);
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(y==son[x]||y==ff[x])continue;
dfs1(y,y);
}
}
void build(int p,int l,int r){
b[p].l=l,b[p].r=r;
b[p].tag=b[p].minn=inf;
if(l==r){
b[p].maxx=val[rec1[l]];
return;
}
int mid=(l+r)/;
build(p*,l,mid);
build(p*+,mid+,r);
b[p].maxx=max(b[p*].maxx,b[p*+].maxx);
}
void update(int p){
if(b[p].tag!=inf){
b[p*].tag=min(b[p*].tag,b[p].tag);
b[p*].minn=min(b[p*].minn,b[p].tag);
b[p*+].tag=min(b[p*+].tag,b[p].tag);
b[p*+].minn=min(b[p*+].minn,b[p].tag);
b[p].tag=inf;
}
}
void change(int p,int l,int r,int z){
if(l<=b[p].l&&b[p].r<=r){
b[p].minn=min(b[p].minn,z);
b[p].tag=min(b[p].tag,z);
return;
}
update(p);
int mid=(b[p].l+b[p].r)/;
if(l<=mid)change(p*,l,r,z);
if(r>mid)change(p*+,l,r,z);
b[p].minn=min(b[p*].minn,b[p*+].minn);
}
void work(int x,int y,int z){
while(lip[x]!=lip[y]){
if(dep[lip[x]]<dep[lip[y]])swap(x,y);
change(,rec[lip[x]],rec[x],z);
x=ff[lip[x]];
}
if(x==y)return;
if(dep[x]>dep[y])swap(x,y);
change(,rec[x]+,rec[y],z);
}
int ask1(int p,int l,int r){
if(l<=b[p].l&&b[p].r<=r){
return b[p].maxx;
}
update(p);
int mid=(b[p].l+b[p].r)/;
int sum=;
if(l<=mid)sum=max(sum,ask1(p*,l,r));
if(r>mid)sum=max(sum,ask1(p*+,l,r));
b[p].minn=min(b[p*].minn,b[p*+].minn);
return sum;
}
int ask2(int p,int l,int r){
if(l<=b[p].l&&b[p].r<=r){
return b[p].minn;
}
update(p);
int mid=(b[p].l+b[p].r)/;
int sum=inf;
if(l<=mid)sum=min(sum,ask2(p*,l,r));
if(r>mid)sum=min(sum,ask2(p*+,l,r));
b[p].minn=min(b[p*].minn,b[p*+].minn);
return sum;
}
int query1(int x,int y){//max
int sum=;
while(lip[x]!=lip[y]){
if(dep[lip[x]]<dep[lip[y]])swap(x,y);
sum=max(sum,ask1(,rec[lip[x]],rec[x]));
x=ff[lip[x]];
}
if(x==y)return sum;
if(dep[x]>dep[y])swap(x,y);
sum=max(sum,ask1(,rec[x]+,rec[y]));
return sum;
}
int query2(int x,int y){//min
int sum=inf;
while(lip[x]!=lip[y]){
if(dep[lip[x]]<dep[lip[y]])swap(x,y);
sum=min(sum,ask2(,rec[lip[x]],rec[x]));
x=ff[lip[x]];
}
if(x==y)return sum==inf?:sum;
if(dep[x]>dep[y])swap(x,y);
sum=min(sum,ask2(,rec[x]+,rec[y]));
return sum==inf?:sum;
}
int main()
{
scanf("%d%d%d",&n,&m,&a);
for(int i=,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
edg[i].x=x,edg[i].y=y,edg[i].z=z,edg[i].id=i;
}
sort(edg+,edg+m+,cmp);
for(int i=;i<=n;i++)f[i]=i;
for(int i=;i<=m;i++){
int x1=get(edg[i].x),y1=get(edg[i].y);
if(x1!=y1){
f[x1]=y1;
v[i]=;
add(edg[i].x,edg[i].y,edg[i].z);
add(edg[i].y,edg[i].x,edg[i].z);
}
}
dfs(,);
dfs1(,);
build(,,cnt);
for(int i=;i<=m;i++){
if(!v[i]){//更新左右端点到lca路径上最小值
work(edg[i].x,edg[i].y,edg[i].z);
}
}
for(int i=;i<=m;i++){
if(!v[i]){//查两端点到lca路径上最大值,-1
ans[edg[i].id]=query1(edg[i].x,edg[i].y)-;
}
else{//查两端点到lca路径上最小值,-1
ans[edg[i].id]=query2(edg[i].x,edg[i].y)-;
}
if(get(edg[i].x)!=get())ans[edg[i].id]=;
}
for(int i=;i<=m;i++)printf("%d ",ans[i]);
return ;
}

然后马上又要考试了【本来以为不考】,希望机房里各位rp++吧

2019.9.17 csp-s模拟测试45 反思总结的更多相关文章

  1. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  4. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  5. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  6. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  7. 2019/10/17 CSP模拟 总结

    T1 补票 Ticket 没什么好说的,不讲了 T2 删数字 Number 很后悔的是其实考场上不仅想出了正解的方程,甚至连优化都想到了,却因为码力不足只打了\(O(n^2)\)暴力,甚至还因为细节挂 ...

  8. 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】

    [题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...

  9. 2019.7.29 NOIP模拟测试10 反思总结【T2补全】

    这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...

随机推荐

  1. css正則匹配、模糊匹配

    //所有class包含font-red的p标签 p[class~="font-red"] {color: red;} [abc^="def"] 选择 abc 属 ...

  2. Lintcode 翻转链表

    翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 分析: /** * Definition of ListN ...

  3. 左神算法进阶班3_1构造数组的MaxTree

    题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...

  4. 玩转大数据系列之Apache Pig高级技能之函数编程(六)

    原创不易,转载请务必注明,原创地址,谢谢配合! http://qindongliang.iteye.com/ Pig系列的学习文档,希望对大家有用,感谢关注散仙! Apache Pig的前世今生 Ap ...

  5. [CQOI2009]叶子的染色【性质+树形Dp】

    Online Judge:Bzoj1304,Luogu P3155 Label:无根树,树形Dp 题目描述 给定一棵\(N\)个节点的无根树,它一共有\(K\)个叶子节点.你可以选择一个度数大于1的节 ...

  6. 单例模式以及在C#中的使用

    下面做一些简要的说明. 1. 单例模式(Singleton Pattern),又称作单件模式,当然也有一种诙谐的称谓:单身模式.在经典的GoF所著的<Design Patterns>一书中 ...

  7. putty开源的ssh软件工具

    # 登录远程服务器需要ip和端口即可:还是开源工具用起来无忧无虑.无拘无束,这种感觉实在太舒服了,比起xshell开始免费.后来收费好太多太多,不用担心哪天过期了,想干嘛就干嘛. 软件下载地址:htt ...

  8. Odoo QWeb

    1.web 模块 注意,OpenERP 模块中 web 部分用到的所有文件必须被放置在模块内的 static 文件夹里.这是强制性的,出于安全考虑. 事实上,我们创建的文件夹 CSS,JS 和 XML ...

  9. Java实现数字大写转换

    需求如下:用json读取后台工时信息,比如23.5小时,需要通过编码将其转换为贰拾叁点伍 比如23.23之前有对Stringl类型强转为Double在转为整型,发生了精度丢失,后来想想对小数点进行分割 ...

  10. visual studio 2013 打开失败 ,报错:未能完成操作,不支持此接口

    因为从新安装了.net 4.0版本,再打开visual studio 2013时,提示报错:未能完成此操作,不支持接口 解决办法:从microsoft官网下载了最新4.5版本进行安装后.即可成功打开.