天天爱跑步

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的更多相关文章

  1. noip刷题记录 20170823

    独木桥 怎么说呢 #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...

  2. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  3. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  4. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  5. 刷题记录:[HarekazeCTF2019]encode_and_encode

    目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...

  6. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  7. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  8. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

  9. 刷题记录:[DDCTF 2019]homebrew event loop

    目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...

随机推荐

  1. PythonOOP面向对象编程2

    编程语言的特征: 继承 封装 多态 如:C++ / Java / Python / Swift / C# inheritance 继承 drived 派生 概念: 继承是指从已有的类中衍生出新类,新类 ...

  2. HTTP--Request Headers及Cookies

    简介: HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他的请求头.大多数请求头并不是必需的,但Content-L ...

  3. 得到INI文件所有Section(所有节点名称)

    char SectionNames[MAX_PATH],*pSectionName; ZeroMemory(SectionNames,MAX_PATH); GetPrivateProfileSecti ...

  4. 【Codeforces Round #185 (Div. 2) C】The Closest Pair

    [链接] 链接 [题意] 让你构造n个点,去hack一种求最近点对的算法. [题解] 让x相同. 那么那个剪枝就不会起作用了. [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] # ...

  5. php二维数组中的查找(善于利用基础函数)

    php二维数组中的查找(善于利用基础函数) 一.总结 真没必要完整的写函数,善于借用 1.array_search()是在以为数组中来找,现在我们要在二维数组数组中来,肯定要借用这个 2.!==fal ...

  6. Behavioral模式之Memento模式

    1.意图 在不破坏封装性的前提下,捕获一个对象的内部状态.并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. 2.别名 Token 3.动机 有时候有必要记录一个对象的内部状态.为 ...

  7. WordPress通过插件发送邮件

    原文发表自我的个人站点,欢迎大家訪问~转载请保留本段,或注明原文链接:http://www.hainter.com/wordpress-send-email-via-plugins WordPress ...

  8. hash_map原理及C++实现

    一.数据结构:hash_map原理  hash_map基于hash table(哈希表).哈希表最大的长处,就是把数据的存储和查找消耗的时间大大减少,差点儿能够看成是常数时间:而代价不过消耗比較多的内 ...

  9. C#生成6位随机验证码

    private string VerifyCode() { Random random = new Random(); , ).ToString(); }

  10. Home界面的启动

    继上篇文章Launcher进程的启动,我们继续分析Home界面的启动. public final class ActivityThread { ...... public static final v ...