BZOJ3526 [Poi2014]Card 【线段树】
2024-09-04 11:56:28
题目链接
题解
思来想去,发现很显然可以用线段树维护
每个区间保存所有合法方案的左右端点【当左端点一定是,右端点当然存最小的那个就行了】
这么整的数,\(\frac{1}{1000}\)的概率啊23333
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define ls (u << 1)
#define rs (u << 1 | 1)
using namespace std;
const int maxn = 200005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int ln[maxn << 2][2],rn[maxn << 2][2],cnt[maxn << 2];
int a[maxn],b[maxn],n,m;
void upd(int u){
if (!cnt[ls] || !cnt[rs]) cnt[u] = 0;
else {
cnt[u] = 0;
for (int i = 0; i < cnt[ls]; i++){
int r = INF;
for (int j = 0; j < cnt[rs]; j++){
if (rn[ls][i] <= ln[rs][j])
r = min(r,rn[rs][j]);
}
if (r < INF){
ln[u][cnt[u]] = ln[ls][i];
rn[u][cnt[u]] = r;
cnt[u]++;
}
}
}
}
void build(int u,int l,int r){
if (l == r){
cnt[u] = 2;
ln[u][0] = rn[u][0] = a[l];
ln[u][1] = rn[u][1] = b[l];
return;
}
int mid = l + r >> 1;
build(ls,l,mid);
build(rs,mid + 1,r);
upd(u);
}
void modify(int u,int l,int r,int pos,cp v){
if (l == r){
cnt[u] = 2;
ln[u][0] = rn[u][0] = v.first;
ln[u][1] = rn[u][1] = v.second;
return;
}
int mid = l + r >> 1;
if (mid >= pos) modify(ls,l,mid,pos,v);
else modify(rs,mid + 1,r,pos,v);
upd(u);
}
void print(int u,int l,int r){
if (l == r){
printf("(%d,%d) ",ln[u][0],ln[u][1]);
return;
}
int mid = l + r >> 1;
print(ls,l,mid); print(rs,mid + 1,r);
}
int main(){
n = read();
REP(i,n) a[i] = read(),b[i] = read();
build(1,1,n);
m = read();
int c,d;
while (m--){
//print(1,1,n); puts("");
c = read(); d = read();
modify(1,1,n,c,mp(a[d],b[d]));
modify(1,1,n,d,mp(a[c],b[c]));
swap(a[c],a[d]); swap(b[c],b[d]);
puts(cnt[1] ? "TAK" : "NIE");
}
return 0;
}
最新文章
- C#设计模式系列:单一职责原则(Single Responsibility Principle)
- jQuery动画特效实例教程
- 学习codeIgniter的一点小感受
- 借助阿里AntUI元素实现两个Web页面之间的过渡——“Loading…”
- java与javac版本不一致问题
- linux下如何查看主机的外网ip地址
- eclipse注册码生成,在eclipse3.3.x上测试可用
- Windows环境下Android NDK环境搭建
- window—BAT脚本
- PE基金的运作模式有哪些?
- url语法
- hdu 4630 查询[L,R]区间内任意两个数的最大公约数
- bat脚本+diskpart 脚本实现自动划分磁盘分区
- Puppet主机、模块、类、资源、变量、参数、标签命名规范
- cxGrid用法-最新
- 自定义延时关闭弹窗,替代MesssageBox
- javascript DOM扩展querySelector()和和querySelectorAll()
- 基于zabbix的Redis、Sentinel、Slave多实例自动发现监控
- mysql &; vs2013
- 软件工程 part4 评价3作品 修改
热门文章
- 安装MySQLdb模块遭遇";fatal error: my_config.h: No such file or directory";的处理
- 第四模块:网络编程进阶&;数据库开发 第2章&#183;MySQL数据库开发
- lintcode491 回文数
- JavaScript 之 对象/JSON/数组
- 加密SecurityHelper
- Reject Inference: Your Data is Deceiving You
- 自测之Lesson14:多线程编程
- Thunder团队第六周 - Scrum会7
- 《剑指offer》---两个栈实现队列
- MVC4 DropDownList (一) — 使用方法