感觉E思路明确只用了stl+树状数组,F线段树复合修改,为什么都是2400。
A. Life of a Flower
B. Array Eversion
C. Minimize Distance
E. Frequency Queries
F. Non-equal Neighbours
F : 首先 dp[i][j]=sum[dp[i−1]]−dp[i−1][j]dp[i][j] = sum[dp[i-1]] - dp[i-1][j]dp[i][j]=sum[dp[i−1]]−dp[i−1][j],但这样是∑i=1na[i]\sum_{i=1}^na[i]∑i=1na[i], 然后线段树优化。
具体和Transformation HDU - 4578一样
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <set>
#define mid (l+r>>1)
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2e5 + 10, mod = 998244353;int val[N<<5], ls[N<<5] ,rs[N<<5], idx = 0, lazy1[N<<5];
bool lazy2[N<<5];
int root;void add_tage(int &u, int l, int r, LL x, bool f) // Transformation HDU - 4578 的简化版;
{if(!u) u = ++idx; if(f) val[u] = 0, lazy1[u] = 0, lazy2[u] = f;if(x) val[u] = (val[u] + x*(r-l+1))%mod, lazy1[u] = (lazy1[u] + x)%mod;
}
void push_down(int u, int l, int r)
{if(!lazy1[u]&&!lazy2[u]) return ;add_tage(ls[u], l, mid, lazy1[u], lazy2[u]);add_tage(rs[u], mid+1, r, lazy1[u], lazy2[u]);lazy1[u] = lazy2[u] = 0;
}
void push_up(int u){val[u] = (val[ls[u]]+val[rs[u]])%mod;}void modify(int &u, int l, int r, int L, int R, int x, bool f)
{if(!u)u = ++idx;if(L <= l&& R >= r)add_tage(u, l, r, x, f);else{push_down(u, l, r);if(L <= mid) modify(ls[u], l, mid, L, R, x, f);if(R > mid) modify(rs[u], mid+1, r, L, R, x, f);push_up(u);}
}int main()
{int n;scanf("%d", &n);for(int i = 1;i <= 1;i ++) // 额,为了看着好看; {int x;scanf("%d", &x);modify(root, 1, 1e9+1, 1, x, -1, 0); // r = 1e9+1 的原因是 下面的x+1,好像x=1e9有问题吧。 }for(int i = 2;i <= n;i ++){int x;scanf("%d", &x);LL sum = -val[root];modify(root, 1, 1e9+1, 1, x, sum, 0);modify(root, 1, 1e9+1, x+1, 1e9+1, 0, 1);}val[root] = (val[root]+mod)%mod; if(n&1) val[root] = (mod-val[root])%mod; // 这里面正负不会搞,照着test7和test3 d的; // 具体是n是奇数的话总和等于-ans,偶数等于ans,但是另一种正负要这么写取模; cout<<val[root]<<endl;return 0;
}
E : 简单stl应用 + 离线
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <set>
#define mid (l+r>>1)
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e6 + 10, mod = 998244353;int tr[N], a[N], n, q, ans[N], time[N];
set<int> se[N];
vector<pair<int,PII> > Q[N];
vector<int> G[N];void add(int u, int f){while(u <= n)tr[u]+=f,u+=lowbit(u);}
int quary(int u){int ans = 0;while(u)ans+=tr[u],u-=lowbit(u);return ans;}
void dfs(int u)
{if(time[a[u]])se[time[a[u]]].erase(a[u]), add(time[a[u]], -1);time[a[u]] ++;se[time[a[u]]].insert(a[u]); add(time[a[u]], 1);for(auto x:Q[u]){int id = x.first, m = x.second.first, t = x.second.second;int sum = quary(m-1)+t, l = 1, r = n;if(quary(n) < sum){ans[id] = -1; continue;}while(l < r)if(quary(mid)>=sum)r = mid;else l = mid+1;ans[id] = *se[l].begin();}for(auto x:G[u])dfs(x);se[time[a[u]]].erase(a[u]); add(time[a[u]], -1);time[a[u]] --;if(time[a[u]])se[time[a[u]]].insert(a[u]), add(time[a[u]], 1);
}int main()
{int t;scanf("%d", &t);while(t --){scanf("%d%d", &n, &q);for(int i = 1;i <= n;i ++)scanf("%d", a+i), G[i].clear(), tr[i] = time[i] = 0, se[i].clear(), Q[i].clear();for(int i = 2;i <= n;i ++){int p;scanf("%d", &p);G[p].push_back(i);}for(int i = 1;i <= q;i ++){int v, l, k;scanf("%d%d%d", &v, &l, &k);Q[v].push_back({i, {l, k}});}dfs(1);for(int i = 1;i <= q;i ++)printf("%d ", ans[i]);puts("");}return 0;
}
B : 我傻逼了,哎最近比它大的数的位置直接遍历就行,我还排个序。。
SB代码SB代码SB代码
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#define mid (l + r >> 1)
#define lowbit(x) (x & -x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 3e5 + 10, mod = 998244353;PII a[N];
int ma[N];int main()
{int t;scanf("%d", &t);while(t --){int n;scanf("%d", &n);for(int i = 1;i <= n;i ++){scanf("%d", &a[i].first);a[i].second = i;}a[n+1] = {0, 0};sort(a+1, a+n+1);int h = n;for(int i = n;i >= 1;i --){if(a[i].first == a[i+1].first) ma[i] = ma[i+1];else ma[i] = h;if(a[i].second > a[h].second) h = i;if(a[i].second == n){int ans = 0;while(i < n){ans ++;i = ma[i];}cout<<ans<<endl;break;}} }return 0;
}
超简单代码超简单代码超简单代码
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#define mid (l + r >> 1)
#define lowbit(x) (x & -x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 3e5 + 10, mod = 998244353;int a[N];int main()
{int t;scanf("%d", &t);while(t --){int n;scanf("%d", &n);for(int i = 1;i <= n;i ++)scanf("%d", a+i);int ans = 0, ma = a[n];for(int i = n-1;i >= 1;i --)if(a[i] > ma){ma = a[i];ans ++;}cout<<ans<<endl;}return 0;
}
C : 直接算 + 边界
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#define mid (l + r >> 1)
#define lowbit(x) (x & -x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 3e5 + 10, mod = 998244353;int a[N];int main()
{int t;scanf("%d", &t);while(t --){int n, k;LL ans = 0;scanf("%d%d", &n, &k);for(int i = 1;i <= n;i ++)scanf("%d", a+i);sort(a+1, a+n+1);for(int i = 1;i <= n;ans -= a[i], i += k)if(a[i] > 0)break;for(int i = n;i >= 1;ans += a[i], i -= k)if(a[i] < 0)break;ans = ans*2 - max(-a[1], a[n]);cout<<ans<<endl;}return 0;
}
A : 模拟
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#define mid (l + r >> 1)
#define lowbit(x) (x & -x)
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 3e5 + 10, mod = 998244353;int main()
{int t;scanf("%d", &t);while(t --){int n, ans = 1, now = 0;scanf("%d", &n);for(int i = 1;i <= n;i ++){int x;scanf("%d", &x);if(ans == -1)continue;if(x) ans += now == i-1&&now?5:1, now = i;else if(now == i-2)ans = -1;}cout<<ans<<endl;}return 0;
}