地理课(geography)
地理课(geography)
题目描述
地理课上,老师给出了一个巨大的地图,由于世界日新月异,会有一些道路在某一时刻被删除,也会有一些道路在某一时刻被修建。这里的道路均为双向的。
老师认为,有一些城市被分在了一个连通块中可以相互到达,而有一些城市不能够相互到达。而他想知道,每个时刻所有连通块大小的乘积是多少?
wzy看到这个地图的时候就蒙了,还好那只上天的喵及时帮助了他。现在他把这个毒瘤的地图拿过来给你,想试试看你能不能求出来。由于答案可能很大,输出乘积mod109+7mod109+7即可。
输入
第一行两个数n,mn,m,表示有nn个点,mm个时刻。接下来mm行每行三个数,要么是1uv1uv,要么是2uv2uv,分别表示添加一条无向边和删除一条无向边。
输出
共mm,每行一个数表示连通块大小乘积mod1,000,000,007mod1,000,000,007

上面是每个时刻操作后的图。乘积分别为:
2*1*1*1=2,3*1*1=3,3*1*1=3,3*2=6,5,3*2=6
数据范围及约定
subtask1:30pts,n≤1,000,m≤2,000n≤1,000,m≤2,000
subtask2:20pts,满足没有删除操作。
subtask3:50pts,n,m≤100,000n,m≤100,000保证没有重边自环,不会删除不存在的边。
来源
solution
好题好题
考虑离线,按时间建一棵线段树
把每一个边的编号加进线段树对应的区间中
我们现在希望得到每一个叶子节点的值
那么每次暴力求是不行了
我们记下每一层的边连接的并查集的根与大小
返回时把边拆开即可
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define mod 1000000007
#define maxn 100005
#define ll long long
using namespace std;
int n,m,f[maxn],sz[maxn],t1,t2,op;
ll now,ans[maxn],ny[maxn];
struct node{
int u,v,st,ed;
}e[maxn];
map<ll,int>ls;
struct no{
int l,r;
vector<int>x;
}tree[maxn*8];
struct Node{
int id,x,y,size;
};
vector<Node>p;
void build(int k,int L,int R){
tree[k].l=L,tree[k].r=R;
if(L==R)return;
int mid=L+R>>1;
build(k*2,L,mid);build(k*2+1,mid+1,R);
}
void add(int k,int L,int R,int v){
//cout<<k<<' '<<L<<' '<<R<<''<<endl;
if(tree[k].l>=L&&tree[k].r<=R){
tree[k].x.push_back(v);return;
}
int mid=tree[k].l+tree[k].r>>1;
if(L<=mid)add(k*2,L,R,v);
if(R>mid)add(k*2+1,L,R,v);
}
ll work(ll a,int num){
ll an=1;
while(num){
if(num&1)an=an*a;
a=a*a;a%=mod;an%=mod;num>>=1;
}
return an;
}
int getf(int k){
if(f[k]==k)return k;
return getf(f[k]);
}
void hb(int k){
//cout<<"k: "<<k<<' '<<tree[k].l<<' '<<tree[k].r<<endl;
for(int i=0;i<tree[k].x.size();i++){
int t=tree[k].x[i];
//cout<<t<<endl;
int f1=getf(e[t].u),f2=getf(e[t].v);
if(f1!=f2){
now=now*ny[sz[f1]]%mod*ny[sz[f2]]%mod;
now=now*(sz[f1]+sz[f2])%mod;
if(sz[f1]<sz[f2]){
p.push_back((Node){k,f1,f2,sz[f1]});
f[f1]=f2;sz[f2]+=sz[f1];sz[f1]=0;
}
else {
p.push_back((Node){k,f2,f1,sz[f2]});
f[f2]=f1;sz[f1]+=sz[f2];sz[f2]=0;
}
}
}
}
void turn(int k){
int Size=p.size()-1;if(Size<0)return;
//cout<<"Size "<<Size<<' '<<tree[k].l<<' '<<tree[k].r<<endl;
for(int i=Size;p[i].id==k&&i>=0;i--){
//cout<<p[i].x<<' '<<p[i].y<<' '<<sz[p[i].x]<<' '<<sz[p[i].y]<<endl;
now=now*ny[sz[p[i].y]]%mod;
f[p[i].x]=p[i].x;sz[p[i].x]=p[i].size;sz[p[i].y]-=sz[p[i].x];
now=now*sz[p[i].x]%mod*sz[p[i].y]%mod;
p.pop_back();
}
}
void dfs(int k){
hb(k);
if(tree[k].l==tree[k].r){
ans[tree[k].l]=now;turn(k);
return;
}
dfs(k*2);dfs(k*2+1);
turn(k);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op,&e[i].u,&e[i].v);
if(e[i].u>e[i].v)swap(e[i].u,e[i].v);
ll tmp=(ll)e[i].u*100000+e[i].v;
if(op==1){ls[tmp]=i;e[i].st=i;}
else {
int la=ls[tmp];e[la].ed=i-1;
//ls[tmp]=0;
}
}
build(1,1,m);
for(int i=1;i<=m;i++){
if(e[i].ed==0)e[i].ed=m;
if(e[i].st&&e[i].ed)add(1,e[i].st,e[i].ed,i);
}
for(int i=1;i<=n;i++)ny[i]=work(i,mod-2);
for(int i=1;i<=n;i++)f[i]=i,sz[i]=1;
now=1;dfs(1);
for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);
return 0;
}
地理课(geography)的更多相关文章
- [CSP-S模拟测试]:地理课(并查集+线段树分治)
题目传送门(内部题146) 输入格式 从$geography.in$读入数据. 第一行两个数$n,m$,表示有$n$个点,$m$个时刻.接下来$m$行每行三个数,要么是$1\ u\ v$,要么是$2\ ...
- [考试反思]1112csp-s模拟测试111:二重
还是AK场.考前信心赛? 而且T3的部分分还放反了所有80的都其实只有50. 总算在AK场真正AK了一次... 手感好,整场考试很顺利.要不是因为T3是原题可能就没这么好看了. 20minT1,50m ...
- Linux查看设置系统时区
关于时区的概念,其实初中地理课已经涉及,很多人都多少了解一些,可能只是细节搞不太清楚.为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳,东边的时间也总比西边的早.东边时刻 ...
- ggplot2包--R可视化
1.ggplot2发展历程 ggplot2是Hadley在爱荷华州立大学博士期间的作品,也是他博士论文的主题之一,实际上ggplot2还有个前身ggplot,但后来废弃了,某种程度上这也是Hadley ...
- linux概念之时间与时区
http://www.cnblogs.com/liuyou/archive/2012/07/29/2614338.html Linux时间基准 以上我们了解了RTC(实时时钟.硬件时钟)和OS时钟(系 ...
- 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript
本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...
- [转]100个经典C语言程序(益智类问题)
目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事 ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
- matplotlib等高线图-【老鱼学matplotlib】
等高线图是在地理课中讲述山峰山谷时绘制的图形,在机器学习中也会被用在绘制梯度下降算法的图形中. 因为等高线的图有三个信息:x, y以及x,y所对应的高度值. 这个高度值的计算我们用一个函数来表述: # ...
随机推荐
- 题解 P4613 【[COCI2017-2018#5] Olivander】
话说这道题,作为一个哈迷,是不能错过的 我很惊讶本蒟蒻竟然看得懂题面 好了,闲话少说,这道题,虽说是入门难度,但凭着良心说,它还是一道普及 - 的吧 看到标签,“高性能”,大脑的第一反应是快读. 是不 ...
- 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:
package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...
- 51nod——2487小b和环
dp[ i ][ 0 ] : 第i个位置不取 dp[ i ][ 1 ] : 第i个位置取 这样就可以得到状态转移方程: dp[i][0]=max(max(dp[i][0],dp[i-1][1]),dp ...
- 2018.11.5 Nescafe26 T1 小猫爬山
题目 题目描述 Freda 和 rainbow 饲养了 N 只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们 终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Fre ...
- Oracle问题分析采集数据的方法
1.背景: 运维人员或多或少都会遇到分析问题.分析故障的时候,往往在碰到一些棘手的问题事,我们都会往更深层次的专家进行求助.不管是二线专家还是Oracle全球服务工程师(后文称GCS工程师),往往都会 ...
- 1.在Cisco Packet Tracer里交换机的初始配置
基本拓扑图: 点进交换机,会先进入交换机的用户模式,这个模式下交换机的名称后方会以‘>’显示 输入enable会进入交换机的特权模式,同样在交换机的名称后方以‘#’显示 在特权模式的环境下输入c ...
- 如何使用pyinstaller打包32位的exe
说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位.而64位的exe文件在32位的win7操作系统下是无法执行的,显示不兼容.网上查询发现,简单(可能不方便 ...
- 【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用
通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示iPhone数据 ...
- A1095 Cars on Campus (30)(30 分)
A1095 Cars on Campus (30)(30 分) Zhejiang University has 6 campuses and a lot of gates. From each gat ...
- 【Umezawa's Jitte】真正用起来svn来管理版本
之前用过一次 但是没有真正的用起来 只是知道了一些基本概念 好了 决定开始真正的用这个svn了 参考大神http://www.cnblogs.com/wrmfw/archive/2011/09/08/ ...