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”形(方向无所谓).当然,他的指挥营除外(这叫做个性),他想不出该 ...
随机推荐
- java单测时的等待模块awaitility
单测时,可以用来等待异步任务完成 在编写自动化测试用例过程中,往往会遇见被测代码有异步或者队列处理的中间过程:如果需要校验这部分结果,必须等待异步操作结束或队列消费完,而这个中间等待的时间是不确定的, ...
- 在Intellij上面导入项目 & AOP示例项目 & AspectJ学习 & Spring AoP学习
为了学习这篇文章里面下载的代码:http://www.cnblogs.com/charlesblc/p/6083687.html 需要用Intellij导入一个已有工程.源文件原始内容也可见:link ...
- 转: Android开发的网络抓包
方法就是在android机器上面安装tcpdump,然后通过-w参数把抓包记录到本地,再把抓到的.cap文件导到pc上面用wireshark来分析.这里步骤非常多,在和后台联调的时候,这个效率是非常低 ...
- Linux/ visual studio 编译使用Poco
1. 下载源码包.在POCO的官方网站下载最新的POCO源码包.http://pocoproject.org/download/index.html2.解压源码包.下载的文件名是“poco-1.6.0 ...
- 8款精美的HTML5图片动画分享
From:http://geek.csdn.net/news/detail/196250 HTML5结合jQuery可以让网页图片变得更加绚丽多彩,比如实现一些图片3D切换.CSS3动画绘制以及各种图 ...
- Allegro基本操作——PCB布线
转:http://blog.sina.com.cn/s/blog_1538bc9470102vyyq.html http://www.elecfans.com/article/80/110/2010/ ...
- h5的复制功能
js+html5实现复制文字按钮 <div> <input type="text" name="guanfangaddress" id=&qu ...
- flume topology design . tier num 分层数目
32:+:1 x:1 x<=8 https://flume.apache.org/FlumeUserGuide.html#flume-topology-design Flume topology ...
- Why containers? Why should we care? 新旧容器的对比
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/ The Old Way to deploy applications ...
- 使用注解来构造IoC容器-转
新手,对于一些觉得有用的东西,直接转过来用了,自己理解的比较肤浅 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<co ...