博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018 Multi-University Training Contest 4-Glad You Came(hdu 6356)
阅读量:6037 次
发布时间:2019-06-20

本文共 2339 字,大约阅读时间需要 7 分钟。

一、思路

线段树维护一个区间最小值,然后对于每次操作,做区间更新即可。要注意的是,在更新的时候,记得剪枝:如果当前更新的值$v \le minv$(minv为当前线段树节点所管辖区间的最小值),直接返回。否则,TLE。运行时间1500+ms,比标程2800+ms快将近两倍。

二、代码

 

#include
using namespace std;#define min(x, y) (x < y ? x : y)#define max(x, y) (x > y ? x : y)#define MAXN 100100unsigned X, Y, Z;struct node { int mv, lazy;} data[MAXN * 4];int n, m;inline void down(int rt) { if(data[rt].lazy) { int lch = rt << 1, rch = rt << 1 | 1; if(data[lch].lazy < data[rt].lazy)data[lch].lazy = data[rt].lazy; if(data[lch].mv < data[rt].lazy)data[lch].mv = data[rt].lazy; if(data[rch].lazy < data[rt].lazy)data[rch].lazy = data[rt].lazy; if(data[rch].mv < data[rt].lazy)data[rch].mv = data[rt].lazy; data[rt].lazy = 0; }}inline void update(int ul, int ur, int v, int rt = 1, int l = 1, int r = n) { if(l > ur || r < ul)return; if(v <= data[rt].mv)return; if(l >= ul && r <= ur) { if(data[rt].mv < v)data[rt].mv = v, data[rt].lazy = v; return; } down(rt); int mid = (l + r) >> 1; update(ul, ur, v, rt << 1, l, mid); update(ul, ur, v, rt << 1 | 1, mid + 1, r); data[rt].mv = min(data[rt << 1].mv, data[rt << 1 | 1].mv);}inline int query(int x, int rt = 1, int l = 1, int r = n) { if(l == r)return data[rt].mv; down(rt); int mid = (l + r) >> 1; if(x <= mid)return query(x, rt << 1, l, mid); else return query(x, rt << 1 | 1, mid + 1, r);}inline unsigned rng61() { X ^= X << 11; X ^= X >> 4; X ^= X << 5; X ^= X >> 14; unsigned W = X ^ Y ^ Z; X = Y; Y = Z; Z = W; return Z;}int main() {// freopen("1007.in", "r", stdin);// freopen("1007.out", "w", stdout); int T, mod = (1 << 30) - 1; scanf("%d", &T); for(int ca = 0; ca < T; ++ca) { scanf("%d%d%u%u%u", &n, &m, &X, &Y, &Z); memset(data, 0, sizeof(data[0]) * ((n << 2) + 5)); for(int jj = 0; jj < m; ++jj) { unsigned f1 = rng61(), f2 = rng61(); if(f1 >= n)f1 %= n; if(f2 >= n)f2 %= n; int ul = f1 + 1, ur = f2 + 1, v = rng61() & mod; if(ul > ur)swap(ul, ur); update(ul, ur, v); } long long ans = 0; for(int i = 1; i <= n; ++i)ans ^= 1LL * i * query(i); printf("%lld\n", ans); } return 0;}

 

转载于:https://www.cnblogs.com/fuzhihong0917/p/9436369.html

你可能感兴趣的文章
ios扩展机制objc_setAssociatedObject,objc_getAssociatedObject
查看>>
批量添加-fno-objc-arc
查看>>
二叉树的层序遍历
查看>>
os模块
查看>>
安装 matplotlib
查看>>
css伪类(:before和:after)
查看>>
react native TypeError network request failed
查看>>
PLSQL锁表之后改如何操作
查看>>
Sql注入、文件上传与手机品牌信息抓取解决方案
查看>>
SQLServer跨库查询--分布式查询[转载]
查看>>
django错误-NoReverseMatch at /admin/
查看>>
Laravel中的信息验证 和 语言包
查看>>
折半查找法(二分查找 java版)
查看>>
工作两周年—--个人知识体系梳理
查看>>
win2003开启telnet
查看>>
php配置文件php.ini中文详解
查看>>
关于Tomcat配置相关总结
查看>>
安装PDO_MYSQL遇到的问题:error: Cannot find MySQL header files under
查看>>
CocoaPods最新安装及跳过pod setup快速安装教程
查看>>
必须用C模拟OS?
查看>>