Samcompu Loves Water
题目背景
Samcompu拥有大量的"水"资源!!
题目描述
Samcompu需要制定一个水计划。这个计划的主要目的就是为了避开老师监视的时间来水。
老师在中途会离开机房T次,第i次将会离开tim_i秒。Samcompu划水的时候可不是随便乱水的。他可是拥有"水"资源的。在他的库存中有N个可以水的网站。Samcompu拥有一种黑科技,他可以几乎不耗任何时间在网站与网站之间跳转并且把跳转的网页的信息秒存。也就是说,Samcompu并不需要在每一次跳转的时候花费时间去浏览网页。当然,这只局限于N个网站之间的N-1个跳转方式(保证每一个网站都可以跳转到另外的所有网站)。对于第i种跳转方式,第u_i个网站到第v_i个网站的跳转存在一个危险程度w_i,这个危险值可能会造成电脑卡死,如果Samcompu不能及时处理,那么就会完美地被老师发现。
值得一提的是,在被查水表很多次后,Samcompu总结出了一个规律:
老师走得越久,能够保证在被老师发现之前处理好电脑卡死的危险程度的上限就越高。简单来说,两者就是成正比的关系,比例系数为1。
可惜的是,Samcompu的黑科技并不稳定,在老师第i次离开的时候,第K_i个跳转方式就不可用了。
当然,每一次水都可以从任意一个网站开始,也可以从任意一个网站结束。
现在Samcompu想知道,对于第i次老师离开机房时,他能够有多少种不同的安全的水的方案。两种水的方案不同当且仅当这两种水的方案的第一个网站或者最后一个网站不同。
(补充说明: 一个安全的水的方案当且仅当当前是老师第j次离开教室时跳转的路径中不存在一个跳转方式i使得timj⩽wi,每一次水完后不可用的跳转方式就会恢复。)
输入输出格式
输入格式:
第一行两个正整数T, N
接下来N−1行,每一行三个正整数u_i, v_i, w_i
接下来T行,每一行两个正整数m_i, K_i
输出格式:
T行,每行一个正整数表示有多少中安全的水的方案。
输入输出样例
3 5
1 2 1
1 3 2
3 4 1
3 5 3
1 1
2 2
3 3
0
4
6
说明

