题面

题解

我们把每个地雷向它能炸到的地雷连边,不难发现同一个强联通分量里的点只要一个炸全炸

那么我们缩点,首先所有入度为\(0\)的强联通分量中必须得选一个地雷炸掉,而入度不为\(0\)的强联通分量绝对会被某个入度为\(0\)的点连锁反应给炸掉,所以不用考虑

于是对于每个入度为\(0\)的点开一个\(set\),维护里面的所有\(c_i\),从每个\(set\)里取出最小的加入答案,修改也没问题了,于是有\(50\)分了

然而现在的问题是边数太多了,题解的做法是用线段树优化连边,于是就可以\(AC\)了

然而咱太菜了,并不会线段树优化连边,于是考虑了一个比较扯淡的办法

我们先把所有点按坐标排序,然后两两之间先把该连的边都连上

对于每个点,向左向右找到它最远能扩展的点,分别连边

一点正确性都没有,然而咱交上去竟然有\(60\)分

于是咱受到了鼓励,改了改,如果当前点和最远能拓展到的点之间的点数不超过\(10\),那当前点直接把所有该连的都连了,否则就从这中间随机选取\(10\)个点连边

交上去竟然\(A\)了

反正是\(IOI\)赛制调参也方便

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
inline int abs(R int x){return x<0?-x:x;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R ll x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=1e5+5,M=6e6+5;
struct eg{int v,nx;}e[M];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int dfn[N],low[N],col[N],st[N],p[N],r[N],c[N],deg[N];
int tim,n,q,top,cnt,x,y;multiset<int>s[N];ll ans;
void tarjan(int u){
dfn[u]=low[u]=++tim,st[++top]=u;
go(u)if(!dfn[v]){
tarjan(v),cmin(low[u],low[v]);
}else if(!col[v])cmin(low[u],dfn[v]);
if(dfn[u]==low[u]){
for(++cnt;st[top+1]!=u;--top)col[st[top]]=cnt;
}
}
struct node{
int p,id;
node(){}
node(int p,int id):p(p),id(id){}
friend bool operator <(const node &a,const node &b){return a.p<b.p;}
}a[N];
void add_edge(){
fp(i,1,n)a[i]=node(p[i],i);
sort(a+1,a+1+n);
fp(i,2,n-1){
if(abs(a[i].p-a[i-1].p)<=r[a[i].id])add(a[i].id,a[i-1].id);
if(abs(a[i].p-a[i+1].p)<=r[a[i].id])add(a[i].id,a[i+1].id);
}
if(abs(a[n].p-a[n-1].p)<=r[a[n].id])add(a[n].id,a[n-1].id);
if(abs(a[1].p-a[2].p)<=r[a[1].id])add(a[1].id,a[2].id);
fp(i,1,n){
int j=upper_bound(a+1,a+1+n,node(a[i].p+r[a[i].id],0))-a-1;
if(j!=i){
add(a[i].id,a[j].id);
if(j!=i+1){
if(j-i+1<=10){
fp(k,i+1,j-1)add(a[i].id,a[k].id);
}else{
int T=10;
while(T--){
int id=rand()%(j-i-1)+1+i;
add(a[i].id,a[id].id);
}
}
}
}
}
fp(i,1,n)a[i]=node(-p[i],i);
sort(a+1,a+1+n);
fp(i,1,n){
int j=upper_bound(a+1,a+1+n,node(a[i].p+r[a[i].id],0))-a-1;
if(j!=i){
add(a[i].id,a[j].id);
if(j!=i+1){
if(j-i+1<=10){
fp(k,i+1,j-1)add(a[i].id,a[k].id);
}else{
int T=10;
while(T--){
int id=rand()%(j-i-1)+1+i;
add(a[i].id,a[id].id);
}
}
}
}
}
}
int main(){
srand(time(0));
// freopen("testdata.in","r",stdin);
freopen("mines.in","r",stdin);
freopen("mines.out","w",stdout);
n=read(),q=read();
fp(i,1,n)p[i]=read(),r[i]=read(),c[i]=read();
// fp(i,1,n)fp(j,1,n)if(i!=j&&abs(p[i]-p[j])<=r[i])add(i,j);
add_edge();
fp(i,1,n)if(!dfn[i])tarjan(i);
fp(u,1,n)go(u)if(col[u]!=col[v])++deg[col[v]];
fp(i,1,n)if(!deg[col[i]])s[col[i]].insert(c[i]);
fp(i,1,cnt)ans+=*s[i].begin();
while(q--){
x=read(),y=read();
if(!deg[col[x]]){
ans-=*s[col[x]].begin();
s[col[x]].erase(s[col[x]].lower_bound(c[x]));
c[x]=y;
s[col[x]].insert(c[x]);
ans+=*s[col[x]].begin();
}
print(ans);
}
return Ot(),0;
}

jzoj6001. 【PKUWC2019模拟2019.1.15】Mines (tarjan)的更多相关文章

  1. jzoj6002. 【PKUWC2019模拟2019.1.15】Permutation (组合数)

    题面 题解 设\(lim=(n-1)/2\)(这里是下取整),那么\(x\)位置的值最大不能超过\(lim\),而\(y\)处的值不能小于\(y\),于是有\[Ans=\sum_{i=1}^{lim} ...

  2. jzoj6005. 【PKUWC2019模拟2019.1.17】数学 (生成函数+FFT+抽代+高精)

    题面 题解 幸好咱不是在晚上做的否则咱就不用睡觉了--都什么年代了居然还会出高精的题-- 先考虑如果暴力怎么做,令\(G(x)\)为\(F(n,k)\)的生成函数,那么不难发现\[G^R(x)=\pr ...

  3. jzoj6004. 【PKUWC2019模拟2019.1.17】集合 (组合数学)

    题面 题解 这种题目就是要好好推倒 我们枚举最小的数是哪一个,那么答案就是\[Ans=\sum_{i=1}^nT^i{n-i\choose k-1}\] 因为有\[\sum_{i=p}^n{n-i\c ...

  4. 6359. 【NOIP2019模拟2019.9.15】小ω的树(tree)(定期重构)

    题目描述 题解 qy的毒瘤题 CSP搞这种码农题当场手撕出题人 先按照边权从大到小建重构树,然后40%暴力修改+查找即可 100%可以定期重构+平衡规划,每次把B个询问拉出来建虚树,在虚树上暴力维护每 ...

  5. [JZOJ6359] 【NOIP2019模拟2019.9.15】小ω的树

    题目 题目大意 给你一棵树,带点权和边权. 要你选择一个联通子图,使得点权和乘最小边权最大. 支持修改点权操作. 思考历程 显然,最先想到的当然是重构树了-- 重构树就是在做最大生成树的时候,当两个联 ...

  6. 6358. 【NOIP2019模拟2019.9.15】小ω的仙人掌

    题目 题目大意 给你一串二元组\((a_i,b_i)\)的数列. 求最小的区间\([l,r]\)长度,满足\([l,r]\)中的每个二元组选或不选,使得\(\sum a_i=w\)且\(\sum b_ ...

  7. JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动

    5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms  ...

  8. Data truncation: Incorrect datetime value: 'May 15, 2019 4:15:37 PM

    因为系统在windows下测试过是正常的 windows下的jdk+ windows下安装的mysql 全部cases通过 linux下的jdk + windows下安装的mysql 新增和更新,影响 ...

  9. MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)

    本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...

随机推荐

  1. Java基础教程:对象比较排序

    Java基础教程:对象比较排序 转载请标明出处:http://blog.csdn.net/wangtaocsdn/article/details/71500500 有时候需要对对象列表或数组进行排序, ...

  2. myeclipse 安装flex插件后变为中文 修改配置文件切换到英文界面

    解决办法: 1. cmd 敲命令进入安装目录,运行myeclipse.exe -nl en后,启动为英文 在安装目录下新建txt,改名为myeclipse.bat,将上面那行命令写入保存,再发送快捷方 ...

  3. jQuery(expression, [context])

    jQuery(expression, [context])         返回值:jQuery 概述 这个函数接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组元素. jQuery 的 ...

  4. 算法(Algorithms)第4版 练习 1.3.10

    主要思路:和1.3.9相似,只不过运算表达式的生成方式不一样 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数 ...

  5. 分享知识-快乐自己:oracle表分区详解

    从以下几个方面来整理关于分区表的概念及操作: 1)表空间及分区表的概念: 2)表分区的具体作用: 3)表分区的优缺点: 4)表分区的几种类型及操作方法: 5)对表分区的维护性操作: 1):表空间及分区 ...

  6. Eclipse_插件_03_反编译插件_Eclipse Class Decompiler

    一.插件优势 此插件比jd-eclipse更加强大,反编译之后不会像jd-eclipse一样出现注释符号. 二.插件下载地址 1.github https://github.com/cnfree/Ec ...

  7. listen 78

    Struggling Young Readers Like Kindles Kindles, Nooks and other e-readers catch flack for threatening ...

  8. linux命令学习笔记-md5sum 命令详解

    前言 在网络传输.设备之间转存.复制大文件等时,可能会出现传输前后数据不一致的情况.这种情况在网络这种相对更 不稳定的环境中,容易出现.那么校验文件的完整性,也是势在必行的. 使用说明 md5sum命 ...

  9. Gym-101673: A Abstract Art (模板,求多个多边形的面积并)

    手抄码板大法. #include<bits/stdc++.h> using namespace std; #define mp make_pair typedef long long ll ...

  10. MySQL如何计算动销率_20161025

    动销率一般反映在采购管理上,它的公式为:商品动销率=(动销品种数 /仓库总品种数)*100% . 也可以理解为销售的商品数量和仓库库存的商品数量,假如你仓库里有100个品种,在上月销售了50种,动销率 ...