[luogu4255]公主の#18文明游戏
[luogu4255]公主の#18文明游戏
luogu
发现没有连边,只有删边?
考虑倒着做
开map记M[i][j]表示编号为i的并查集,信仰j的人数
s[i]表示编号为i的并查集的总人数
首先询问的答案就是$$\frac{\binom{M[x][c]}{N}}{\binom{s[x]}{N}}$$
map可以暴力启发式合并,复杂度\(qlog^2n\)
#include<bits/stdc++.h>
using namespace std;
const int _=400005,mod=19260817;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int n,m,q;
int t[_],fa[_],ans[_],s[_],jc[_*10];
bool del[_];
vector<int>r[_];
map<int,int>M[_];
map<int,int>::iterator it;
struct edge{int u,v;}e[_];
struct node{int x,y,c,op;}p[_];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){
x=find(x);y=find(y);
if(x==y)return;
if(M[x].size()<M[y].size())swap(x,y);
fa[y]=x;s[x]+=s[y];
for(it=M[y].begin();it!=M[y].end();++it)
M[x][(*it).first]+=(*it).second;
}
int ksm(int x,int y){
int s=1;
while(y){if(y&1)s=1ll*x*s%mod;x=1ll*x*x%mod;y>>=1;}
return s;
}
int C(int x,int y){
if(x<y)return 0;
return 1ll*jc[x]*ksm(jc[y],mod-2)%mod*ksm(jc[x-y],mod-2)%mod;
}
int main(){
n=re(),m=re(),q=re();
jc[0]=1;
for(int i=1;i<=4000000;i++)
jc[i]=1ll*jc[i-1]*i%mod;
for(int i=1;i<=n;i++)
s[i]=re(),M[i][re()]=s[i];
for(int i=1;i<=m;i++){
int u=re(),v=re();
e[i]=(edge){u,v};t[i]=q;
}
for(int i=1;i<=q;i++){
int op,x,y,c;
op=re();
if(op==1){
x=re(),y=re(),c=re();
p[i]=(node){x,y,c};
s[x]+=y;M[x][c]+=y;
}
if(op==2){
x=re();t[x]=min(t[x],i);del[i]=1;
}
if(op==3){
x=re(),y=re(),c=re();
p[i]=(node){x,y,c,1};
}
}
for(int i=1;i<=m;i++)
r[t[i]].push_back(i);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=q;i>=1;i--){
for(int j=0,sz=r[i].size();j<sz;j++){
int id=r[i][j];
merge(e[id].u,e[id].v);
}
if(del[i])continue;
if(!p[i].op){
int x=find(p[i].x);
s[x]-=p[i].y;
M[x][p[i].c]-=p[i].y;
}
else{
int x=find(p[i].x);
ans[i]=1ll*C(M[x][p[i].c],p[i].y)*ksm(C(s[x],p[i].y),mod-2)%mod;
}
}
for(int i=1;i<=q;i++)
if(p[i].op)printf("%d\n",ans[i]);
return 0;
}
[luogu4255]公主の#18文明游戏的更多相关文章
- [Python设计模式] 第18章 游戏角色备份——备忘录模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用代码模拟以下场景,一个游戏角色有生命力,攻击力,防御力等数据,在打Bos ...
- JSK 18: 跳跃游戏
题目描述 给定一个非负整数数组,假定你的初始位置为数组第一个下标. 数组中的每个元素代表你在那个位置能够跳跃的最大长度. 请确认你是否能够跳跃到数组的最后一个下标. 例如:$A = [2,3,1,1, ...
- Atitit 游戏的原理与概论attilax总结
Atitit 游戏的原理与概论attilax总结 1. 游戏历史2 1.1.1. 盘点PC游戏史上最重要的50款游戏2 1.1.2. 回味人类文明进程 五款经典的历史游戏2 2. 游戏类型(主要分为6 ...
- Cocos2d-x 3.x游戏开发之旅
Cocos2d-x 3.x游戏开发之旅 钟迪龙 著 ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...
- C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...
- 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明
题目描述 “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...
- Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...
- Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5 第1章 熟悉Unity软件的操作 第2章 打地鼠 (已看) ...
- C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例
C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例 Unity中循环遍历每一个数据,并做出推断 非常多时候.游戏在玩家做出推断以后.游戏程序会遍历玩家身上大量的所需数据,然后做出推断. ...
随机推荐
- redis学习笔记——内存映射数据结构
内存映射数据结构 解决问题:当一个对象包含的元素数量并不多,或者元素本身的体积并不大时,使用代价高昂的内部数据结构并不是最好的办法. 内存映射数据结构是一系列经过特殊编码的字节序列,创建它们所消耗的内 ...
- MSSQL数据库导入导出大全二(SQL语句)
Excel文件导入数据库多个Sheet if exists(select 1 from sysobjects where name=N'p_import_excel' and type='P')dro ...
- Unity3D 中脚本执行的先后顺序
Unity3D本身自带有控制脚本执行先后顺序的方法: Edit ---> Project Settings ---> Script Execution Order ---> 值越小 ...
- Android学习(十六) 通过GestureOverlayView进行手势识别
一.使用GestureOverlayView进行手势识别: 1.使用Gestures Builder生成手势文件,Gestures Builder为SDK中的示例项目,使用new-->Other ...
- react-native 组件默认属性(defaultProps) 及 属性类型验证(PropTypes)
1.所有的属性类型 2.代码 import PropTypes from 'prop-types'; type Props = {}; export default class App extends ...
- mongo: 删
删除:remove db.CollectionName.remove(查询表达式,选项); 查询表达式:匹配要删除的文档,它是一个json对象 选项:{justOne:true/false},是否只删 ...
- Android SDK Manager 下载SDK失败的解决办法
摘要:本文记录了无法使用Android SDK Manager下载SDK开发包的解决办法. 最近需要进行android应用程序的开发工作,在android官网下载了adt-bundle-linux- ...
- Android使用Fragment打造万能页面切换框架
首先我们来回顾一下传统用Activity进行的页面切换.activity之间切换.首先须要新建intent对象,给该对象设置一些必须的參数,然后调用startActivity方法进行页面跳转. 假设须 ...
- logstash5安装并实现mariadb数据写入到elasticsearch
java环境这里默认安装了 ,一般源码安装,这里就不说了 一.安装logstash 安装logstash可以用yum安装,也可以用源码安装: yum安装: 1.导入GPG: rpm --import ...
- 手动建立storybook
1. Add @storybook/react npm i --save-dev @storybook/react 2. Add react, react-dom, and babel-core np ...