UOJ309 UNR #2 排兵布阵
包含不小于$\sqrt n$列的只有不大于$\sqrt n$行,修改时这些行打标记,否则暴力更新,操作一列的时候暴力更新这些行。合并没啥影响直接搞就是了。更新需要访问位置,感觉必须用哈希表,并不是特别靠谱。平均复杂度$O(n\sqrt n)$。
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
int n2;
inline void upd2(int&a,int b){
a<b?a=b:0;
}
struct vec{
int s,d;
gp_hash_table<int,int>w;
vec(){s=d=0;}
void ins(int i,int e){
auto j=w.find(i);
if(w.end()==j)w[i]=e-d;
else
upd2(j->second,e-d);
upd2(s,e);
}
};
gp_hash_table<int,vec>f[2];
gp_hash_table<int,int>g[2];
gp_hash_table<int,null_type>h[2];
void dev(int k,int x){
auto&a=f[k][x];
for(int y:h[k^1]){
auto&b=f[k^1][y];
auto i=b.w.find(x);
if(b.w.end()!=i)
a.ins(y,i->second+b.d);
}
}
int sol5(int k,int x){
if(h[k].end()==h[k].find(x))
dev(k,x);
return f[k][x].s;
}
int ask(int k,int x){
return g[k].end()!=g[k].find(x)?sol5(k,g[k][x]):0;
}
void inc(int k,int x,int d){
auto&a=f[k][x];
if(h[k].end()==h[k].find(x)){
dev(k,x);
for(auto&e:a.w){
e.second+=d;
f[k^1][e.first].ins(x,e.second);
}
}else{
a.d+=d;
for(int y:h[k^1]){
auto&b=f[k^1][y];
auto i=b.w.find(x);
if(b.w.end()!=i){
i->second+=d;
upd2(b.s,i->second+b.d);
}
}
}
a.s+=d;
}
void sol4(int k,int x,int nx){
g[k][nx]=g[k][x];
g[k].erase(x);
}
void sol3(int k,int x,int nx){
auto&a=f[k][x],&b=f[k][nx];
if(h[k].end()==h[k].find(x))
dev(k,x);
for(auto e:a.w){
auto&c=f[k^1][e.first];
upd2(c.w[nx],e.second+a.d-c.d);
c.w.erase(x);
b.ins(e.first,e.second+a.d);
}
if(h[k].erase(x)||b.w.size()>n2){
h[k].insert(nx);
dev(k,nx);
}
}
void sol2(int k,int x,int nx){
sol3(k,g[k][x],g[k][nx]);
g[k].erase(x);
}
void sol1(int k,int x,int nx){
if(f[k][g[k][x]].w.size()<=f[k][g[k][nx]].w.size())
sol2(k,x,nx);
else{
sol2(k,nx,x);
sol4(k,x,nx);
}
}
void mov(int k,int x,int nx){
if(x!=nx)
(g[k].end()!=g[k].find(nx)?sol1:sol4)(k,x,nx);
}
int main(){
int n,m,x,y,d;
char o[8];
scanf("%d",&n);
n2=sqrt(n+.5);
while(n--){
scanf("%d%d%d",&x,&y,&d);
f[0][x].ins(y,d);
f[1][y].ins(x,d);
g[0][x]=x;
g[1][y]=y;
}
for(int k=0;k<2;++k)
for(auto&e:f[k])
if(e.second.w.size()>n2)
h[k].insert(e.first);
scanf("%d",&m);
while(m--){
scanf("%s%d",o,&x);
int k=*o=='Y';
if(o[1]=='Q')
printf("%d\n",ask(k,x));
else{
scanf("%d",&d);
if(g[k].end()!=g[k].find(x))
o[1]=='M'?mov(k,x,x+d):inc(k,g[k][x],d);
}
}
}
UOJ309 UNR #2 排兵布阵的更多相关文章
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- HDU 4539 郑厂长系列故事——排兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...
- 郑厂长系列故事——排兵布阵 hdu4539(状态压缩DP)
郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- [BJOI2019]排兵布阵——分组背包
题目链接: [BJOI2019]排兵布阵 对于每座堡垒,将$s$个对手排序,显然如果安排的兵力能打败第$i$个对手就一定能打败前$i-1$个. 那么对于第$i$座城堡,可以看做有$s+1$个物品(可以 ...
- [BJOI2019]排兵布阵(动态规划)
[BJOI2019]排兵布阵(动态规划) 题面 洛谷 题解 暴力dp: 设\(f[i][j]\)表示考虑到了第\(i\)座城市用了\(j\)人的最大收益,枚举在这个城市用多少人就可以了. 优化: 发现 ...
- HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)
郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...
- HDU 4539 郑厂长系列故事——排兵布阵 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...
- HDU 4539 郑厂长系列故事——排兵布阵 —— 状压DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Ot ...
- 洛谷 P1911 L国的战斗之排兵布阵
P1911 L国的战斗之排兵布阵 题目背景 L国即将与I国发动战争!! 题目描述 L国的指挥官想让他的每一个军营都呈现出国徽形——“L”形(方向无所谓).当然,他的指挥营除外(这叫做个性),他想不出该 ...
随机推荐
- window.open 打开子窗体,关闭全部的子窗体
需求:通过window.open方法打开了子窗体,当关闭主窗体时.子窗体应当也关闭. 实现思路: 1.打开子窗体函数window.open(url,winName)的第二个參数winName能够唯一标 ...
- asp .net 为图片添加文字水印(内包含有加图片水印的方法) .
在项目中先创建一个Imag_writer 类库 在该类库下分别创建两个枚举类型WaterMarkType (水印的类型).WaterMarkPosition (水印的位置).代码如下: using S ...
- 为Redmine的项目加上起止时间
没有时间约束的项目不是好项目. 要给项目配置起止时间,须要用到自己定义属性. 我们须要管理员身份登录.才干够定义自己定义属性. 自己定义属性 看图吧,先是点击页面导航条(最上面那排菜单,有主页.我的工 ...
- Hadoop 服务器配置的副本数量 管不了客户端
副本数由客户端的参数dfs.replication决定(优先级: conf.set > 自定义配置文件 > jar包中的hdfs-default.xml)如果前两个都没有,就用最后一个ja ...
- C语言各种keyword
1.register 在函数内定义变量时.默认是 auto 类型,变量存储在内存中,当程序用到该变量时,由控制器发出指令将内存中该变量的值送到运算器,计算结束后再从运算器将数据送到内存.假设一个变量用 ...
- git 下载与Linux源码安装最新版
win: https://git-for-windows.github.io/ 或 https://git-scm.com/downloads 官网! 源码安装git Git 的工作需要调用 ...
- ffmpeg下载rtmp flv
ffmpeg -i rtmp://shanghai.chinatax.gov.cn:1935/fmsApp/16a0148f117.flv -c copy dump.flv
- SDWebImage学习
SDWebImage学习 SDWebImage版本是:'4.2.2' SDWebImage是iOS开发中常用的图片加载的库,能下载并缓存图片.这次就着重介绍SDWebImage的特色功能:下载与缓存. ...
- IOS8 UIAlertController 弹框
本文转载至 http://blog.csdn.net/jinkaiouyang/article/details/35551769 IOS8中,Apple将UIActionSheet和UIAlertVi ...
- 【BZOJ1520】[POI2006]Szk-Schools KM算法
[BZOJ1520][POI2006]Szk-Schools Description Input Output 如果有可行解, 输出最小代价,否则输出NIE. Sample Input 5 1 1 2 ...