noip刷题记录 20170818
天天爱跑步
lca + 树上差分
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std; const int N = 3e5 + , M = 3e5 + ;
int n, m, ans[N], offset;
int ecnt, adj[N], go[M << ], nxt[M << ];
int w[N], dep[N], cnt[N << ], fa[N][];
struct node{
int val, delta;
node(){}
node(int a, int b):val(a), delta(b){}
};
vector<node> tag[N]; inline void addEdge(int u, int v){
nxt[++ecnt] = adj[u], adj[u] = ecnt, go[ecnt] = v;
nxt[++ecnt] = adj[v], adj[v] = ecnt, go[ecnt] = u;
} inline int getLca(int u, int v){
if(dep[u] < dep[v]) swap(u, v);
int delta = dep[u] - dep[v];
for(int i = ; i >= ; i--)
if(( << i) & delta) u = fa[u][i];
if(u == v) return u;
for(int i = ; i >= ; i--)
if(fa[u][i] != fa[v][i])
u = fa[u][i], v = fa[v][i];
return fa[u][];
} inline void dfs(int u, int f){
fa[u][] = f;
for(int i = ; i <= ; i++)
fa[u][i] = fa[fa[u][i - ]][i - ];
for(int e = adj[u], v; e; e = nxt[e]){
v = go[e];
if(v != f){
dep[v] = dep[u] + ;
dfs(v, u);
}
}
} inline void solve(int u){
int cur = cnt[dep[u] + w[u]] + cnt[w[u] - dep[u] + offset];
for(int i = ; i < tag[u].size(); i++)
cnt[tag[u][i].val] += tag[u][i].delta;
for(int e = adj[u], v; e; e = nxt[e]){
if((v = go[e]) == fa[u][]) continue;
solve(v);
}
ans[u] = cnt[dep[u] + w[u]] + cnt[w[u] - dep[u] + offset] - cur;
} inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} int main(){
n = read(), m = read(), offset = * n + ;
for(int i = ; i < n; i++){
int x = read(), y = read();
addEdge(x, y);
}
dfs(, );
for(int i = ; i <= n; i++) w[i] = read();
for(int i = ; i <= m; i++){
int s = read(), t = read(), lca = getLca(s, t);
tag[s].push_back(node(dep[s], ));
tag[t].push_back(node(dep[s] - * dep[lca] + offset, ));
tag[fa[lca][]].push_back(node(dep[s], -));
tag[lca].push_back(node(dep[s] - * dep[lca] + offset, -));
}
solve();
for(int i = ; i <= n; i++) wr(ans[i]), putchar(' ');
return ;
}
借教室
二分法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std; const int N = 1e6 + ;
int n, m, a[N], f[N], s[N], t[N], d[N], ans; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} inline bool check(int mid){
int sum = ;
memset(f, , sizeof f);
for(int i = ; i <= mid; i++)
f[s[i]] += d[i], f[t[i] + ] -= d[i];
for(int i = ; i <= n; i++){
sum += f[i];
if(sum > a[i]) return false;
}
return true;
} int main(){
n = read(), m = read();
for(int i = ; i <= n; i++) a[i] = read();
for(int i = ; i <= m; i++) d[i] = read(), s[i] = read(), t[i] = read();
int l = , r = m;
while(l <= r){
int mid = l + r >> ;
if(check(mid)) l = mid + ;
else ans = mid, r = mid - ;
}
if(ans == ) putchar('');
else{
wr(-), putchar('\n');
wr(ans);
}
return ;
}
线段树
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std; const int N = 1e6 + , oo = 0x3f3f3f3f;
int n, m, minn[N * ], a[N], tag[N * ]; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} inline void build(int k, int l, int r){
if(l == r){
minn[k] = a[l];
return;
}
int mid = l + r >> , lc = k << , rc = k << | ;
build(lc, l, mid);
build(rc, mid + , r);
minn[k] = min(minn[lc], minn[rc]);
} inline void minuss(int k, int v){
minn[k] -= v;
tag[k] += v;
} inline void pushDown(int k){
if(tag[k]){
if(minn[k << ] != -) minuss(k << , tag[k]);
if(minn[k << | ] != -) minuss(k << | , tag[k]);
tag[k] = ;
}
} inline void modify(int k, int l, int r, int x, int y, int v){
if(x <= l && r <= y){
minuss(k, v);
return;
}
pushDown(k);
int mid = l + r >> , lc = k << , rc = k << | , ret = oo;
if(x <= mid) modify(lc, l, mid, x, y, v);
if(y > mid) modify(rc, mid + , r, x, y, v);
minn[k] = min(minn[lc], minn[rc]);
} inline int query(int k, int l, int r, int x, int y){
if(x <= l && r <= y) return minn[k];
pushDown(k);
int mid = l + r >> , lc = k << , rc = k << | , ret = oo;
if(x <= mid) ret = min(ret, query(lc, l, mid, x, y));
if(y > mid) ret = min(ret, query(rc, mid + , r, x, y));
return ret;
} int main(){
n = read(), m = read();
for(int i = ; i <= n; i++) a[i] = read();
memset(minn, -, sizeof tag);
build(, , n);
for(int i = ; i <= m; i++){
int d = read(), s = read(), t = read();
if(s > t) swap(s, t);
// cout<<s<<" "<<t<<" "<<query(1, 1, n, s, t)<<"!!!"<<endl;
if(query(, , n, s, t) < d){
wr(-), putchar('\n'), wr(i);
return ;
}
modify(, , n, s, t, d);
}
wr();
return ;
}
积木大赛
简单分析
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std; const int N = 1e5 + ;
int n, ans, last; int main(){
cin >> n;
for(int i = ; i <= n; i++){
int tmp; cin >> tmp;
if(tmp - last > ) ans += tmp - last;
last = tmp;
}
cout << ans;
return ;
}
Vigenère密码
简单分析 + 模拟
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std; int klen, slen, key[];
char k[], s[], t[]; int main(){
cin >> k >> s;
klen = strlen(k), slen = strlen(s);
for(int i = ; i < klen; i++){
if('a' <= k[i] && k[i] <= 'z')
key[i] = k[i] - 'a';
else key[i] = k[i] - 'A';
}
for(int i = ; i < slen; i++){
if('a' <= s[i] && s[i] <= 'z'){
t[i] = s[i] - key[i % (klen)];
while(t[i] < 'a') t[i] += ;
}
else if('A' <= s[i] && s[i] <= 'Z'){
t[i] = s[i] - key[i % (klen)];
while(t[i] < 'A') t[i] += ;
}
else continue;
putchar(t[i]);
}
return ;
}
花匠
动态规划 + 树状数组优化
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std; const int N = 1e5 + , H = 1e6 + ;
int n, h[N], f[N], g[N], maxh, maxxF[H], maxxG[H], ans; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} inline void uptF(int x, int v){
for(int i = x; i <= maxh; i += (i&(-i)))
maxxF[i] = max(maxxF[i], v);
} inline void uptG(int x, int v){
for(int i = x; i <= maxh; i += (i&(-i)))
maxxG[i] = max(maxxG[i], v);
} inline int queryF(int x){
int ret = ;
for(int i = x; i > ; i-=(i&-i))
ret = max(maxxF[i], ret);
return ret;
} inline int queryG(int x){
int ret = ;
for(int i = x; i > ; i-=(i&-i))
ret = max(ret, maxxG[i]);
return ret;
} int main(){
n = read();
for(int i = ; i <= n; i++) h[i] = read() + , maxh = max(maxh, h[i]);
maxh += ;
for(int i = ; i <= n; i++){
f[i] = max(queryG(h[i] - ) + , f[i]);
g[i] = max(queryF(maxh - h[i] - ) + , g[i]);
uptF(maxh - h[i], f[i]);
uptG(h[i], g[i]);
ans = max(ans, max(f[i], g[i]));
}
wr(ans);
return ;
}
noip刷题记录 20170818的更多相关文章
- noip刷题记录 20170823
独木桥 怎么说呢 #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...
- PE刷题记录
PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- 刷题记录:[HarekazeCTF2019]encode_and_encode
目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...
- 刷题记录:[De1CTF 2019]Giftbox && Comment
目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...
- 刷题记录:[强网杯 2019]Upload
目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...
- 刷题记录:[XNUCA2019Qualifier]EasyPHP
目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...
- 刷题记录:[DDCTF 2019]homebrew event loop
目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...
随机推荐
- 洛谷——P1548 棋盘问题
https://www.luogu.org/problem/show?pid=1548#sub 题目描述 设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(3 ...
- ssh远程执行命令并自动退出
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [ ...
- 2018VMware虚拟机安装Mac OS 10.12.1
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.下载安装中所需的镜像文件以及补丁工具 Mac OS 10.12.1 Sierra (16B2555) 懒人版(下载地址):ht ...
- 【习题 3-1 UVA - 1585】Score
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟水题 [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] #include <bits/stdc++.h ...
- ios 不支持屏幕旋转
- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
- LDD3之并发和竞态-completion(完毕量)的学习和验证
LDD3之并发和竞态-completion(完毕量)的学习和验证 首先说下測试环境: Linux2.6.32.2 Mini2440开发板 一開始难以理解书上的书面语言,这里<linux中同步样例 ...
- js进阶课程 12-9 jquery的事件对象event的方法有哪些?
js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...
- Satisfying memory ordering requirements between partial reads and non-snoop accesses
A method and apparatus for preserving memory ordering in a cache coherent link based interconnect in ...
- 【Python排序搜索基本算法】之拓扑排序
拓扑排序是对有向无环图的一种排序,满足例如以下两个条件: 1.每一个顶点出现且仅仅出现一次. 2.若A在序列中排在B的前面.则在图中不存在从B到A的路径. 如上的无环有向图,v表示顶点:v=['a', ...
- Giraph源代码分析(六)——Edge 分析
HamaWhite 原创,转载请注明出处.欢迎大家增加Giraph 技术交流群: 228591158 欢迎訪问: 西北工业大学 - 大数据与知识管理研究室 (Northwestern Polytech ...