第一次连接1和2的边不可用,当前能经过的边的危险程度需要<1,并没有合法的方案。
第二次连接1和3的边不可用,当前能经过的边的危险程度需要<2,合法的方案有 (1,2) (2,1) (3,4) (4,3) 共四种。
第三次连接3和4的边不可用,当前能经过的边的危险程度需要<3,合法的方案有 (1,2) (1,3) (2,1) (2,3) (3,1) (3,2) 共六种。
提醒:本题计算答案按照点对的方式计算.也就是说,如果起点和终点一样,则只看做同一种方案.特别的,(x,y)(x,y)和(y,x)(y,x) (x≠y)算作两种不同的方案.
数据范围:
Subtask 1(30 pts):
1⩽Ki⩽N⩽10^3 1⩽timi,wi⩽103
Subtask 2(50 pts):
1⩽T⩽5∗10^3 1⩽Ki⩽N⩽10^4 1⩽timi,wi⩽10^3
Subtask 3(20 pts):
1⩽T⩽10^4 1⩽Ki⩽N⩽10^4 1⩽timi,wi⩽10^3
数据保证不同的K_iKi最多只有10^3个。
温馨提醒:由于出题人数据比较毒瘤,所以请尽量卡常。
分析:
我只想说出题人真的考虑了我的语文水平了吗。。。
事实上本题就是按并查集的方式加边,然后再在合并的时候进行计算。
至于失效直接保存即可。
CODE:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int M=;
int t,n,tot,ans[M],fa[M],now[M],sl[M],last;
int fr(){
char c=getchar();int ans=;
while (c<''||c>'') c=getchar();
while (c>=''&&c<='') ans=(ans<<)+(ans<<)+(c^),c=getchar();
return ans;
}
int found(int x){
if (fa[x]==x) return x;
return fa[x]=found(fa[x]);
}
struct node{
int tim,K,num;
}ask[M];
struct node2{
int from,to,adj,num;
}e[M];
bool cmp(node x,node y){
if (x.K==y.K) return x.tim<y.tim;
return x.K<y.K;
}
bool cmp2(node2 x,node2 y){
return x.adj<y.adj;
}
void add(int u,int v,int w,int id){
e[++tot].from=u;e[tot].to=v;
e[tot].adj=w;e[tot].num=id;
return;
}
int count(int x){
return x*(x-);
}
int main(){
t=fr(),n=fr();
for (int i=;i<n;i++){
int u=fr(),v=fr(),w=fr();
add(u,v,w,i);
}
for (int i=;i<=t;i++) ask[i].tim=fr(),ask[i].K=fr(),ask[i].num=i;
sort(ask+,ask++t,cmp);
sort(e+,e+n,cmp2);
for (int i=;i<n;i++) now[e[i].num]=i;
for (int i=;i<=t;i++){
if (i==||ask[i].K!=ask[i-].K){
for (register int j=;j<=n;j++) fa[j]=j,sl[j]=;
last=;ans[ask[i].num]=;
}
else ans[ask[i].num]=ans[ask[i-].num];
while (last<n&&e[last].adj<ask[i].tim){
if (last!=now[ask[i].K]&&found(e[last].from)!=found(e[last].to)){
int now1=found(e[last].from),now2=found(e[last].to);
ans[ask[i].num]+=count(sl[now1]+sl[now2])-count(sl[now1])-count(sl[now2]);
sl[now2]+=sl[now1];sl[now1]=;
fa[now1]=now2;
}
last++;
}
}
for (int i=;i<=t;i++) printf("%d\n",ans[i]);
return ;
}
Samcompu Loves Water的更多相关文章
- 【洛谷】CYJian的水题大赛【第二弹】解题报告
点此进入比赛 T1: JerryC Loves Driving 第一题应该就是一道水分题(然而我只水了130分),我的主要做法就是暴力模拟,再做一些小小的优化(蠢得我自己都不想说了). My Code ...
- CYJian的水题大赛2 解题报告
这场比赛是前几天洛谷上 暮雪﹃紛紛dalao的个人公开赛,当时基本上都在水暴力分......也没有好好写正解(可能除了T1) 过了几天颓废的日子之后,本蒟蒻觉得应该卓越一下了qwq,所以就打算写一个解 ...
- Microsoft Loves Linux
微软新任CEO纳德拉提出的“Microsoft Loves Linux”,并且微软宣布.NET框架的开源,近期Microsoft不但宣布了Linux平台的SQL Server,还宣布了Microsof ...
- [LeetCode] Pacific Atlantic Water Flow 太平洋大西洋水流
Given an m x n matrix of non-negative integers representing the height of each unit cell in a contin ...
- [LeetCode] Trapping Rain Water II 收集雨水之二
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- [LeetCode] Water and Jug Problem 水罐问题
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...
- [LeetCode] Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- [LeetCode] Container With Most Water 装最多水的容器
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- 如何装最多的水? — leetcode 11. Container With Most Water
炎炎夏日,还是呆在空调房里切切题吧. Container With Most Water,题意其实有点噱头,简化下就是,给一个数组,恩,就叫 height 吧,从中任选两项 i 和 j(i <= ...
随机推荐
- 力扣算法——138CopyListWithRandomPointer【M】
A linked list is given such that each node contains an additional random pointer which could point t ...
- CMS 开发全过程介绍
1.Web项目开发的一般流程 a) 需求确定 b) 需求分析 i. 架构分析和设计 ii. 业务逻辑分析和设计 iii. 界面设计 iv. 数据库的设计 c) 开发环境搭建 d) 开发和测试 e) 文 ...
- 发布 Vant - 高效的 Vue 组件库,再造一个有赞移动商城也不在话下
发布 Vant - 高效的 Vue 组件库,再造一个有赞移动商城也不在话下:https://segmentfault.com/a/1190000011377961 vantUI框架在vue项目中的应用 ...
- Struts2的Action访问
● 示例项目结构 ● demo1.jsp <%@ page language="java" import="java.util.*" pageEncod ...
- webpack3.X的学习
文章说明,这篇主要是记录一下我学习的过程.以代码为主.一些概念啊,插件的用途说明啊不做任何说明.有任何不明白的请参照webpack中文官网https://doc.webpack-china.org/. ...
- 自动化运维Shell入门
运维shell 作用 项目部署 项目监控 什么是shell shell是一个程序,/bin/bash/,是一个命令解释器所有linux命令都由他来执行,打开终端就进入了 shell的交互式命令 运行方 ...
- [网络流24题] 洛谷P2761 软件补丁问题
题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...
- POJ-1639 Picnic Planning 度数限制最小生成树
解法参考的论文:https://wenku.baidu.com/view/8abefb175f0e7cd1842536aa.html 觉得网上的代码好像都是用邻接矩阵来实现的,觉得可能数据量大了会比较 ...
- Codeforces 1105E 最大独立集 状态DP 中途相遇法
题意:你有一个字符串, 有两种操作,一种是改变字符串,一种是某个用户询问这个字符串,如果一个用户每次查询字符串的时候都是他的用户名,他就会高兴.问最多有多少个用户会高兴? 题意:容易发现,在两个1操作 ...
- caffer的三种文件类别
solver文件 是一堆超参数,比如迭代次数,是否用GPU,多少次迭代暂存一次训练所得参数,动量项,权重衰减(即正则化参数),基本的learning rate,多少次迭代打印一次loss,以及网络结构 ...